| @@ -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 }*/) {}, | |||
| }; | |||