@@ -0,0 +1,139 @@ | |||
############################ | |||
# OS X | |||
############################ | |||
.cache/* | |||
build/* | |||
.DS_Store | |||
.AppleDouble | |||
.LSOverride | |||
Icon | |||
.Spotlight-V100 | |||
.Trashes | |||
._* | |||
.env | |||
############################ | |||
# Linux | |||
############################ | |||
*~ | |||
############################ | |||
# Windows | |||
############################ | |||
Thumbs.db | |||
ehthumbs.db | |||
Desktop.ini | |||
$RECYCLE.BIN/ | |||
*.cab | |||
*.msi | |||
*.msm | |||
*.msp | |||
############################ | |||
# Packages | |||
############################ | |||
*.7z | |||
*.csv | |||
*.dat | |||
*.dmg | |||
*.gz | |||
*.iso | |||
*.jar | |||
*.rar | |||
*.tar | |||
*.zip | |||
*.com | |||
*.class | |||
*.dll | |||
*.exe | |||
*.o | |||
*.seed | |||
*.so | |||
*.swo | |||
*.swp | |||
*.swn | |||
*.swm | |||
*.out | |||
*.pid | |||
############################ | |||
# Logs and databases | |||
############################ | |||
.tmp | |||
*.log | |||
*.sql | |||
*.sqlite | |||
############################ | |||
# Misc. | |||
############################ | |||
*# | |||
.idea | |||
nbproject | |||
.vscode/ | |||
############################ | |||
# Node.js | |||
############################ | |||
lib-cov | |||
lcov.info | |||
pids | |||
logs | |||
results | |||
build | |||
node_modules | |||
.node_history | |||
package-lock.json | |||
**/package-lock.json | |||
!docs/package-lock.json | |||
*.heapsnapshot | |||
############################ | |||
# Tests | |||
############################ | |||
testApp | |||
coverage | |||
cypress/screenshots | |||
cypress/videos | |||
############################ | |||
# Documentation | |||
############################ | |||
dist | |||
############################ | |||
# Builds | |||
############################ | |||
packages/generators/app/files/public/ | |||
schema.graphql | |||
############################ | |||
# Example app | |||
############################ | |||
.dev | |||
# *.cache | |||
############################ | |||
# Visual Studio Code | |||
############################ | |||
front-workspace.code-workspace | |||
.yarn | |||
.yarnrc |
@@ -0,0 +1,5 @@ | |||
{ | |||
"latest": "4.3.2", | |||
"lastUpdateCheck": 1659378281443, | |||
"lastNotification": 1659378281391 | |||
} |
@@ -0,0 +1,57 @@ | |||
# 🚀 Getting started with Strapi | |||
Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html) (CLI) which lets you scaffold and manage your project in seconds. | |||
### `develop` | |||
Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-develop) | |||
``` | |||
npm run develop | |||
# or | |||
yarn develop | |||
``` | |||
### `start` | |||
Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-start) | |||
``` | |||
npm run start | |||
# or | |||
yarn start | |||
``` | |||
### `build` | |||
Build your admin panel. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-build) | |||
``` | |||
npm run build | |||
# or | |||
yarn build | |||
``` | |||
## ⚙️ Deployment | |||
Strapi gives you many possible deployment options for your project. Find the one that suits you on the [deployment section of the documentation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment.html). | |||
## 📚 Learn more | |||
- [Resource center](https://strapi.io/resource-center) - Strapi resource center. | |||
- [Strapi documentation](https://docs.strapi.io) - Official Strapi documentation. | |||
- [Strapi tutorials](https://strapi.io/tutorials) - List of tutorials made by the core team and the community. | |||
- [Strapi blog](https://docs.strapi.io) - Official Strapi blog containing articles made by the Strapi team and the community. | |||
- [Changelog](https://strapi.io/changelog) - Find out about the Strapi product updates, new features and general improvements. | |||
Feel free to check out the [Strapi GitHub repository](https://github.com/strapi/strapi). Your feedback and contributions are welcome! | |||
## ✨ Community | |||
- [Discord](https://discord.strapi.io) - Come chat with the Strapi community including the core team. | |||
- [Forum](https://forum.strapi.io/) - Place to discuss, ask questions and find answers, show your Strapi project and get feedback or just talk with other Community members. | |||
- [Awesome Strapi](https://github.com/strapi/awesome-strapi) - A curated list of awesome things related to Strapi. | |||
--- | |||
<sub>🤫 Psst! [Strapi is hiring](https://strapi.io/careers).</sub> |
@@ -0,0 +1,5 @@ | |||
module.exports = ({ env }) => ({ | |||
auth: { | |||
secret: env('ADMIN_JWT_SECRET', '3d807cb6c632053150f8ff603613d91d'), | |||
}, | |||
}); |
@@ -0,0 +1,7 @@ | |||
module.exports = { | |||
rest: { | |||
defaultLimit: 25, | |||
maxLimit: 100, | |||
withCount: true, | |||
}, | |||
}; |
@@ -0,0 +1,122 @@ | |||
const fs = require('fs') | |||
var moment = require('moment'); // require | |||
module.exports = { | |||
myJob: { | |||
task: async ({ strapi }) => { | |||
var clearOptions = await strapi.entityService.findOne('api::clear-monthly.clear-monthly', 1, { | |||
fields: ['Active','Every','LastClearedAt'], | |||
}); | |||
if(!clearOptions||!clearOptions.LastClearedAt){ | |||
if(!clearOptions){ | |||
strapi.entityService.create('api::clear-monthly.clear-monthly', { | |||
data: {Active:false,LastClearedAt:'1000-01-01',Every:1}, | |||
}); | |||
} | |||
else{ | |||
try{ | |||
strapi.entityService.update('api::clear-monthly.clear-monthly', 1, { | |||
data: {LastClearedAt:'1000-01-01'}, | |||
}); | |||
} | |||
catch(e){ | |||
strapi.entityService.create('api::article.article', { | |||
data: {Active:false,LastClearedAt:'1000-01-01',Every:1}, | |||
}); | |||
} | |||
} | |||
clearOptions = {Active:false,LastClearedAt:'1000-01-01',Every:1}; | |||
} | |||
if(clearOptions.Active){ | |||
var present = moment(); | |||
if(present.diff(moment(clearOptions.LastClearedAt,'YYYY-MM-DD'), 'months')>=(clearOptions.Every||1)){ | |||
console.log('scheduled cleaning'); | |||
var now = new Date(); | |||
now.setMonth(now.getMonth()-clearOptions.Every); | |||
const entries = await strapi.entityService.findMany('api::material.material', { | |||
sort: { createdAt: 'DESC' }, | |||
filters: { | |||
$and: [ | |||
{ | |||
Cleared:false | |||
}, | |||
{ | |||
createdAt: { $lte: moment(now).format('YYYY-MM-DD')}, | |||
} | |||
], | |||
}, | |||
populate:['Video', 'Images','Attachments'] | |||
}); | |||
var errorCount = 0; | |||
if(entries&& entries.length>0){ | |||
var clearMaterial = {}; | |||
entries.forEach(element => { | |||
var deleteFiles = []; | |||
if(element.Video){ | |||
deleteFiles.push(element.Video.hash); | |||
} | |||
if(element.Attachments){ | |||
element.Attachments.forEach(el=>{ | |||
deleteFiles.push(el.hash); | |||
}); | |||
} | |||
if(element.Images){ | |||
element.Images.forEach(el=>{ | |||
deleteFiles.push(el.hash); | |||
}); | |||
} | |||
clearMaterial[element.id] = deleteFiles; | |||
}); | |||
var listFiles = []; | |||
fs.readdirSync("./public/uploads").forEach(file => { | |||
listFiles.push(file); | |||
}); | |||
Object.keys(clearMaterial).forEach((i)=>{ | |||
clearMaterial[i].forEach(name=>{ | |||
var files = listFiles.filter(file=>file.includes(name)); | |||
files.forEach(file=>{ | |||
try { | |||
fs.unlinkSync("./public/uploads/"+file); | |||
} catch(err) { | |||
console.log("Error deleting file",err); | |||
errorCount++; | |||
} | |||
}); | |||
}); | |||
// update id disini | |||
strapi.entityService.update('api::material.material', i, { | |||
data: { | |||
Cleared:true, | |||
publishedAt:null | |||
}, | |||
}); | |||
}); | |||
} | |||
else{ | |||
strapi.entityService.update('api::clear-monthly.clear-monthly', 1, { | |||
data: { | |||
LastClearedAt:moment().format('YYYY-MM-DD'), | |||
}, | |||
}); | |||
} | |||
if(errorCount==0){ | |||
strapi.entityService.update('api::clear-monthly.clear-monthly', 1, { | |||
data: { | |||
LastClearedAt:moment().format('YYYY-MM-DD'), | |||
}, | |||
}); | |||
} | |||
} | |||
} | |||
}, | |||
options: { | |||
rule: '*/10 * * * * *', | |||
tz: 'Asia/Bangkok', | |||
}, | |||
}, | |||
}; |
@@ -0,0 +1,13 @@ | |||
module.exports = ({ env }) => ({ | |||
connection: { | |||
client: 'mysql', | |||
connection: { | |||
host: env('DATABASE_HOST', '127.0.0.1'), | |||
port: env.int('DATABASE_PORT', 3306), | |||
database: env('DATABASE_NAME', 'saturday_sharing'), | |||
user: env('DATABASE_USERNAME', 'root'), | |||
password: env('DATABASE_PASSWORD', 'root'), | |||
ssl: env.bool('DATABASE_SSL', false), | |||
}, | |||
}, | |||
}); |
@@ -0,0 +1,22 @@ | |||
module.exports = [ | |||
'strapi::errors', | |||
'strapi::security', | |||
'strapi::cors', | |||
'strapi::poweredBy', | |||
'strapi::logger', | |||
'strapi::query', | |||
{ | |||
name: "strapi::body", | |||
config: { | |||
formLimit: "400mb", // modify form body | |||
jsonLimit: "400mb", // modify JSON body | |||
textLimit: "400mb", // modify text body | |||
formidable: { | |||
maxFileSize: 400 * 1024 * 1024, // multipart data, modify here limit of uploaded file size | |||
}, | |||
}, | |||
}, | |||
'strapi::session', | |||
'strapi::favicon', | |||
'strapi::public', | |||
]; |
@@ -0,0 +1,13 @@ | |||
const cronTasks = require("./cron-tasks"); | |||
module.exports = ({ env }) => ({ | |||
host: env('HOST', '0.0.0.0'), | |||
port: env.int('PORT', 1337), | |||
app: { | |||
keys: ['ASGHH324SD#','DAHJSWABBS@#'], | |||
}, | |||
cron: { | |||
enabled: true, | |||
tasks: cronTasks, | |||
}, | |||
}); |
@@ -0,0 +1,9 @@ | |||
module.exports = { | |||
apps: [ | |||
{ | |||
name: 'strapi_saturday_sharing', | |||
script: 'npm', | |||
args: 'start', | |||
}, | |||
], | |||
}; |
@@ -0,0 +1,10 @@ | |||
HOST=0.0.0.0 | |||
PORT=14013 | |||
APP_KEYS=ztOFvZRqR/InbliRWD2uFw==,oExf98ZTPhimcgqoiuZ+0w==,WW/KxpnhbR4SiI4kulADAQ==,QRFwTeW2bgJ3b30FrGdg3A== | |||
JWT_SECRET=06b5ce94-ac34-492e-aebe-26a9c81072a0 | |||
API_TOKEN_SALT=5e11367d5567a97bacbe1cca6c7fc688 | |||
DATABASE_HOST=127.0.0.1 | |||
DATABASE_PORT=3306 | |||
DATABASE_NAME=saturday_sharing | |||
DATABASE_USERNAME=root | |||
DATABASE_PASSWORD=admin |
@@ -0,0 +1,31 @@ | |||
{ | |||
"name": "backend-saturday-sharing", | |||
"private": true, | |||
"version": "0.1.0", | |||
"description": "A Strapi application", | |||
"scripts": { | |||
"develop": "strapi develop", | |||
"start": "strapi start", | |||
"build": "strapi build", | |||
"strapi": "strapi" | |||
}, | |||
"dependencies": { | |||
"@strapi/plugin-graphql": "^4.1.8", | |||
"@strapi/plugin-i18n": "4.1.8", | |||
"@strapi/plugin-users-permissions": "4.1.8", | |||
"@strapi/strapi": "4.1.8", | |||
"moment": "^2.29.3", | |||
"mysql": "2.18.1" | |||
}, | |||
"author": { | |||
"name": "A Strapi developer" | |||
}, | |||
"strapi": { | |||
"uuid": "86799444-98d5-4bbb-9d9a-fb3b7a628e79" | |||
}, | |||
"engines": { | |||
"node": ">=12.x.x <=16.x.x", | |||
"npm": ">=6.0.0" | |||
}, | |||
"license": "MIT" | |||
} |
@@ -0,0 +1,4 @@ | |||
# Ignore everything in this directory | |||
* | |||
# Except this file | |||
!.gitignore |
@@ -0,0 +1,2 @@ | |||
const strapi = require('@strapi/strapi'); | |||
strapi().start(); |
@@ -0,0 +1,35 @@ | |||
export default { | |||
config: { | |||
locales: [ | |||
// 'ar', | |||
// 'fr', | |||
// 'cs', | |||
// 'de', | |||
// 'dk', | |||
// 'es', | |||
// 'he', | |||
// 'id', | |||
// 'it', | |||
// 'ja', | |||
// 'ko', | |||
// 'ms', | |||
// 'nl', | |||
// 'no', | |||
// 'pl', | |||
// 'pt-BR', | |||
// 'pt', | |||
// 'ru', | |||
// 'sk', | |||
// 'sv', | |||
// 'th', | |||
// 'tr', | |||
// 'uk', | |||
// 'vi', | |||
// 'zh-Hans', | |||
// 'zh', | |||
], | |||
}, | |||
bootstrap(app) { | |||
console.log(app); | |||
}, | |||
}; |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/* eslint-disable no-unused-vars */ | |||
module.exports = (config, webpack) => { | |||
// Note: we provide webpack above so you should not `require` it | |||
// Perform customizations to webpack config | |||
// Important: return the modified config | |||
return config; | |||
}; |
@@ -0,0 +1,26 @@ | |||
{ | |||
"kind": "singleType", | |||
"collectionName": "clear_monthlies", | |||
"info": { | |||
"singularName": "clear-monthly", | |||
"pluralName": "clear-monthlies", | |||
"displayName": "Clear_Monthly", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": false | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"Every": { | |||
"type": "integer" | |||
}, | |||
"LastClearedAt": { | |||
"type": "date" | |||
}, | |||
"Active": { | |||
"type": "boolean", | |||
"default": false | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* clear-monthly controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
module.exports = createCoreController('api::clear-monthly.clear-monthly'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* clear-monthly router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::clear-monthly.clear-monthly'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* clear-monthly service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::clear-monthly.clear-monthly'); |
@@ -0,0 +1,31 @@ | |||
{ | |||
"kind": "collectionType", | |||
"collectionName": "companies", | |||
"info": { | |||
"singularName": "company", | |||
"pluralName": "companies", | |||
"displayName": "Company", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": false | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"Name": { | |||
"type": "string" | |||
}, | |||
"divisions": { | |||
"type": "relation", | |||
"relation": "manyToMany", | |||
"target": "api::division.division", | |||
"mappedBy": "companies" | |||
}, | |||
"materials": { | |||
"type": "relation", | |||
"relation": "oneToMany", | |||
"target": "api::material.material", | |||
"mappedBy": "company" | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* company controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
module.exports = createCoreController('api::company.company'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* company router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::company.company'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* company service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::company.company'); |
@@ -0,0 +1,31 @@ | |||
{ | |||
"kind": "collectionType", | |||
"collectionName": "divisions", | |||
"info": { | |||
"singularName": "division", | |||
"pluralName": "divisions", | |||
"displayName": "Division", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": false | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"Name": { | |||
"type": "string" | |||
}, | |||
"companies": { | |||
"type": "relation", | |||
"relation": "manyToMany", | |||
"target": "api::company.company", | |||
"inversedBy": "divisions" | |||
}, | |||
"materials": { | |||
"type": "relation", | |||
"relation": "oneToMany", | |||
"target": "api::material.material", | |||
"mappedBy": "division" | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* division controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
module.exports = createCoreController('api::division.division'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* division router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::division.division'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* division service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::division.division'); |
@@ -0,0 +1,20 @@ | |||
{ | |||
"kind": "singleType", | |||
"collectionName": "editables", | |||
"info": { | |||
"singularName": "editable", | |||
"pluralName": "editables", | |||
"displayName": "Editable", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": false | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"Active": { | |||
"type": "boolean", | |||
"default": false | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* editable controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
module.exports = createCoreController('api::editable.editable'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* editable router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::editable.editable'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* editable service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::editable.editable'); |
@@ -0,0 +1,111 @@ | |||
{ | |||
"kind": "collectionType", | |||
"collectionName": "materials", | |||
"info": { | |||
"singularName": "material", | |||
"pluralName": "materials", | |||
"displayName": "Material", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": true | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"Title": { | |||
"type": "string" | |||
}, | |||
"Description": { | |||
"type": "text" | |||
}, | |||
"Name": { | |||
"type": "string" | |||
}, | |||
"Video": { | |||
"type": "media", | |||
"multiple": false, | |||
"required": false, | |||
"allowedTypes": [ | |||
"videos" | |||
] | |||
}, | |||
"Images": { | |||
"type": "media", | |||
"multiple": true, | |||
"required": false, | |||
"allowedTypes": [ | |||
"images" | |||
] | |||
}, | |||
"Attachments": { | |||
"type": "media", | |||
"multiple": true, | |||
"required": false, | |||
"allowedTypes": [ | |||
"images", | |||
"files", | |||
"videos", | |||
"audios" | |||
] | |||
}, | |||
"company": { | |||
"type": "relation", | |||
"relation": "manyToOne", | |||
"target": "api::company.company", | |||
"inversedBy": "materials" | |||
}, | |||
"division": { | |||
"type": "relation", | |||
"relation": "manyToOne", | |||
"target": "api::division.division", | |||
"inversedBy": "materials" | |||
}, | |||
"participants": { | |||
"type": "relation", | |||
"relation": "oneToMany", | |||
"target": "api::participant.participant", | |||
"mappedBy": "material" | |||
}, | |||
"Presented": { | |||
"type": "string" | |||
}, | |||
"Cleared": { | |||
"type": "boolean", | |||
"default": false | |||
}, | |||
"Category": { | |||
"type": "enumeration", | |||
"enum": [ | |||
"Pintar", | |||
"Sharing" | |||
] | |||
}, | |||
"pintar_summary": { | |||
"type": "relation", | |||
"relation": "manyToOne", | |||
"target": "api::pintar-summary.pintar-summary", | |||
"inversedBy": "materials" | |||
}, | |||
"Start_Date": { | |||
"type": "date" | |||
}, | |||
"End_Date": { | |||
"type": "date" | |||
}, | |||
"Thumbnail": { | |||
"type": "media", | |||
"multiple": false, | |||
"required": false, | |||
"allowedTypes": [ | |||
"images", | |||
"files", | |||
"videos", | |||
"audios" | |||
] | |||
}, | |||
"By_Admin": { | |||
"type": "boolean", | |||
"default": false | |||
} | |||
} | |||
} |
@@ -0,0 +1,237 @@ | |||
'use strict'; | |||
/** | |||
* material controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
var moment = require('moment'); // require | |||
module.exports = createCoreController('api::material.material',({ strapi }) => ({ | |||
async find(ctx) { | |||
const { data, meta } = await super.find(ctx); | |||
return { data, meta }; | |||
}, | |||
async create(ctx) { | |||
const data = JSON.parse(ctx.request.body.data); | |||
if(data["Start_Date"])data["Start_Date"]= moment(data['Start_Date'],'MM/DD/YYYY').format('YYYY-MM-DD') | |||
if(data["End_Date"])data["End_Date"]= moment(data['End_Date'],'MM/DD/YYYY').format('YYYY-MM-DD') | |||
if(data["Presented"])data["Presented"]= moment(data['Presented'],'MM/DD/YYYY').format('YYYY-MM-DD') | |||
var matPintar; | |||
// if(data.Category == 'Pintar'){ | |||
if(data.withSummary && data.withSummary == 'y'){ | |||
data.By_Admin = true; | |||
const companyName = await strapi.entityService.findOne('api::company.company', data.company); | |||
const divisionName = await strapi.entityService.findOne('api::division.division', data.division); | |||
// console.log(companyName,divisionName); | |||
matPintar = await strapi.entityService.create('api::pintar-summary.pintar-summary', { | |||
data: { | |||
Company : companyName?companyName.Name:data.company, | |||
Division : divisionName?divisionName.Name:data.division, | |||
} | |||
}); | |||
} | |||
if(data.division && data.division != 'All' && data.company && data.company != 'All'){ | |||
if(data.withSummary && data.withSummary == 'y'){ | |||
if(matPintar)data["pintar_summary"] = matPintar.id; | |||
} | |||
ctx.request.body.data = JSON.stringify(data); | |||
const response = await super.create(ctx); | |||
if(response.data.id){ | |||
console.log('participant Luisr',data.ParticipantList); | |||
var participants = (data.ParticipantList) | |||
?(typeof data.ParticipantList == "string")?JSON.parse(data.ParticipantList):data.ParticipantList | |||
:[]; | |||
if(participants && participants.length>0){ | |||
for(var i=0;i<participants.length;i++){ | |||
var item = participants[i]; | |||
var keys = Object.keys(item); | |||
await strapi.query('api::participant.participant').create({ | |||
data: { | |||
Email: item[keys.filter((key)=>key.toUpperCase().includes('EMAIL'))[0]], | |||
Name : item[keys.filter((key)=>key.toUpperCase().includes('NAMA'))[0]], | |||
Division : item[keys.filter((key)=>key.toUpperCase().includes('DIVISI'))[0]], | |||
Company : item[keys.filter((key)=>key.toUpperCase().includes('COMPANY'))[0]], | |||
material : response.data.id | |||
} | |||
}); | |||
} | |||
} | |||
} | |||
return response; | |||
} | |||
else{ | |||
if(data.withSummary && data.withSummary == 'y'){ | |||
if(matPintar)data["pintar_summary"] = matPintar.id; | |||
} | |||
var divFilter = (data.division=='All')?{}:{id:{$eq: data.division,}}; | |||
const entity = await strapi.entityService.findMany('api::division.division', { | |||
fields: ['Name'], | |||
populate: { companies: true }, | |||
filters:divFilter | |||
}); | |||
const companyFilter = data.company; | |||
var response,attachments,thumbnail; | |||
for(var i=0;i<entity.length;i++){ | |||
var companies = entity[i].companies; | |||
if(companyFilter!='All'){ | |||
companies = companies.filter(i=>i.id==data.company); | |||
} | |||
for(var j=0;j<companies.length;j++){ | |||
data.company = companies[j].id; | |||
data.division = entity[i].id; | |||
if(i==0 && j==0){ | |||
ctx.request.body.data = JSON.stringify(data); | |||
// console.log(ctx.request.body.data); | |||
response = await super.create(ctx); | |||
// console.log(response); | |||
const mat = await strapi.entityService.findOne('api::material.material', response.data.id, { | |||
populate:['Thumbnail','Attachments'] | |||
}); | |||
attachments = mat.Attachments.map(i=>i.id); | |||
thumbnail = mat.Thumbnail.id; | |||
} | |||
else{ | |||
data["Attachments"]=attachments; | |||
data["Thumbnail"]=thumbnail; | |||
data['publishedAt'] = moment().format('YYYY-MM-DD'); | |||
response = await strapi.entityService.create('api::material.material',{ | |||
data:data | |||
}).catch(e=>console.log(e)); | |||
} | |||
} | |||
} | |||
return response; | |||
} | |||
}, | |||
async update(ctx) { | |||
const editable = await strapi.entityService.findOne('api::editable.editable', 1, { | |||
fields: ['Active'], | |||
}); | |||
const data = JSON.parse(ctx.request.body.data); | |||
if((editable && editable.Active && data.Category == 'Sharing')|| data.Category == 'Pintar' ){ | |||
const response = await super.update(ctx); | |||
var participants = (typeof data.ParticipantList == "string")?JSON.parse(data.ParticipantList):data.ParticipantList; | |||
if(ctx.params.id &&participants && participants.length>0){ | |||
const entity = await strapi.entityService.findMany('api::participant.participant', { | |||
fields: ['Name'], | |||
filters: { material: ctx.params.id}, | |||
populate: { material: true }, | |||
}); | |||
for(var i=0;i<participants.length;i++){ | |||
var item = participants[i]; | |||
var keys = Object.keys(item); | |||
await strapi.query('api::participant.participant').create({ | |||
data: { | |||
Email: item[keys.filter((key)=>key.toUpperCase().includes('EMAIL'))[0]], | |||
Name : item[keys.filter((key)=>key.toUpperCase().includes('NAMA'))[0]], | |||
Division : item[keys.filter((key)=>key.toUpperCase().includes('DIVISI'))[0]], | |||
Company : item[keys.filter((key)=>key.toUpperCase().includes('COMPANY'))[0]], | |||
material : ctx.params.id | |||
}, | |||
files:ctx.request.files | |||
}); | |||
if(i>=participants.length-1){ | |||
if(entity&& entity.length>0){ | |||
entity.forEach(element => { | |||
strapi.service('api::participant.participant').delete(element.id); | |||
}); | |||
} | |||
} | |||
} | |||
} | |||
return response; | |||
} | |||
else{ | |||
return ctx.badRequest('Material tidak dapat diubah! Minta izin admin terlebih dahulu!'); | |||
} | |||
}, | |||
async delete(ctx) { | |||
const editable = await strapi.entityService.findOne('api::editable.editable', 1, { | |||
fields: ['Active'], | |||
}); | |||
if(editable && editable.Active){ | |||
const response = await super.delete(ctx); | |||
return response; | |||
} | |||
else{ | |||
return ctx.badRequest('Material tidak dapat dihapus! Minta izin admin terlebih dahulu!'); | |||
} | |||
}, | |||
async saveMaterial(ctx) { | |||
const editable = await strapi.entityService.findOne('api::editable.editable', 1, { | |||
fields: ['Active'], | |||
}); | |||
const data = JSON.parse(ctx.request.body.data); | |||
if((editable && editable.Active && data.Category == 'Sharing')|| data.Category == 'Pintar' ){ | |||
const response = await super.update(ctx); | |||
var participants = (typeof data.ParticipantList == "string")?JSON.parse(data.ParticipantList):data.ParticipantList; | |||
if(ctx.params.id &&participants && participants.length>0){ | |||
const entity = await strapi.entityService.findMany('api::participant.participant', { | |||
fields: ['Name'], | |||
filters: { material: ctx.params.id}, | |||
populate: { material: true }, | |||
}); | |||
for(var i=0;i<participants.length;i++){ | |||
var item = participants[i]; | |||
var keys = Object.keys(item); | |||
await strapi.query('api::participant.participant').create({ | |||
data: { | |||
Email: item[keys.filter((key)=>key.toUpperCase().includes('EMAIL'))[0]], | |||
Name : item[keys.filter((key)=>key.toUpperCase().includes('NAMA'))[0]], | |||
Division : item[keys.filter((key)=>key.toUpperCase().includes('DIVISI'))[0]], | |||
Company : item[keys.filter((key)=>key.toUpperCase().includes('COMPANY'))[0]], | |||
material : ctx.params.id | |||
}, | |||
files:ctx.request.files | |||
}); | |||
if(i>=participants.length-1){ | |||
if(entity&& entity.length>0){ | |||
entity.forEach(element => { | |||
strapi.service('api::participant.participant').delete(element.id); | |||
}); | |||
} | |||
} | |||
} | |||
} | |||
return response; | |||
} | |||
else{ | |||
return ctx.badRequest('Material tidak dapat diubah! Minta izin admin terlebih dahulu!'); | |||
} | |||
}, | |||
async resetMaterial(ctx) { | |||
try{if(ctx.params.id){ | |||
await strapi.entityService.update('api::material.material', ctx.params.id, { | |||
data: { | |||
Name:null, | |||
Presented:null, | |||
Images:null, | |||
Video:null, | |||
}, | |||
}); | |||
const entity = await strapi.entityService.findMany('api::participant.participant', { | |||
filters: { material: ctx.params.id}, | |||
populate: { material: true }, | |||
}); | |||
if(entity&& entity.length>0){ | |||
entity.forEach(element => { | |||
strapi.service('api::participant.participant').delete(element.id); | |||
}); | |||
} | |||
return 'OK!'; | |||
} | |||
else{ | |||
return ctx.badRequest('Material tidak ditemukan!'); | |||
}} | |||
catch(e){ | |||
return ctx.badRequest('Material tidak daoat direset!'); | |||
} | |||
}, | |||
})); |
@@ -0,0 +1,20 @@ | |||
module.exports = { | |||
routes: [ | |||
{ // Path defined with a URL parameter | |||
method: 'PUT', | |||
path: '/saveMaterial/:id', | |||
handler: 'material.saveMaterial', | |||
"config": { | |||
"policies": [] | |||
} | |||
}, | |||
{ // Path defined with a URL parameter | |||
method: 'PUT', | |||
path: '/resetMaterial/:id', | |||
handler: 'material.resetMaterial', | |||
"config": { | |||
"policies": [] | |||
} | |||
}, | |||
] | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* material router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::material.material'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* material service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::material.material'); |
@@ -0,0 +1,40 @@ | |||
{ | |||
"kind": "collectionType", | |||
"collectionName": "participants", | |||
"info": { | |||
"singularName": "participant", | |||
"pluralName": "participants", | |||
"displayName": "Participant", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": false | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"Name": { | |||
"type": "string" | |||
}, | |||
"Email": { | |||
"type": "email" | |||
}, | |||
"material": { | |||
"type": "relation", | |||
"relation": "manyToOne", | |||
"target": "api::material.material", | |||
"inversedBy": "participants" | |||
}, | |||
"Company": { | |||
"type": "string" | |||
}, | |||
"Division": { | |||
"type": "string" | |||
}, | |||
"Pre_Score": { | |||
"type": "decimal" | |||
}, | |||
"Post_Score": { | |||
"type": "decimal" | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* participant controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
module.exports = createCoreController('api::participant.participant'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* participant router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::participant.participant'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* participant service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::participant.participant'); |
@@ -0,0 +1,28 @@ | |||
{ | |||
"kind": "collectionType", | |||
"collectionName": "pintar_summaries", | |||
"info": { | |||
"singularName": "pintar-summary", | |||
"pluralName": "pintar-summaries", | |||
"displayName": "Material Summary", | |||
"description": "" | |||
}, | |||
"options": { | |||
"draftAndPublish": false | |||
}, | |||
"pluginOptions": {}, | |||
"attributes": { | |||
"materials": { | |||
"type": "relation", | |||
"relation": "oneToMany", | |||
"target": "api::material.material", | |||
"mappedBy": "pintar_summary" | |||
}, | |||
"Company": { | |||
"type": "string" | |||
}, | |||
"Division": { | |||
"type": "string" | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* pintar-summary controller | |||
*/ | |||
const { createCoreController } = require('@strapi/strapi').factories; | |||
module.exports = createCoreController('api::pintar-summary.pintar-summary'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* pintar-summary router. | |||
*/ | |||
const { createCoreRouter } = require('@strapi/strapi').factories; | |||
module.exports = createCoreRouter('api::pintar-summary.pintar-summary'); |
@@ -0,0 +1,9 @@ | |||
'use strict'; | |||
/** | |||
* pintar-summary service. | |||
*/ | |||
const { createCoreService } = require('@strapi/strapi').factories; | |||
module.exports = createCoreService('api::pintar-summary.pintar-summary'); |
@@ -0,0 +1,77 @@ | |||
{ | |||
"kind": "collectionType", | |||
"collectionName": "up_users", | |||
"info": { | |||
"name": "user", | |||
"description": "", | |||
"singularName": "user", | |||
"pluralName": "users", | |||
"displayName": "User" | |||
}, | |||
"options": { | |||
"draftAndPublish": false, | |||
"timestamps": true | |||
}, | |||
"attributes": { | |||
"username": { | |||
"type": "string", | |||
"minLength": 3, | |||
"unique": true, | |||
"configurable": false, | |||
"required": true | |||
}, | |||
"email": { | |||
"type": "email", | |||
"minLength": 6, | |||
"configurable": false, | |||
"required": true | |||
}, | |||
"provider": { | |||
"type": "string", | |||
"configurable": false | |||
}, | |||
"password": { | |||
"type": "password", | |||
"minLength": 6, | |||
"configurable": false, | |||
"private": true | |||
}, | |||
"resetPasswordToken": { | |||
"type": "string", | |||
"configurable": false, | |||
"private": true | |||
}, | |||
"confirmationToken": { | |||
"type": "string", | |||
"configurable": false, | |||
"private": true | |||
}, | |||
"confirmed": { | |||
"type": "boolean", | |||
"default": false, | |||
"configurable": false | |||
}, | |||
"blocked": { | |||
"type": "boolean", | |||
"default": false, | |||
"configurable": false | |||
}, | |||
"role": { | |||
"type": "relation", | |||
"relation": "manyToOne", | |||
"target": "plugin::users-permissions.role", | |||
"inversedBy": "users", | |||
"configurable": false | |||
}, | |||
"company": { | |||
"type": "relation", | |||
"relation": "oneToOne", | |||
"target": "api::company.company" | |||
}, | |||
"division": { | |||
"type": "relation", | |||
"relation": "oneToOne", | |||
"target": "api::division.division" | |||
} | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
// path: src/extensions/users-permissions/strapi-server.js | |||
module.exports = plugin => { | |||
const sanitizeOutput = (user) => { | |||
const { | |||
password, resetPasswordToken, confirmationToken, ...sanitizedUser | |||
} = user; // be careful, you need to omit other private attributes yourself | |||
return sanitizedUser; | |||
}; | |||
plugin.controllers.user.me = async (ctx) => { | |||
if (!ctx.state.user) { | |||
return ctx.unauthorized(); | |||
} | |||
const user = await strapi.entityService.findOne( | |||
'plugin::users-permissions.user', | |||
ctx.state.user.id, | |||
{ populate: ['role','company','division'] } | |||
); | |||
ctx.body = sanitizeOutput(user); | |||
}; | |||
plugin.controllers.user.findOne = async (ctx) => { | |||
const user = await strapi.entityService.findOne( | |||
'plugin::users-permissions.user', | |||
ctx.params.id, | |||
{ ...ctx.params ,populate: ['role','company','division'], | |||
...ctx.query, | |||
} | |||
); | |||
ctx.body = sanitizeOutput(user); | |||
}; | |||
plugin.controllers.user.find = async (ctx) => { | |||
const users = await strapi.entityService.findMany( | |||
'plugin::users-permissions.user', | |||
{ ...ctx.params, populate: ['role', 'company','division'], | |||
...ctx.query, | |||
} | |||
); | |||
ctx.body = users.map(user => sanitizeOutput(user)); | |||
}; | |||
return plugin; | |||
}; |
@@ -0,0 +1,20 @@ | |||
'use strict'; | |||
module.exports = { | |||
/** | |||
* An asynchronous register function that runs before | |||
* your application is initialized. | |||
* | |||
* This gives you an opportunity to extend code. | |||
*/ | |||
register(/*{ strapi }*/) {}, | |||
/** | |||
* An asynchronous bootstrap function that runs before | |||
* your application gets started. | |||
* | |||
* This gives you an opportunity to set up your data model, | |||
* run jobs, or perform some special logic. | |||
*/ | |||
bootstrap(/*{ strapi }*/) {}, | |||
}; |