Browse Source

first push

master
jefry 3 years ago
commit
9c25e77733
50 changed files with 12274 additions and 0 deletions
  1. +139
    -0
      .gitignore
  2. +5
    -0
      .strapi-updater.json
  3. +57
    -0
      README.md
  4. +5
    -0
      config/admin.js
  5. +7
    -0
      config/api.js
  6. +122
    -0
      config/cron-tasks.js
  7. +13
    -0
      config/database.js
  8. +22
    -0
      config/middlewares.js
  9. +13
    -0
      config/server.js
  10. +9
    -0
      ecosystem.config.js
  11. +10
    -0
      env-sample
  12. BIN
      favicon.ico
  13. +31
    -0
      package.json
  14. +4
    -0
      public/uploads/.gitignore
  15. +2
    -0
      server.js
  16. +35
    -0
      src/admin/app.example.js
  17. +9
    -0
      src/admin/webpack.config.example.js
  18. +26
    -0
      src/api/clear-monthly/content-types/clear-monthly/schema.json
  19. +9
    -0
      src/api/clear-monthly/controllers/clear-monthly.js
  20. +9
    -0
      src/api/clear-monthly/routes/clear-monthly.js
  21. +9
    -0
      src/api/clear-monthly/services/clear-monthly.js
  22. +31
    -0
      src/api/company/content-types/company/schema.json
  23. +9
    -0
      src/api/company/controllers/company.js
  24. +9
    -0
      src/api/company/routes/company.js
  25. +9
    -0
      src/api/company/services/company.js
  26. +31
    -0
      src/api/division/content-types/division/schema.json
  27. +9
    -0
      src/api/division/controllers/division.js
  28. +9
    -0
      src/api/division/routes/division.js
  29. +9
    -0
      src/api/division/services/division.js
  30. +20
    -0
      src/api/editable/content-types/editable/schema.json
  31. +9
    -0
      src/api/editable/controllers/editable.js
  32. +9
    -0
      src/api/editable/routes/editable.js
  33. +9
    -0
      src/api/editable/services/editable.js
  34. +111
    -0
      src/api/material/content-types/material/schema.json
  35. +237
    -0
      src/api/material/controllers/material.js
  36. +20
    -0
      src/api/material/routes/custom-material.js
  37. +9
    -0
      src/api/material/routes/material.js
  38. +9
    -0
      src/api/material/services/material.js
  39. +40
    -0
      src/api/participant/content-types/participant/schema.json
  40. +9
    -0
      src/api/participant/controllers/participant.js
  41. +9
    -0
      src/api/participant/routes/participant.js
  42. +9
    -0
      src/api/participant/services/participant.js
  43. +28
    -0
      src/api/pintar-summary/content-types/pintar-summary/schema.json
  44. +9
    -0
      src/api/pintar-summary/controllers/pintar-summary.js
  45. +9
    -0
      src/api/pintar-summary/routes/pintar-summary.js
  46. +9
    -0
      src/api/pintar-summary/services/pintar-summary.js
  47. +77
    -0
      src/extensions/users-permissions/content-types/user/schema.json
  48. +47
    -0
      src/extensions/users-permissions/strapi-server.js
  49. +20
    -0
      src/index.js
  50. +10923
    -0
      yarn.lock

+ 139
- 0
.gitignore View File

@@ -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

+ 5
- 0
.strapi-updater.json View File

@@ -0,0 +1,5 @@
{
"latest": "4.3.2",
"lastUpdateCheck": 1659378281443,
"lastNotification": 1659378281391
}

+ 57
- 0
README.md View File

@@ -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>

+ 5
- 0
config/admin.js View File

@@ -0,0 +1,5 @@
module.exports = ({ env }) => ({
auth: {
secret: env('ADMIN_JWT_SECRET', '3d807cb6c632053150f8ff603613d91d'),
},
});

+ 7
- 0
config/api.js View File

@@ -0,0 +1,7 @@
module.exports = {
rest: {
defaultLimit: 25,
maxLimit: 100,
withCount: true,
},
};

+ 122
- 0
config/cron-tasks.js View File

@@ -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',
},
},
};

+ 13
- 0
config/database.js View File

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

+ 22
- 0
config/middlewares.js View File

@@ -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',
];

+ 13
- 0
config/server.js View File

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

+ 9
- 0
ecosystem.config.js View File

@@ -0,0 +1,9 @@
module.exports = {
apps: [
{
name: 'strapi_saturday_sharing',
script: 'npm',
args: 'start',
},
],
};

+ 10
- 0
env-sample View File

@@ -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

BIN
favicon.ico View File

Before After

+ 31
- 0
package.json View File

@@ -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"
}

+ 4
- 0
public/uploads/.gitignore View File

@@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

+ 2
- 0
server.js View File

@@ -0,0 +1,2 @@
const strapi = require('@strapi/strapi');
strapi().start();

+ 35
- 0
src/admin/app.example.js View File

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

+ 9
- 0
src/admin/webpack.config.example.js View File

@@ -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;
};

+ 26
- 0
src/api/clear-monthly/content-types/clear-monthly/schema.json View File

@@ -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
}
}
}

+ 9
- 0
src/api/clear-monthly/controllers/clear-monthly.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* clear-monthly controller
*/

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::clear-monthly.clear-monthly');

+ 9
- 0
src/api/clear-monthly/routes/clear-monthly.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* clear-monthly router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::clear-monthly.clear-monthly');

+ 9
- 0
src/api/clear-monthly/services/clear-monthly.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* clear-monthly service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::clear-monthly.clear-monthly');

+ 31
- 0
src/api/company/content-types/company/schema.json View File

@@ -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"
}
}
}

+ 9
- 0
src/api/company/controllers/company.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* company controller
*/

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::company.company');

+ 9
- 0
src/api/company/routes/company.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* company router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::company.company');

+ 9
- 0
src/api/company/services/company.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* company service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::company.company');

+ 31
- 0
src/api/division/content-types/division/schema.json View File

@@ -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"
}
}
}

+ 9
- 0
src/api/division/controllers/division.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* division controller
*/

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::division.division');

+ 9
- 0
src/api/division/routes/division.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* division router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::division.division');

+ 9
- 0
src/api/division/services/division.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* division service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::division.division');

+ 20
- 0
src/api/editable/content-types/editable/schema.json View File

@@ -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
}
}
}

+ 9
- 0
src/api/editable/controllers/editable.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* editable controller
*/

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::editable.editable');

+ 9
- 0
src/api/editable/routes/editable.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* editable router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::editable.editable');

+ 9
- 0
src/api/editable/services/editable.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* editable service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::editable.editable');

+ 111
- 0
src/api/material/content-types/material/schema.json View File

@@ -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
}
}
}

+ 237
- 0
src/api/material/controllers/material.js View File

@@ -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!');
}
},
}));

+ 20
- 0
src/api/material/routes/custom-material.js View File

@@ -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": []
}
},
]
}

+ 9
- 0
src/api/material/routes/material.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* material router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::material.material');

+ 9
- 0
src/api/material/services/material.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* material service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::material.material');

+ 40
- 0
src/api/participant/content-types/participant/schema.json View File

@@ -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"
}
}
}

+ 9
- 0
src/api/participant/controllers/participant.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* participant controller
*/

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::participant.participant');

+ 9
- 0
src/api/participant/routes/participant.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* participant router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::participant.participant');

+ 9
- 0
src/api/participant/services/participant.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* participant service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::participant.participant');

+ 28
- 0
src/api/pintar-summary/content-types/pintar-summary/schema.json View File

@@ -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"
}
}
}

+ 9
- 0
src/api/pintar-summary/controllers/pintar-summary.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* pintar-summary controller
*/

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::pintar-summary.pintar-summary');

+ 9
- 0
src/api/pintar-summary/routes/pintar-summary.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* pintar-summary router.
*/

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::pintar-summary.pintar-summary');

+ 9
- 0
src/api/pintar-summary/services/pintar-summary.js View File

@@ -0,0 +1,9 @@
'use strict';

/**
* pintar-summary service.
*/

const { createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::pintar-summary.pintar-summary');

+ 77
- 0
src/extensions/users-permissions/content-types/user/schema.json View File

@@ -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"
}
}
}

+ 47
- 0
src/extensions/users-permissions/strapi-server.js View File

@@ -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;
};

+ 20
- 0
src/index.js View File

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

+ 10923
- 0
yarn.lock
File diff suppressed because it is too large
View File


Loading…
Cancel
Save