├── .sequelizerc ├── README.md ├── migrations ├── 20230128195917-create-university.js ├── 20230128210831-update-university-model.js ├── 20230128220409-create-campus.js ├── 20230129124456-create-programme.js ├── 20230129210531-create-lead.js ├── 20230129211004-create-programe-details.js ├── 20230130153947-create-applicants.js ├── 20230130154538-create-application-details.js ├── 20230203151011-update-uni-column.js ├── 20230204003147-create-users.js ├── 20230204202846-unnamed-migration.js ├── 20230207192220-create-acctivity.js ├── 20230208183942-create-property.js ├── 20230208191554-create-currency.js ├── 20230209184318-create-branch.js └── 20230209195650-create-roles.js ├── package-lock.json ├── package.json ├── readme.txt ├── seeders └── 20230212195646-add-role.js ├── src ├── api │ ├── controllers │ │ ├── admin │ │ │ ├── activity.controller.js │ │ │ ├── admin.controller.js │ │ │ ├── cms.controller.js │ │ │ ├── contact.controller.js │ │ │ ├── email.controller.js │ │ │ ├── faq.controller.js │ │ │ ├── faqCategories.controller.js │ │ │ ├── newsletter.controller.js │ │ │ ├── roles.controller.js │ │ │ ├── settings.controller.js │ │ │ ├── staff.controller.js │ │ │ └── users.controller.js │ │ ├── front-bk │ │ │ ├── auth.controller.js │ │ │ ├── cms.controller.js │ │ │ ├── contact.controller.js │ │ │ ├── faq.controller.js │ │ │ ├── footer.controller.js │ │ │ ├── settings.controller.js │ │ │ └── users.controller.js │ │ └── front │ │ │ ├── activities.controller.js │ │ │ ├── applicants.controller.js │ │ │ ├── applicationmodulestatus.controller.js │ │ │ ├── backup.controller.js │ │ │ ├── billinginfo.controller.js │ │ │ ├── branch.controller.js │ │ │ ├── commissioninvoice.controller.js │ │ │ ├── commissioninvoiceitem.controller.js │ │ │ ├── costofsales.controller.js │ │ │ ├── currencies.controller.js │ │ │ ├── depitandcredit.controller.js │ │ │ ├── expenses.controller.js │ │ │ ├── generalinvoice.controller.js │ │ │ ├── generalinvoiceitem.controller.js │ │ │ ├── interestedprogram.controller.js │ │ │ ├── invoicemodulestatus.controller.js │ │ │ ├── lead.controller.js │ │ │ ├── leadgroup.controller.js │ │ │ ├── leadsmanagmentmodulestatus.controller.js │ │ │ ├── mailing.controller.js │ │ │ ├── programcategory.controller.js │ │ │ ├── programlevel.controller.js │ │ │ ├── programme.controller.js │ │ │ ├── properties.controller.js │ │ │ ├── qualificationtype.controller.js │ │ │ ├── sales.controller.js │ │ │ ├── test.html │ │ │ ├── university.controller.js │ │ │ ├── universitytype.controller.js │ │ │ └── users.controller.js │ ├── middlewares │ │ ├── error.js │ │ └── front │ │ │ └── auth.js │ ├── models-bk │ │ ├── activity.model.js │ │ ├── admin.model.js │ │ ├── cms.model.js │ │ ├── contact.model.js │ │ ├── email.model.js │ │ ├── faq.model.js │ │ ├── faqCategories.model.js │ │ ├── newsletter.model.js │ │ ├── roles.model.js │ │ ├── settings.model.js │ │ └── users.model.js │ ├── models │ │ ├── acctivity.js │ │ ├── applicants.js │ │ ├── applicationdetails.js │ │ ├── applicationmodulestatus.js │ │ ├── billinginfo.js │ │ ├── branch.js │ │ ├── campus.js │ │ ├── commissioninvoice.js │ │ ├── commissioninvoiceitem.js │ │ ├── costofsales.js │ │ ├── currency.js │ │ ├── depitandcredit.js │ │ ├── expenses.js │ │ ├── generalinvoice.js │ │ ├── generalinvoiceitem.js │ │ ├── index.js │ │ ├── interestedprogram.js │ │ ├── invoicemodulestatus.js │ │ ├── lead.js │ │ ├── leadgroup.js │ │ ├── leadsmanagmentmodulestatus.js │ │ ├── mailinginfo.js │ │ ├── programcategory.js │ │ ├── programedetails.js │ │ ├── programlevel.js │ │ ├── programme.js │ │ ├── property.js │ │ ├── qualificationtype.js │ │ ├── roles.js │ │ ├── sales.js │ │ ├── university.js │ │ ├── universitytype.js │ │ ├── user.js │ │ └── users.js │ ├── routes │ │ └── v1 │ │ │ ├── admin │ │ │ ├── activity.route.js │ │ │ ├── admin.route.js │ │ │ ├── cms.route.js │ │ │ ├── contact.route.js │ │ │ ├── email.route.js │ │ │ ├── faq.route.js │ │ │ ├── faqCategories.route.js │ │ │ ├── index.js │ │ │ ├── newsletter.route.js │ │ │ ├── roles.route.js │ │ │ ├── settings.route.js │ │ │ ├── staff.route.js │ │ │ └── users.route.js │ │ │ ├── front-bk │ │ │ ├── auth.route.js │ │ │ ├── cms.route.js │ │ │ ├── contact.route.js │ │ │ ├── faq.route.js │ │ │ ├── footer.route.js │ │ │ ├── index.js │ │ │ ├── settings.route.js │ │ │ └── users.route.js │ │ │ └── front │ │ │ ├── activities.route.js │ │ │ ├── applicants.route.js │ │ │ ├── applicationmodulestatus.route.js │ │ │ ├── backups.route.js │ │ │ ├── billinginfo.route.js │ │ │ ├── branch.route.js │ │ │ ├── commissioninvoice.route.js │ │ │ ├── commissioninvoiceitem.route.js │ │ │ ├── costofsales.route.js │ │ │ ├── currencies.route.js │ │ │ ├── depitandcredit.route.js │ │ │ ├── expenses.route.js │ │ │ ├── generalinvoice.route.js │ │ │ ├── generalinvoiceitem.route.js │ │ │ ├── index.js │ │ │ ├── interestedprogram.route.js │ │ │ ├── invoicemodulestatus.route.js │ │ │ ├── lead.route.js │ │ │ ├── leadgroup.route.js │ │ │ ├── leadsmanagmentmodulestatus.route.js │ │ │ ├── mailinginfo.route.js │ │ │ ├── programcategory.route.js │ │ │ ├── programlevel.route.js │ │ │ ├── programme.route.js │ │ │ ├── properties.route.js │ │ │ ├── qualificationtype.route.js │ │ │ ├── sales.route.js │ │ │ ├── university.route.js │ │ │ ├── universitytype.route.js │ │ │ └── users.route.js │ └── utils │ │ ├── APIError.js │ │ ├── emails │ │ └── emails.js │ │ ├── upload.js │ │ └── util.js ├── config │ ├── demo.sql │ ├── emailtemplate.json │ ├── errors.js │ ├── express.js │ ├── mongoose.js │ └── vars.js └── index.js └── views └── index.ejs /.sequelizerc: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | "config": path.resolve("./config", "config.json"), 5 | "models-path": path.resolve("./src/api", "models"), 6 | "seeders-path": path.resolve("./", "seeders"), 7 | "migrations-path": path.resolve("./", "migrations"), 8 | }; 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | https://www.figma.com/file/CEnqGfLlMu0MkLXHunXCEU/Figma-to-React-Theme-1?node-id=0%3A1 2 | 3 | https://drive.google.com/file/d/1dlDToyu6XeM8CWA6fCwfffmri7OqsYsn/view 4 | -------------------------------------------------------------------------------- /migrations/20230128195917-create-university.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Universities', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | logo: { 13 | type: Sequelize.STRING 14 | }, 15 | name: { 16 | type: Sequelize.STRING 17 | }, 18 | type:{ 19 | type: Sequelize.STRING 20 | }, 21 | counsellerName: { 22 | type: Sequelize.STRING 23 | }, 24 | phone: { 25 | type: Sequelize.INTEGER 26 | }, 27 | email: { 28 | type: Sequelize.STRING 29 | }, 30 | visaAppFee: { 31 | type: Sequelize.INTEGER 32 | }, 33 | addmissionFee: { 34 | type: Sequelize.INTEGER 35 | }, 36 | qetcFee: { 37 | type: Sequelize.INTEGER 38 | }, 39 | commisionDuration: { 40 | type: Sequelize.INTEGER 41 | }, 42 | createdAt: { 43 | allowNull: false, 44 | type: Sequelize.DATE 45 | }, 46 | updatedAt: { 47 | allowNull: false, 48 | type: Sequelize.DATE 49 | } 50 | }); 51 | }, 52 | async down(queryInterface, Sequelize) { 53 | await queryInterface.dropTable('Universities'); 54 | } 55 | }; -------------------------------------------------------------------------------- /migrations/20230128210831-update-university-model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /** @type {import('sequelize-cli').Migration} */ 4 | module.exports = { 5 | async up(queryInterface, Sequelize) { 6 | // await queryInterface.addColumn("Universities", "utype", { 7 | // type: Sequelize.INTEGER, 8 | // allowNull: true, 9 | // }); 10 | // await queryInterface.addColumn("Universities", "counserllerName", { 11 | // type: Sequelize.INTEGER, 12 | // allowNull: true, 13 | // }); 14 | // await queryInterface.addColumn("Universities", "phone", { 15 | // type: Sequelize.INTEGER, 16 | // allowNull: true, 17 | // }); 18 | // await queryInterface.addColumn("Universities", "email", { 19 | // type: Sequelize.STRING, 20 | // allowNull: true, 21 | // }); 22 | // // 23 | // await queryInterface.addColumn("Universities", "visaAppFee", { 24 | // type: Sequelize.INTEGER, 25 | // allowNull: true, 26 | // }); 27 | // await queryInterface.addColumn("Universities", "addmissionFee", { 28 | // type: Sequelize.INTEGER, 29 | // allowNull: true, 30 | // }); 31 | // await queryInterface.addColumn("Universities", "qetcFee", { 32 | // type: Sequelize.INTEGER, 33 | // allowNull: true, 34 | // }); 35 | // await queryInterface.addColumn("Universities", "commisionDuration", { 36 | // type: Sequelize.INTEGER, 37 | // allowNull: true, 38 | // }); 39 | }, 40 | 41 | async down(queryInterface, Sequelize) { 42 | // await queryInterface.removeColumn("Universities", "utype"); 43 | // await queryInterface.removeColumn("Universities", "counserllerName"); 44 | // await queryInterface.removeColumn("Universities", "phone"); 45 | // await queryInterface.removeColumn("Universities", "email"); 46 | // // 47 | // await queryInterface.removeColumn("Universities", "visaAppFee"); 48 | // await queryInterface.removeColumn("Universities", "addmissionFee"); 49 | // await queryInterface.removeColumn("Universities", "qetcFee"); 50 | // await queryInterface.removeColumn("Universities", "commisionDuration"); 51 | }, 52 | }; 53 | 54 | // visaAppFee: DataTypes.INTEGER, 55 | // addmissionFee: DataTypes.INTEGER, 56 | // qetcFee: DataTypes.INTEGER, 57 | // commisionDuration: DataTypes.INTEGER 58 | -------------------------------------------------------------------------------- /migrations/20230128220409-create-campus.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Campuses', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | name: { 13 | type: Sequelize.STRING 14 | }, 15 | address1: { 16 | type: Sequelize.STRING 17 | }, 18 | address2: { 19 | type: Sequelize.STRING 20 | }, 21 | phone: { 22 | type: Sequelize.INTEGER 23 | }, 24 | email: { 25 | type: Sequelize.STRING 26 | }, 27 | isMain: { 28 | type: Sequelize.BOOLEAN 29 | }, 30 | createdAt: { 31 | allowNull: false, 32 | type: Sequelize.DATE 33 | }, 34 | updatedAt: { 35 | allowNull: false, 36 | type: Sequelize.DATE 37 | } 38 | }); 39 | }, 40 | async down(queryInterface, Sequelize) { 41 | await queryInterface.dropTable('Campuses'); 42 | } 43 | }; -------------------------------------------------------------------------------- /migrations/20230129124456-create-programme.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Programmes', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | name: { 13 | type: Sequelize.STRING 14 | }, 15 | selectUniversity: { 16 | type: Sequelize.STRING 17 | }, 18 | programmeLevel: { 19 | type: Sequelize.STRING 20 | }, 21 | programmeIntake: { 22 | type: Sequelize.STRING 23 | }, 24 | programmeDuration: { 25 | type: Sequelize.STRING 26 | }, 27 | programmeCategory: { 28 | type: Sequelize.STRING 29 | }, 30 | tutionFee: { 31 | type: Sequelize.INTEGER 32 | }, 33 | otherFee: { 34 | type: Sequelize.INTEGER 35 | }, 36 | engRequirement: { 37 | type: Sequelize.STRING 38 | }, 39 | entryRequirement: { 40 | type: Sequelize.STRING 41 | }, 42 | createdAt: { 43 | allowNull: false, 44 | type: Sequelize.DATE 45 | }, 46 | updatedAt: { 47 | allowNull: false, 48 | type: Sequelize.DATE 49 | } 50 | }); 51 | }, 52 | async down(queryInterface, Sequelize) { 53 | await queryInterface.dropTable('Programmes'); 54 | } 55 | }; -------------------------------------------------------------------------------- /migrations/20230129210531-create-lead.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Leads', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | image: { 13 | type: Sequelize.STRING 14 | }, 15 | name: { 16 | type: Sequelize.STRING 17 | }, 18 | passportNo: { 19 | type: Sequelize.INTEGER 20 | }, 21 | leadGroup: { 22 | type: Sequelize.STRING 23 | }, 24 | country: { 25 | type: Sequelize.STRING 26 | }, 27 | phoneNo: { 28 | type: Sequelize.INTEGER 29 | }, 30 | email: { 31 | type: Sequelize.STRING 32 | }, 33 | refferalName: { 34 | type: Sequelize.STRING 35 | }, 36 | refferalEmail: { 37 | type: Sequelize.STRING 38 | }, 39 | createdAt: { 40 | allowNull: false, 41 | type: Sequelize.DATE 42 | }, 43 | updatedAt: { 44 | allowNull: false, 45 | type: Sequelize.DATE 46 | } 47 | }); 48 | }, 49 | async down(queryInterface, Sequelize) { 50 | await queryInterface.dropTable('Leads'); 51 | } 52 | }; -------------------------------------------------------------------------------- /migrations/20230129211004-create-programe-details.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('ProgrameDetails', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | schoolName: { 13 | type: Sequelize.STRING 14 | }, 15 | qualificationType: { 16 | type: Sequelize.STRING 17 | }, 18 | selectUniversity: { 19 | type: Sequelize.STRING 20 | }, 21 | interestedProgramme: { 22 | type: Sequelize.STRING 23 | }, 24 | status: { 25 | type: Sequelize.STRING 26 | }, 27 | cert: { 28 | type: Sequelize.STRING 29 | }, 30 | comments: { 31 | type: Sequelize.STRING 32 | }, 33 | createdAt: { 34 | allowNull: false, 35 | type: Sequelize.DATE 36 | }, 37 | updatedAt: { 38 | allowNull: false, 39 | type: Sequelize.DATE 40 | } 41 | }); 42 | }, 43 | async down(queryInterface, Sequelize) { 44 | await queryInterface.dropTable('ProgrameDetails'); 45 | } 46 | }; -------------------------------------------------------------------------------- /migrations/20230130153947-create-applicants.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Applicants', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | fullName: { 13 | type: Sequelize.STRING 14 | }, 15 | email: { 16 | type: Sequelize.STRING 17 | }, 18 | phoneNumber: { 19 | type: Sequelize.INTEGER 20 | }, 21 | address1: { 22 | type: Sequelize.STRING 23 | }, 24 | address2: { 25 | type: Sequelize.STRING 26 | }, 27 | country: { 28 | type: Sequelize.STRING 29 | }, 30 | image: { 31 | type: Sequelize.STRING 32 | }, 33 | passportNo: { 34 | type: Sequelize.INTEGER 35 | }, 36 | fileUpload: { 37 | type: Sequelize.STRING 38 | }, 39 | createdAt: { 40 | allowNull: false, 41 | type: Sequelize.DATE 42 | }, 43 | updatedAt: { 44 | allowNull: false, 45 | type: Sequelize.DATE 46 | } 47 | }); 48 | }, 49 | async down(queryInterface, Sequelize) { 50 | await queryInterface.dropTable('Applicants'); 51 | } 52 | }; -------------------------------------------------------------------------------- /migrations/20230130154538-create-application-details.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('ApplicationDetails', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | applicationLevel: { 13 | type: Sequelize.STRING 14 | }, 15 | interestedProgramme: { 16 | type: Sequelize.STRING 17 | }, 18 | schoolName: { 19 | type: Sequelize.STRING 20 | }, 21 | qualificationType: { 22 | type: Sequelize.STRING 23 | }, 24 | selectUniversity: { 25 | type: Sequelize.STRING 26 | }, 27 | completionLetter: { 28 | type: Sequelize.STRING 29 | }, 30 | programmeLevel: { 31 | type: Sequelize.STRING 32 | }, 33 | healthForm: { 34 | type: Sequelize.STRING 35 | }, 36 | paymentReceipt: { 37 | type: Sequelize.STRING 38 | }, 39 | researchProposal: { 40 | type: Sequelize.STRING 41 | }, 42 | refreeForm: { 43 | type: Sequelize.STRING 44 | }, 45 | medium: { 46 | type: Sequelize.STRING 47 | }, 48 | scholorshipForm: { 49 | type: Sequelize.STRING 50 | }, 51 | otherDocuments: { 52 | type: Sequelize.STRING 53 | }, 54 | attestationLetter: { 55 | type: Sequelize.STRING 56 | }, 57 | releaseLetter: { 58 | type: Sequelize.STRING 59 | }, 60 | status: { 61 | type: Sequelize.STRING 62 | }, 63 | createdAt: { 64 | allowNull: false, 65 | type: Sequelize.DATE 66 | }, 67 | updatedAt: { 68 | allowNull: false, 69 | type: Sequelize.DATE 70 | } 71 | }); 72 | }, 73 | async down(queryInterface, Sequelize) { 74 | await queryInterface.dropTable('ApplicationDetails'); 75 | } 76 | }; -------------------------------------------------------------------------------- /migrations/20230203151011-update-uni-column.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** @type {import('sequelize-cli').Migration} */ 4 | module.exports = { 5 | async up (queryInterface, Sequelize) { 6 | 7 | queryInterface.changeColumn('Universities', 'phone', { 8 | type: Sequelize.STRING, 9 | // defaultValue: 3.14, 10 | allowNull: true 11 | }); 12 | 13 | /** 14 | * Add altering commands here. 15 | * 16 | * Example: 17 | * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); 18 | */ 19 | }, 20 | 21 | // async up (queryInterface, Sequelize) => queryInterface.sequelize.transaction(async transaction => { 22 | // await queryInterface.changeColumn('User', 'ip', 23 | // { 24 | // defaultValue: undefined, 25 | // }, { transaction } 26 | // ); 27 | // }) 28 | async down (queryInterface, Sequelize) { 29 | /** 30 | * Add reverting commands here. 31 | * 32 | * Example: 33 | * await queryInterface.dropTable('users'); 34 | */ 35 | queryInterface.changeColumn('Universities', 'phone', { 36 | type: Sequelize.Number, 37 | // defaultValue: 3.14, 38 | allowNull: true 39 | }); 40 | 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /migrations/20230204003147-create-users.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Users', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | name: { 13 | type: Sequelize.STRING 14 | }, 15 | email: { 16 | type: Sequelize.STRING 17 | }, 18 | number: { 19 | type: Sequelize.INTEGER 20 | }, 21 | role: { 22 | type: Sequelize.STRING 23 | }, 24 | branch: { 25 | type: Sequelize.STRING 26 | }, 27 | position: { 28 | type: Sequelize.STRING 29 | }, 30 | date: { 31 | type: Sequelize.INTEGER 32 | }, 33 | createdAt: { 34 | allowNull: false, 35 | type: Sequelize.DATE 36 | }, 37 | updatedAt: { 38 | allowNull: false, 39 | type: Sequelize.DATE 40 | } 41 | }); 42 | }, 43 | async down(queryInterface, Sequelize) { 44 | await queryInterface.dropTable('Users'); 45 | } 46 | }; -------------------------------------------------------------------------------- /migrations/20230204202846-unnamed-migration.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /** @type {import('sequelize-cli').Migration} */ 4 | module.exports = { 5 | async up(queryInterface, Sequelize) { 6 | await queryInterface.addColumn("ProgrameDetails", "leadId", { 7 | type: Sequelize.INTEGER, 8 | references: { 9 | model: "Leads", 10 | key: "id", 11 | }, 12 | onUpdate: "CASCADE", 13 | onDelete: "SET NULL", 14 | }); 15 | 16 | await queryInterface.addColumn('ApplicationDetails', 'ApplicantId', { 17 | type: Sequelize.INTEGER, 18 | references: { 19 | model: 'Applicants', 20 | key: 'id', 21 | }, 22 | onUpdate: 'CASCADE', 23 | onDelete: 'CASCADE', 24 | }); 25 | }, 26 | 27 | async down(queryInterface, Sequelize) { 28 | /** 29 | * Add reverting commands here. 30 | * 31 | * Example: 32 | * await queryInterface.dropTable('users'); 33 | */ 34 | await queryInterface.removeColumn("ProgrameDetails", "leadId"); 35 | await queryInterface.removeColumn('ApplicationDetails', 'ApplicantId'); 36 | 37 | }, 38 | }; 39 | -------------------------------------------------------------------------------- /migrations/20230207192220-create-acctivity.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Activities', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | action: { 13 | type: Sequelize.STRING 14 | }, 15 | userId: { 16 | type: Sequelize.INTEGER, 17 | references: { 18 | model: "Users", 19 | key: 'id', 20 | }, 21 | onUpdate: 'CASCADE', 22 | onDelete: 'SET NULL', 23 | }, 24 | createdAt: { 25 | allowNull: false, 26 | type: Sequelize.DATE 27 | }, 28 | updatedAt: { 29 | allowNull: false, 30 | type: Sequelize.DATE 31 | } 32 | }); 33 | }, 34 | async down(queryInterface, Sequelize) { 35 | await queryInterface.dropTable('Activities'); 36 | } 37 | }; -------------------------------------------------------------------------------- /migrations/20230208183942-create-property.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Properties', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | type: { 13 | type: Sequelize.INTEGER 14 | }, 15 | property: { 16 | type: Sequelize.STRING 17 | }, 18 | createdAt: { 19 | allowNull: false, 20 | type: Sequelize.DATE 21 | }, 22 | updatedAt: { 23 | allowNull: false, 24 | type: Sequelize.DATE 25 | } 26 | }); 27 | }, 28 | async down(queryInterface, Sequelize) { 29 | await queryInterface.dropTable('Properties'); 30 | } 31 | }; -------------------------------------------------------------------------------- /migrations/20230208191554-create-currency.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Currencies', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | name: { 13 | type: Sequelize.STRING 14 | }, 15 | iso: { 16 | type: Sequelize.STRING 17 | }, 18 | exRate: { 19 | type: Sequelize.INTEGER 20 | }, 21 | status: { 22 | type: Sequelize.INTEGER 23 | }, 24 | createdAt: { 25 | allowNull: false, 26 | type: Sequelize.DATE 27 | }, 28 | updatedAt: { 29 | allowNull: false, 30 | type: Sequelize.DATE 31 | } 32 | }); 33 | }, 34 | async down(queryInterface, Sequelize) { 35 | await queryInterface.dropTable('Currencies'); 36 | } 37 | }; -------------------------------------------------------------------------------- /migrations/20230209184318-create-branch.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Branches', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | name: { 13 | type: Sequelize.STRING 14 | }, 15 | address: { 16 | type: Sequelize.STRING 17 | }, 18 | country: { 19 | type: Sequelize.STRING 20 | }, 21 | manager: { 22 | type: Sequelize.STRING 23 | }, 24 | email: { 25 | type: Sequelize.STRING 26 | }, 27 | phone: { 28 | type: Sequelize.STRING 29 | }, 30 | createdAt: { 31 | allowNull: false, 32 | type: Sequelize.DATE 33 | }, 34 | updatedAt: { 35 | allowNull: false, 36 | type: Sequelize.DATE 37 | } 38 | }); 39 | }, 40 | async down(queryInterface, Sequelize) { 41 | await queryInterface.dropTable('Branches'); 42 | } 43 | }; -------------------------------------------------------------------------------- /migrations/20230209195650-create-roles.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import('sequelize-cli').Migration} */ 3 | module.exports = { 4 | async up(queryInterface, Sequelize) { 5 | await queryInterface.createTable('Roles', { 6 | id: { 7 | allowNull: false, 8 | autoIncrement: true, 9 | primaryKey: true, 10 | type: Sequelize.INTEGER 11 | }, 12 | title: { 13 | type: Sequelize.STRING 14 | }, 15 | createdAt: { 16 | allowNull: false, 17 | type: Sequelize.DATE 18 | }, 19 | updatedAt: { 20 | allowNull: false, 21 | type: Sequelize.DATE 22 | } 23 | }); 24 | }, 25 | async down(queryInterface, Sequelize) { 26 | await queryInterface.dropTable('Roles'); 27 | } 28 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "qetc-backend", 3 | "version": "1.0.0", 4 | "description": "Qetc- Backend", 5 | "author": "Express", 6 | "main": "src/index.js", 7 | "private": false, 8 | "license": "MIT", 9 | "engines": { 10 | "node": ">=8", 11 | "yarn": "*" 12 | }, 13 | "scripts": { 14 | "start": "cross-env NODE_ENV=production pm2 start ./src/index.js -i max", 15 | "dev": "nodemon ./src/index.js", 16 | "pm2": "pm2 start ./src/index.js --name=Qetc", 17 | "pm2-restart": "pm2 restart Qetc", 18 | "pm2-stop": "pm2 stop Qetc", 19 | "pm2-list": "pm2 list", 20 | "pm2-delete": "pm2 delete Qetc" 21 | }, 22 | "keywords": [ 23 | "nodejs", 24 | "Express", 25 | "API", 26 | "Express NodeJS API" 27 | ], 28 | "dependencies": { 29 | "axios": "^0.27.2", 30 | "bcryptjs": "^2.4.3", 31 | "bluebird": "^3.7.2", 32 | "cloudinary": "^1.29.0", 33 | "compression": "^1.7.4", 34 | "cors": "^2.8.5", 35 | "cross-env": "^7.0.3", 36 | "crypto-js": "^4.1.1", 37 | "dotenv": "^10.0.0", 38 | "ejs": "^3.1.6", 39 | "express": "^4.18.2", 40 | "express-bearer-token": "^2.4.0", 41 | "express-rate-limit": "^5.3.0", 42 | "express-validation": "^3.0.8", 43 | "express-validator": "^6.14.0", 44 | "handlebars": "^4.7.7", 45 | "http-status": "^1.5.0", 46 | "jsonwebtoken": "^8.5.1", 47 | "jwt-simple": "^0.5.6", 48 | "mailgun-js": "^0.22.0", 49 | "method-override": "^3.0.0", 50 | "moment": "^2.29.1", 51 | "moment-timezone": "^0.5.34", 52 | "multer": "^1.4.3", 53 | "mysql2": "^3.0.1", 54 | "mysqldump": "^3.2.0", 55 | "nodemailer": "^6.9.1", 56 | "passport": "^0.4.1", 57 | "passport-local": "^1.0.0", 58 | "pug": "^3.0.2", 59 | "randomatic": "^3.1.1", 60 | "randomstring": "^1.2.1", 61 | "sequelize": "^6.28.0", 62 | "slugify": "^1.6.5" 63 | }, 64 | "devDependencies": { 65 | "nodemon": "^2.0.21", 66 | "sequelize-cli": "^6.6.0" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | To run the Qetc-Backend project on a local server, follow these steps: 2 | 3 | Clone the repository to your local machine using the git clone command. 4 | 5 | Navigate to the project directory using the terminal or command prompt. 6 | 7 | Make sure you have Node.js and npm installed on your machine. 8 | 9 | Run the following command to install all the required dependencies: 10 | 11 | Copy code 12 | npm install 13 | Create a .env file in the project's root directory and add the required environment variables. 14 | 15 | Start the development server by running the following command: 16 | 17 | Copy code 18 | npm run dev 19 | The server should now be running on http://localhost:8080. 20 | Note: To run the project in production mode, use the "start" script instead of "dev". You can also use the "pm2" script to run the project using the pm2 process manager. -------------------------------------------------------------------------------- /src/api/controllers/admin/activity.controller.js: -------------------------------------------------------------------------------- 1 | const Activity = require('../../models/activity.model') 2 | 3 | // API to get activity list 4 | exports.list = async (req, res, next) => { 5 | try { 6 | let { page, limit } = req.query 7 | 8 | page = page !== undefined && page !== '' ? parseInt(page) : 1 9 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 10 | 11 | const total = await Activity.countDocuments() 12 | 13 | const activity = await Activity.aggregate([ 14 | { $sort: { createdAt: -1 } }, 15 | { $skip: limit * (page - 1) }, 16 | { $limit: limit }, 17 | { "$addFields": { "user_Id": { "$toObjectId": "$userId" }}}, 18 | { $lookup: { 19 | from: 'users', 20 | foreignField: '_id', 21 | localField: 'user_Id', 22 | as: 'user' 23 | } 24 | }, 25 | {$unwind: {path: "$user", preserveNullAndEmptyArrays: true}}, 26 | { "$addFields": { "admin_Id": { "$toObjectId": "$userId" }}}, 27 | { $lookup: { 28 | from: 'admins', 29 | foreignField: '_id', 30 | localField: 'admin_Id', 31 | as: 'admin' 32 | } 33 | }, 34 | {$unwind: {path: "$admin", preserveNullAndEmptyArrays: true}} 35 | ]) 36 | 37 | return res.send({ 38 | success: true, message: 'Activities fetched successfully', 39 | data: { 40 | activity, 41 | pagination: { 42 | page, limit, total, 43 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 44 | } 45 | } 46 | }) 47 | } catch (error) { 48 | return next(error) 49 | } 50 | } -------------------------------------------------------------------------------- /src/api/controllers/admin/cms.controller.js: -------------------------------------------------------------------------------- 1 | const CMS = require('../../models/cms.model') 2 | let slugify = require('slugify') 3 | const { checkDuplicate } = require('../../../config/errors') 4 | 5 | // API to create CMS 6 | exports.create = async (req, res, next) => { 7 | try { 8 | let payload = req.body 9 | let cms = await CMS.findOne({ title: { $regex: payload.title, $options: "i" } }).lean(true) 10 | if (cms) { 11 | return res.status(400).send({ success: false, message: 'Content page with this title already exist.' }) 12 | } 13 | payload.slug = slugify(payload.title) 14 | const content = await CMS.create(payload) 15 | return res.status(200).send({ success: true, message: 'Content Page created successfully', content }) 16 | } catch (error) { 17 | return next(error) 18 | } 19 | } 20 | 21 | // API to edit CMS 22 | exports.edit = async (req, res, next) => { 23 | try { 24 | let payload = req.body 25 | // let cms = await CMS.findOne({ title: { $regex: payload.title, $options: "i" } }).lean(true) 26 | // if (cms) { 27 | // return res.status(400).send({ success: false, message: 'Content page with this title already exist.' }) 28 | // } 29 | payload.slug = slugify(payload.title) 30 | const content = await CMS.findByIdAndUpdate({ _id: payload._id }, { $set: payload }, { new: true }) 31 | return res.send({ success: true, message: 'Content Page updated successfully', content }) 32 | } catch (error) { 33 | return next(error) 34 | } 35 | } 36 | 37 | // API to delete content 38 | exports.delete = async (req, res, next) => { 39 | try { 40 | const { contentId } = req.params 41 | if (contentId) { 42 | const content = await CMS.deleteOne({ _id: contentId }) 43 | if (content && content.deletedCount) 44 | return res.send({ success: true, message: 'Content Page deleted successfully', contentId }) 45 | else return res.status(400).send({ success: false, message: 'Content Page not found for given Id' }) 46 | } else 47 | return res.status(400).send({ success: false, message: 'Content Id is required' }) 48 | } catch (error) { 49 | return next(error) 50 | } 51 | } 52 | 53 | // API to get a CMS 54 | exports.get = async (req, res, next) => { 55 | try { 56 | const { contentId } = req.params 57 | if (contentId) { 58 | const content = await CMS.findOne({ _id: contentId }, { _id: 1, title: 1, status: 1, slug: 1, description: 1, showInFooter: 1 }).lean(true) 59 | if (content) 60 | return res.json({ success: true, message: 'Content Page retrieved successfully', content }) 61 | else return res.status(400).send({ success: false, message: 'CMS not found for given Id' }) 62 | } else 63 | return res.status(400).send({ success: false, message: 'CMS Id is required' }) 64 | } catch (error) { 65 | return next(error) 66 | } 67 | } 68 | 69 | // API to get CMS list 70 | exports.list = async (req, res, next) => { 71 | try { 72 | let { page, limit, title, status } = req.query 73 | const filter = {} 74 | 75 | page = page !== undefined && page !== '' ? parseInt(page) : 1 76 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 77 | 78 | if (title) { 79 | filter.title = { $regex: title, $options: "gi" } 80 | } 81 | 82 | if (status) { 83 | if (status === 'true') { 84 | filter.status = true 85 | } 86 | else if (status === 'false') { 87 | filter.status = false 88 | } 89 | } 90 | 91 | const total = await CMS.countDocuments(filter) 92 | 93 | if (page > Math.ceil(total / limit) && total > 0) 94 | page = Math.ceil(total / limit) 95 | 96 | const contentPages = await CMS.aggregate([ 97 | { $match: filter }, 98 | { $sort: { createdAt: -1 } }, 99 | { $skip: limit * (page - 1) }, 100 | { $limit: limit }, 101 | { 102 | $project: { 103 | _id: 1, title: 1, slug: 1, description: 1, status: 1, showInFooter: 1 104 | } 105 | } 106 | ]) 107 | 108 | return res.send({ 109 | success: true, message: 'Content Pages fetched successfully', 110 | data: { 111 | contentPages, 112 | pagination: { 113 | page, limit, total, 114 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 115 | } 116 | } 117 | }) 118 | } catch (error) { 119 | return next(error) 120 | } 121 | } -------------------------------------------------------------------------------- /src/api/controllers/admin/contact.controller.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const Contact = require('../../models/contact.model') 3 | const { checkDuplicate } = require('../../../config/errors') 4 | 5 | 6 | // API to get support list 7 | exports.list = async (req, res, next) => { 8 | try { 9 | let { page, limit } = req.query 10 | let { name, email, game, environment, type, sdk, status } = req.body 11 | const filter = {} 12 | console.log(req.body) 13 | page = page !== undefined && page !== '' ? parseInt(page) : 1 14 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 15 | 16 | 17 | 18 | 19 | if (name) { 20 | name = name.trim() 21 | filter.name = { $regex: name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), $options: 'gi' }; 22 | } 23 | 24 | if (email) { 25 | filter.email = email.toLowerCase().trim() 26 | } 27 | 28 | if (game) { 29 | filter.gameId = mongoose.Types.ObjectId(game) 30 | } 31 | 32 | if (environment) { 33 | filter.environment = parseInt(environment) 34 | } 35 | 36 | if (sdk) { 37 | filter.sdkId = mongoose.Types.ObjectId(sdk) 38 | } 39 | 40 | if (type) { 41 | filter.type = type 42 | } 43 | 44 | if (status != undefined) { 45 | filter.status = parseInt(status) 46 | } 47 | 48 | const total = await Contact.countDocuments(filter) 49 | 50 | if (page > Math.ceil(total / limit) && total > 0) 51 | page = Math.ceil(total / limit) 52 | 53 | const contact = await Contact.aggregate([ 54 | { $match: filter }, 55 | { $sort: { createdAt: -1 } }, 56 | { $skip: limit * (page - 1) }, 57 | { $limit: limit }, 58 | { 59 | $lookup: { 60 | from: 'games', 61 | foreignField: '_id', 62 | localField: 'gameId', 63 | as: 'game' 64 | } 65 | }, 66 | { $unwind: { path: "$game", preserveNullAndEmptyArrays: true } }, 67 | { 68 | $lookup: { 69 | from: 'sdks', 70 | foreignField: '_id', 71 | localField: 'sdkId', 72 | as: 'sdk' 73 | } 74 | }, 75 | { $unwind: { path: "$sdk", preserveNullAndEmptyArrays: true } } 76 | ]) 77 | 78 | return res.send({ 79 | success: true, message: 'Support data fetched successfully', 80 | data: { 81 | contact, 82 | pagination: { 83 | page, limit, total, 84 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 85 | } 86 | } 87 | }) 88 | } catch (error) { 89 | return next(error) 90 | } 91 | } 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | // API to edit contact status 100 | exports.edit = async (req, res, next) => { 101 | try { 102 | let newPayload = { 103 | status: req.body.status 104 | } 105 | let updatedContact = await Contact.findByIdAndUpdate({ _id: req.body._id }, { $set: newPayload }, { new: true }) 106 | return res.send({ success: true, message: 'Support form updated successfully', updatedContact }) 107 | } catch (error) { 108 | if (error.code === 11000 || error.code === 11001) 109 | checkDuplicate(error, res, 'Contact') 110 | else 111 | return next(error) 112 | } 113 | } 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /src/api/controllers/admin/email.controller.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const mongoose = require('mongoose'); 3 | const Email = require('../../models/email.model') 4 | const { uploadToCloudinary } = require('../../utils/upload') 5 | const { checkDuplicate } = require('../../../config/errors') 6 | 7 | const path = require('path'); 8 | 9 | // API to create email template 10 | exports.create = async (req, res, next) => { 11 | try { 12 | let payload = req.body 13 | const email = await Email.create(payload) 14 | return res.send({ success: true, message: 'Email template created successfully', email }) 15 | } catch (error) { 16 | if (error.code === 11000 || error.code === 11001) 17 | checkDuplicate(error, res, 'Email') 18 | else 19 | return next(error) 20 | } 21 | } 22 | 23 | //API that create all Email templates in DB when system will start 24 | exports.createEmailBulkTemplate = async () => { 25 | try { 26 | let rawdata = fs.readFileSync(path.resolve(__dirname, '../../../config/emailtemplate.json')); 27 | let emailTemplates = JSON.parse(rawdata); 28 | 29 | for (let i = 0; i < emailTemplates.length; i++) { 30 | const template = await Email.findOne({ type: emailTemplates[i].type }) 31 | if (template == null) { 32 | await Email.create(emailTemplates[i]) 33 | } 34 | } 35 | 36 | return; 37 | } catch (error) { 38 | console.log(error) 39 | } 40 | } 41 | 42 | // API to edit email template 43 | exports.edit = async (req, res, next) => { 44 | try { 45 | let payload = req.body 46 | const email = await Email.findByIdAndUpdate({ _id: mongoose.Types.ObjectId(payload._id) }, { $set: payload }, { new: true }) 47 | // const templates=await Email.find({},'-_id type subject text' ) 48 | // fs.writeFileSync(path.resolve(__dirname, '../../../config/emailtemplate.json'), JSON.stringify(templates)); 49 | return res.send({ success: true, message: 'Email template updated successfully', email }) 50 | } catch (error) { 51 | if (error.code === 11000 || error.code === 11001) 52 | checkDuplicate(error, res, 'Email') 53 | else 54 | return next(error) 55 | } 56 | } 57 | 58 | // API to get email template 59 | exports.get = async (req, res, next) => { 60 | try { 61 | const { emailId } = req.params 62 | if (emailId) { 63 | const email = await Email.findOne({ _id: emailId }, { __v: 0, createdAt: 0, updatedAt: 0 }).lean(true) 64 | if (email) 65 | return res.json({ success: true, message: 'Email template retrieved successfully', email }) 66 | else return res.status(400).send({ success: false, message: 'Email template not found for given Id' }) 67 | } else 68 | return res.status(400).send({ success: false, message: 'Email Id is required' }) 69 | } catch (error) { 70 | return next(error) 71 | } 72 | } 73 | 74 | // API to delete email template 75 | exports.delete = async (req, res, next) => { 76 | try { 77 | const { emailId } = req.params 78 | if (emailId) { 79 | const email = await Email.deleteOne({ _id: emailId }) 80 | if (email && email.deletedCount) 81 | return res.send({ success: true, message: 'Email deleted successfully', emailId }) 82 | else return res.status(400).send({ success: false, message: 'Email not found for given Id' }) 83 | } else 84 | return res.status(400).send({ success: false, message: 'Email Id is required' }) 85 | } catch (error) { 86 | return next(error) 87 | } 88 | } 89 | 90 | 91 | // API to get email list 92 | exports.list = async (req, res, next) => { 93 | try { 94 | let { page, limit, type, subject } = req.query 95 | const filter = {} 96 | 97 | page = page !== undefined && page !== '' ? parseInt(page) : 1 98 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 99 | 100 | if (type) { 101 | filter.type = { $regex: type, $options: "gi" } 102 | } 103 | 104 | if (subject) { 105 | filter.subject = { $regex: subject, $options: "gi" } 106 | } 107 | 108 | const total = await Email.countDocuments(filter) 109 | 110 | if (page > Math.ceil(total / limit) && total > 0) 111 | page = Math.ceil(total / limit) 112 | 113 | const emails = await Email.aggregate([ 114 | { $match: filter }, 115 | { $sort: { createdAt: -1 } }, 116 | { $skip: limit * (page - 1) }, 117 | { $limit: limit }, 118 | { 119 | $project: { 120 | __v: 0, createdAt: 0, updatedAt: 0 121 | } 122 | } 123 | ]) 124 | 125 | return res.send({ 126 | success: true, message: 'Email templates fetched successfully', 127 | data: { 128 | emails, 129 | pagination: { 130 | page, limit, total, 131 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 132 | } 133 | } 134 | }) 135 | } catch (error) { 136 | return next(error) 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /src/api/controllers/admin/faq.controller.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const ObjectId = require('mongoose').Types.ObjectId 3 | const FAQ = require('../../models/faq.model') 4 | const { uploadToCloudinary } = require('../../utils/upload') 5 | const { checkDuplicate } = require('../../../config/errors') 6 | 7 | // API to create FAQ 8 | exports.create = async (req, res, next) => { 9 | try { 10 | let payload = req.body 11 | 12 | const faq = await FAQ.create(payload) 13 | return res.send({ success: true, message: 'FAQ created successfully', faq }) 14 | } catch (error) { 15 | console.log(error) 16 | if (error.code === 11000 || error.code === 11001) 17 | checkDuplicate(error, res, 'FAQ') 18 | else 19 | return next(error) 20 | } 21 | } 22 | 23 | // API to edit FAQ 24 | exports.edit = async (req, res, next) => { 25 | try { 26 | let payload = req.body 27 | const faq = await FAQ.findByIdAndUpdate({ _id: payload._id }, { $set: payload }, { new: true }) 28 | return res.send({ success: true, message: 'FAQ updated successfully', faq }) 29 | } catch (error) { 30 | if (error.code === 11000 || error.code === 11001) 31 | checkDuplicate(error, res, 'FAQ') 32 | else 33 | return next(error) 34 | } 35 | } 36 | 37 | // API to delete faq 38 | exports.delete = async (req, res, next) => { 39 | try { 40 | const { faqId } = req.params 41 | if (faqId) { 42 | const faq = await FAQ.deleteOne({ _id: faqId }) 43 | if (faq && faq.deletedCount) 44 | return res.send({ success: true, message: 'FAQ deleted successfully', faqId }) 45 | else return res.status(400).send({ success: false, message: 'FAQ not found for given Id' }) 46 | } else 47 | return res.status(400).send({ success: false, message: 'FAQ Id is required' }) 48 | } catch (error) { 49 | return next(error) 50 | } 51 | } 52 | 53 | // API to get a FAQ 54 | exports.get = async (req, res, next) => { 55 | try { 56 | const { faqId } = req.params 57 | if (faqId) { 58 | const faq = await FAQ.findOne({ _id: faqId }, { _id: 1, title: 1, desc: 1, status: 1, catId: 1 }).lean(true) 59 | if (faq) 60 | return res.json({ success: true, message: 'FAQ retrieved successfully', faq }) 61 | else return res.status(400).send({ success: false, message: 'FAQ not found for given Id' }) 62 | } else 63 | return res.status(400).send({ success: false, message: 'FAQ Id is required' }) 64 | } catch (error) { 65 | return next(error) 66 | } 67 | } 68 | 69 | // API to get FAQ list 70 | exports.list = async (req, res, next) => { 71 | try { 72 | let { page, limit, title, status } = req.query 73 | const filter = {} 74 | 75 | page = page !== undefined && page !== '' ? parseInt(page) : 1 76 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 77 | 78 | if (title) { 79 | filter.title = { $regex: title, $options: "gi" } 80 | } 81 | if (status) { 82 | if(status === 'true'){ 83 | filter.status = true 84 | } 85 | else if(status === 'false'){ 86 | filter.status = false 87 | } 88 | } 89 | 90 | const total = await FAQ.countDocuments(filter) 91 | 92 | if (page > Math.ceil(total / limit) && total > 0) 93 | page = Math.ceil(total / limit) 94 | 95 | const faqs = await FAQ.aggregate([ 96 | { $match: filter }, 97 | { $sort: { createdAt: -1 } }, 98 | { $skip: limit * (page - 1) }, 99 | { $limit: limit }, 100 | { 101 | $project: { 102 | _id: 1, title: 1, status: 1, desc: 1 103 | } 104 | } 105 | ]) 106 | 107 | return res.send({ 108 | success: true, message: 'FAQs fetched successfully', 109 | data: { 110 | faqs, 111 | pagination: { 112 | page, limit, total, 113 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 114 | } 115 | } 116 | }) 117 | } catch (error) { 118 | return next(error) 119 | } 120 | } -------------------------------------------------------------------------------- /src/api/controllers/admin/faqCategories.controller.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const ObjectId = require('mongoose').Types.ObjectId 3 | const FaqCategories = require('../../models/faqCategories.model') 4 | const { uploadToCloudinary } = require('../../utils/upload') 5 | const { checkDuplicate } = require('../../../config/errors') 6 | 7 | // API to create FaqCategories 8 | exports.create = async (req, res, next) => { 9 | try { 10 | let payload = req.body 11 | 12 | const faqCategories = await FaqCategories.create(payload) 13 | return res.send({ success: true, message: 'Faq-Categories created successfully', faqCategories }) 14 | } catch (error) { 15 | console.log(error) 16 | if (error.code === 11000 || error.code === 11001) 17 | checkDuplicate(error, res, 'FaqCategories') 18 | else 19 | return next(error) 20 | } 21 | } 22 | 23 | // API to edit FaqCategories 24 | exports.edit = async (req, res, next) => { 25 | try { 26 | let payload = req.body 27 | const faqCategories = await FaqCategories.findByIdAndUpdate({ _id: payload._id }, { $set: payload }, { new: true }) 28 | return res.send({ success: true, message: 'FaqCategories updated successfully', faqCategories }) 29 | } catch (error) { 30 | if (error.code === 11000 || error.code === 11001) 31 | checkDuplicate(error, res, 'FaqCategories') 32 | else 33 | return next(error) 34 | } 35 | } 36 | 37 | // API to delete faqCategories 38 | exports.delete = async (req, res, next) => { 39 | try { 40 | const { faqId } = req.params 41 | if (faqId) { 42 | const faqCategories = await FaqCategories.deleteOne({ _id: faqId }) 43 | if (faqCategories && faqCategories.deletedCount) 44 | return res.send({ success: true, message: 'Faq-Categories deleted successfully', faqId }) 45 | else return res.status(400).send({ success: false, message: 'Faq-Categories not found for given Id' }) 46 | } else 47 | return res.status(400).send({ success: false, message: 'Faq-Categories Id is required' }) 48 | } catch (error) { 49 | return next(error) 50 | } 51 | } 52 | 53 | // API to get a FaqCategories 54 | exports.get = async (req, res, next) => { 55 | try { 56 | const { faqId } = req.params 57 | if (faqId) { 58 | const faqCategories = await FaqCategories.findOne({ _id: faqId }, { _id: 1, title: 1, desc: 1, status: 1 }).lean(true) 59 | if (faqCategories) 60 | return res.json({ success: true, message: 'Faq-Categories retrieved successfully', faqCategories }) 61 | else return res.status(400).send({ success: false, message: 'Faq-Categories not found for given Id' }) 62 | } else 63 | return res.status(400).send({ success: false, message: 'Faq-Categories Id is required' }) 64 | } catch (error) { 65 | return next(error) 66 | } 67 | } 68 | 69 | // API to get FaqCategories list 70 | exports.list = async (req, res, next) => { 71 | try { 72 | let { page, limit, all, status, title } = req.query 73 | const filter = {} 74 | 75 | page = page !== undefined && page !== '' ? parseInt(page) : 1 76 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 77 | 78 | if (title) { 79 | filter.title = { $regex: title, $options: "gi" } 80 | } 81 | 82 | if (status) { 83 | if (status === 'true') { 84 | filter.status = true 85 | } 86 | else if (status === 'false') { 87 | filter.status = false 88 | } 89 | } 90 | 91 | const total = await FaqCategories.countDocuments(filter) 92 | 93 | if (page > Math.ceil(total / limit) && total > 0) 94 | page = Math.ceil(total / limit) 95 | 96 | let pipeline = [] 97 | 98 | if (!all) 99 | pipeline = [ 100 | { $skip: limit * (page - 1) }, 101 | { $limit: limit }, 102 | ] 103 | 104 | const faqCategories = await FaqCategories.aggregate([ 105 | { $match: filter }, 106 | { $sort: { createdAt: -1 } }, 107 | ...pipeline, 108 | { 109 | $project: { 110 | _id: 1, title: 1, status: 1, desc: 1 111 | } 112 | } 113 | ]) 114 | 115 | return res.send({ 116 | success: true, message: 'Faq-Categories Fetched Successfully', 117 | data: { 118 | faqCategories, 119 | pagination: { 120 | page, limit, total, 121 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 122 | } 123 | } 124 | }) 125 | } catch (error) { 126 | return next(error) 127 | } 128 | } -------------------------------------------------------------------------------- /src/api/controllers/admin/newsletter.controller.js: -------------------------------------------------------------------------------- 1 | const Newsletter = require('../../models/newsletter.model'); 2 | const { sendEmail } = require('../../utils/emails/emails') 3 | 4 | 5 | exports.list = async (req, res, next) => { 6 | try { 7 | let { page, limit, email, ip, startDate, endDate } = req.query 8 | const filter = {} 9 | 10 | page = page !== undefined && page !== '' ? parseInt(page) : 1 11 | limit = limit !== undefined && limit !== '' ? parseInt(limit) : 10 12 | 13 | if (email) { 14 | filter.email = { $regex: email, $options: "gi" } 15 | } 16 | if (ip) { 17 | filter.ip = ip 18 | } 19 | if (startDate && endDate) { 20 | startDate = new Date(startDate) 21 | endDate = new Date(endDate) 22 | if (startDate.getTime() == endDate.getTime()) { 23 | filter.createdAt = { $gte: startDate } 24 | } 25 | else { 26 | filter['$and'] = [{ 'createdAt': { $gte: startDate } }, { 'createdAt': { $lte: endDate } }] 27 | } 28 | } 29 | 30 | 31 | const total = await Newsletter.countDocuments(filter) 32 | 33 | let newsletter = await Newsletter.aggregate([ 34 | { $match: filter }, 35 | { $sort: { createdAt: -1 } }, 36 | { $skip: limit * (page - 1) }, 37 | { $limit: limit }, 38 | { 39 | $project: { 40 | _id: 1, email: 1, ip: 1, createdAt: 1 41 | } 42 | } 43 | ]) 44 | 45 | return res.send({ 46 | success: true, 47 | message: "Newsletters Retrieved Successfully.", 48 | data: { 49 | newsletter, 50 | pagination: { 51 | page, limit, total, 52 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit) 53 | } 54 | } 55 | }); 56 | 57 | } catch (error) { 58 | return next(error); 59 | } 60 | } 61 | 62 | exports.sendEmailToSubscribers = async (req, res, next) => { 63 | let { emails, allSubscribers } = req.body; 64 | if (allSubscribers) { 65 | let subscribers = await Newsletter.find(); 66 | let email = []; 67 | for (let x = 0; x < subscribers.length; x++) { 68 | email.push(subscribers[x].email); 69 | } 70 | await sendEmail(email, 'send-news-letter-subscription-email-admin'); 71 | } 72 | else if (emails && emails.length > 0) { 73 | 74 | let email = []; 75 | for (let x = 0; x < emails.length; x++) { 76 | activeEmails = await Newsletter.find({ email: emails[x]}) 77 | activeEmails.forEach(val => { 78 | email.push(val.email); 79 | }); 80 | } 81 | await sendEmail(email, 'send-news-letter-subscription-email-admin'); 82 | } 83 | return res.send({ status: true, message: "Email Sent Successfully." }); 84 | } 85 | 86 | 87 | -------------------------------------------------------------------------------- /src/api/controllers/admin/settings.controller.js: -------------------------------------------------------------------------------- 1 | const Settings = require('../../models/settings.model') 2 | const { checkDuplicate } = require('../../../config/errors') 3 | 4 | // API to edit Settings 5 | exports.edit = async (req, res, next) => { 6 | try { 7 | let payload = req.body; 8 | const settings = await Settings.updateOne({}, { $set: payload }, { upsert: true }) 9 | return res.send({ success: true, message: 'Settings updated successfully', settings }) 10 | } catch (error) { 11 | if (error.code === 11000 || error.code === 11001) 12 | checkDuplicate(error, res, 'Settings') 13 | else 14 | return next(error) 15 | } 16 | } 17 | 18 | // // API to get Settings 19 | exports.get = async (req, res, next) => { 20 | try { 21 | const settings = await Settings.findOne({}, { __v: 0, createdAt: 0, updatedAt: 0 }).lean(true) 22 | if (settings) 23 | return res.json({ success: true, message: 'Settings retrieved successfully', settings }) 24 | else 25 | return res.json({ success: false, message: settings }) 26 | } catch (error) { 27 | return next(error) 28 | } 29 | } -------------------------------------------------------------------------------- /src/api/controllers/front-bk/cms.controller.js: -------------------------------------------------------------------------------- 1 | const ObjectId = require('mongoose').Types.ObjectId 2 | const Cms = require('../../models/cms.model'); 3 | 4 | exports.get = async (req, res, next) => { 5 | try { 6 | let { slug } = req.params; 7 | if (slug) { 8 | let cms = await Cms.findOne({ slug, status: true }, { title: 1, description: 1, _id: 0 }).lean(true); 9 | return res.send({ success: true, message: "CMS Retrieved Successfully.", cms }); 10 | } 11 | return res.send({ success: false, message: "Slug Is Required" }); 12 | } catch (error) { 13 | return next(error); 14 | } 15 | } 16 | 17 | exports.list = async (req, res, next) => { 18 | try { 19 | let cms = await Cms.find({ status: true }, { title: 1, slug: 1, _id: 0 }).sort({ createdAt: -1 }).limit(5); 20 | 21 | return res.send({ success: true, message: "CMS Listing Retrieved successfully.", cms }); 22 | } catch (error) { 23 | return next(error); 24 | } 25 | }; 26 | 27 | -------------------------------------------------------------------------------- /src/api/controllers/front-bk/contact.controller.js: -------------------------------------------------------------------------------- 1 | const Contact = require('../../models/contact.model'); 2 | const Settings = require('../../models/settings.model') 3 | const mongoose = require('mongoose') 4 | const { uploadToCloudinary } = require('../../utils/upload') 5 | const { sendEmail } = require('../../utils/emails/emails') 6 | exports.create = async (req, res, next) => { 7 | try { 8 | 9 | let contact = await Contact.create(req.body); 10 | res.send({ success: true, data: contact, message: 'Support Form successfully send' }); 11 | } catch (error) { 12 | return next(error); 13 | } 14 | }; -------------------------------------------------------------------------------- /src/api/controllers/front-bk/faq.controller.js: -------------------------------------------------------------------------------- 1 | const FAQ = require('../../models/faq.model') 2 | const FaqCat = require('../../models/faqCategories.model') 3 | const ObjectId = require('mongoose').Types.ObjectId 4 | 5 | // API to get FAQ list 6 | exports.list = async (req, res, next) => { 7 | try { 8 | let { catId } = req.params 9 | 10 | const faqs = await FAQ.find({ status: true, catId: ObjectId(catId) }, { title: 1, desc: 1 }) 11 | 12 | return res.send({ 13 | success: true, message: 'FAQs fetched successfully', 14 | data: { 15 | faqs 16 | } 17 | }) 18 | } catch (error) { 19 | return next(error) 20 | } 21 | } 22 | 23 | // API to get FAQ list 24 | exports.listFaqCategories = async (req, res, next) => { 25 | try { 26 | const faqCats = await FaqCat.find({ status: true }, { title: 1 }) 27 | 28 | return res.send({ 29 | success: true, message: 'FAQ Categories fetched successfully', 30 | faqCats 31 | }) 32 | } catch (error) { 33 | return next(error) 34 | } 35 | } -------------------------------------------------------------------------------- /src/api/controllers/front-bk/footer.controller.js: -------------------------------------------------------------------------------- 1 | const Settings = require('../../models/settings.model'); 2 | const NewsLetter = require('../../models/newsletter.model'); 3 | const { checkDuplicate } = require('../../middlewares/error'); 4 | const axios = require('axios'); 5 | 6 | exports.submit = async (req, res, next) => { 7 | try { 8 | let payload = req.body 9 | 10 | let newsLetter = await NewsLetter.create(payload); 11 | 12 | if (newsLetter) 13 | return res.send({ success: true, message: "Email Submitted Successfully." }); 14 | 15 | } catch (error) { 16 | if (error.code === 11000 || error.code === 11001) 17 | checkDuplicate(error, res, 'Email'); 18 | else 19 | return next(error); 20 | } 21 | } 22 | 23 | exports.get = async (req, res, next) => { 24 | try { 25 | let footer = await Settings.findOne({}, { discord: 1, twitter: 1, youtube: 1, instagram: 1, medium: 1, reddit: 1, telegram: 1, github: 1, linkedIn: 1, facebook: 1, desc: 1, _id: 0 }).lean(true); 26 | return res.send({ success: true, message: "Footer Retrieved Successfully.", footer }); 27 | } catch (error) { 28 | return next(error); 29 | } 30 | } 31 | 32 | exports.cryptocurrencyListing = async(req,res,next) => { 33 | let response = null; 34 | new Promise(async (resolve, reject) => { 35 | try { 36 | response = await axios.get('https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest', { 37 | headers: { 38 | 'X-CMC_PRO_API_KEY': '7c9a4cbf-413c-4d75-a6d5-8ac2740fe4fd', 39 | }, 40 | }); 41 | } catch(ex) { 42 | response = null; 43 | // error 44 | console.log(ex); 45 | reject(ex); 46 | } 47 | if (response) { 48 | // success 49 | const json = response.data; 50 | let currenciesData = json.data 51 | currenciesData = currenciesData.slice(0,6) 52 | resolve(currenciesData); 53 | res.send({success: true, message: "Currencies Fetched Successfully", currenciesData}) 54 | 55 | } 56 | }); 57 | } -------------------------------------------------------------------------------- /src/api/controllers/front-bk/settings.controller.js: -------------------------------------------------------------------------------- 1 | const Settings = require('../../models/settings.model') 2 | 3 | // API to get Settings 4 | exports.get = async (req, res, next) => { 5 | try { 6 | const settings = await Settings.findOne({}, { __v: 0, createdAt: 0, updatedAt: 0, api: 0, domain: 0 }).lean(true) 7 | if (settings) 8 | return res.json({ success: true, message: 'Settings retrieved successfully', settings }) 9 | else 10 | return res.json({ success: false, message: settings }) 11 | } catch (error) { 12 | return next(error) 13 | } 14 | } -------------------------------------------------------------------------------- /src/api/controllers/front-bk/users.controller.js: -------------------------------------------------------------------------------- 1 | const ObjectId = require('mongoose').Types.ObjectId 2 | const User = require('../../models/users.model'); 3 | const { uploadToCloudinary } = require('../../utils/upload'); 4 | 5 | exports.update = async (req, res, next) => { 6 | try { 7 | let payload = req.body; 8 | let { userId } = req.params 9 | if (req.files) { 10 | for (const key in req.files) { 11 | const image = req.files[key][0] 12 | payload[key] = await uploadToCloudinary(image.path) 13 | payload[`${key}Local`] = image.filename 14 | } 15 | } 16 | 17 | let user = await User.findByIdAndUpdate({ _id: userId }, { $set: payload }, { new: true }); 18 | let data = user.transform(); 19 | return res.send({ success: true, data, message: "Your profile is updated successfully." }); 20 | } catch (error) { 21 | return next(error); 22 | } 23 | }; 24 | 25 | exports.getUser = async (req, res, next) => { 26 | try { 27 | let { userId } = req.params; 28 | let user = await User.findOne({ _id: ObjectId(userId) }); 29 | user = user.transform(); 30 | return res.send({ success: true, data: user, message: "Users fetched succesfully" }); 31 | } catch (error) { 32 | return next(error); 33 | } 34 | }; 35 | 36 | 37 | exports.uploadContent = async (req, res, next) => { 38 | try { 39 | const files = req.file ? `${req.file.filename}` : ""; 40 | return res.json({ success: true, message: 'File upload successfully', data: files }) 41 | } catch (error) { 42 | return res.status(400).send({ success: false, message: error }); 43 | } 44 | }; 45 | 46 | exports.getUserReferrals = async (req, res, next) => { 47 | try { 48 | let { userId } = req.params; 49 | let userReferrals = await User.find({ refferedBy: ObjectId(userId) }); 50 | return res.send({ success: true, userReferrals, message: "User Referrals Retrieved Successfully." }); 51 | } catch (error) { 52 | return next(error); 53 | } 54 | }; 55 | 56 | 57 | exports.getTokenStats = async (req, res, next) => { 58 | try{ 59 | const { symbol } = req.params 60 | 61 | 62 | } catch (error) { 63 | return next(error); 64 | } 65 | } -------------------------------------------------------------------------------- /src/api/controllers/front/activities.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../../models"); 2 | const Activity = db.Activity; 3 | const { Users } = db; 4 | // Activity 5 | // list Activityies 6 | exports.list = async (req, res, next) => { 7 | try { 8 | const uni = await Activity.findAndCountAll(); 9 | 10 | let { page, limit, name } = req.query; 11 | 12 | // console.log("unitt", uni.count); 13 | // console.log("req.queryy", req.query); //name 14 | const filter = {}; 15 | 16 | page = page !== undefined && page !== "" ? parseInt(page) : 1; 17 | limit = limit !== undefined && limit !== "" ? parseInt(limit) : 10; 18 | 19 | if (name) { 20 | filter.name = { $LIKE: name, $options: "gi" }; 21 | } 22 | 23 | const total = uni.count; 24 | 25 | if (page > Math.ceil(total / limit) && total > 0) 26 | page = Math.ceil(total / limit); 27 | 28 | console.log("filter", filter); 29 | const faqs = await Activity.findAll({ 30 | order: [["updatedAt", "DESC"]], 31 | offset: limit * (page - 1), 32 | limit: limit, 33 | where: filter, 34 | include: [Users], 35 | }); 36 | console.log("faqs", faqs); 37 | // res.send(uni); 38 | return res.send({ 39 | success: true, 40 | message: "Activities fetched successfully", 41 | data: { 42 | faqs, 43 | pagination: { 44 | page, 45 | limit, 46 | total, 47 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit), 48 | }, 49 | }, 50 | }); 51 | } catch (err) { 52 | res.send("currency Error " + err); 53 | } 54 | // next(); 55 | }; 56 | -------------------------------------------------------------------------------- /src/api/controllers/front/costofsales.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../../models"); 2 | const CostOfSales = db.CostOfSales; 3 | const Activity = db.Activity; 4 | // create program categorys 5 | exports.create = async (req, res, next) => { 6 | try { 7 | console.log("Req.body costOfSales controller =====>", req.body); 8 | // 9 | 10 | let costOfSales = { 11 | name: req.body.name, 12 | description: req.body.description, 13 | amount: req.body.amount, 14 | date: req.body.date, 15 | statusID: req.body.statusID 16 | }; 17 | 18 | //save the costOfSales in db 19 | costOfSales = await CostOfSales.create(costOfSales); 20 | await Activity.create({ 21 | action: "New CostOfSales Created", 22 | name: req.body.Uname, role: req.body.role, 23 | }); 24 | 25 | return res.json({ 26 | success: true, 27 | data: costOfSales, 28 | // Activity, 29 | message: "costOfSales created successfully", 30 | }); 31 | } catch (err) { 32 | // res.status(500).send({ 33 | // message: 34 | // err.message || "Some error occurred while creating the Tutorial." 35 | // }); 36 | console.log("Error handling =>", err); 37 | // console.log("catch block") 38 | next(); 39 | } 40 | }; 41 | 42 | // list costOfSales 43 | exports.list = async (req, res, next) => { 44 | try { 45 | const uni = await CostOfSales.findAndCountAll(); 46 | let { page, limit, name } = req.query; 47 | 48 | console.log("unitt", uni.count); 49 | console.log("req.queryy", req.query); //name 50 | const filter = {}; 51 | 52 | page = page !== undefined && page !== "" ? parseInt(page) : 1; 53 | limit = limit !== undefined && limit !== "" ? parseInt(limit) : 10; 54 | 55 | if (name) { 56 | filter.name = { $LIKE: name, $options: "gi" }; 57 | } 58 | 59 | const total = uni.count; 60 | 61 | if (page > Math.ceil(total / limit) && total > 0) 62 | page = Math.ceil(total / limit); 63 | 64 | console.log("filter", filter); 65 | const faqs = await CostOfSales.findAll({ 66 | order: [["updatedAt", "DESC"]], 67 | offset: limit * (page - 1), 68 | limit: limit, 69 | where: filter, 70 | }); 71 | console.log("faqs", faqs); 72 | // res.send(uni); 73 | return res.send({ 74 | success: true, 75 | message: "costOfSales fetched successfully", 76 | data: { 77 | faqs, 78 | pagination: { 79 | page, 80 | limit, 81 | total, 82 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit), 83 | }, 84 | }, 85 | }); 86 | } catch (err) { 87 | res.send("costOfSales Error " + err); 88 | } 89 | // next(); 90 | }; 91 | 92 | // API to edit costOfSales 93 | exports.edit = async (req, res, next) => { 94 | try { 95 | let payload = req.body; 96 | const costOfSales = await CostOfSales.update( 97 | // Values to update 98 | payload, 99 | { 100 | // Clause 101 | where: { 102 | id: payload.id, 103 | }, 104 | } 105 | ); 106 | await Activity.create({ 107 | action: "New costOfSales updated", 108 | name: req.body.Uname, role: req.body.role, 109 | }); 110 | 111 | return res.send({ 112 | success: true, 113 | message: "costOfSales updated successfully", 114 | costOfSales, 115 | }); 116 | } catch (error) { 117 | return next(error); 118 | } 119 | }; 120 | 121 | // API to delete costOfSales 122 | exports.delete = async (req, res, next) => { 123 | try { 124 | const { id } = req.params; 125 | if (id) { 126 | const costOfSales = await CostOfSales.destroy({ 127 | where: { id: id }, 128 | }); 129 | await Activity.create({ 130 | action: " costOfSales deleted", 131 | name: "samon", role: "superAdmin" 132 | }); 133 | 134 | if (costOfSales) 135 | return res.send({ 136 | success: true, 137 | message: "costOfSales Page deleted successfully", 138 | id, 139 | }); 140 | else 141 | return res.status(400).send({ 142 | success: false, 143 | message: "costOfSales Page not found for given Id", 144 | }); 145 | } else 146 | return res 147 | .status(400) 148 | .send({ success: false, message: "costOfSales Id is required" }); 149 | } catch (error) { 150 | return next(error); 151 | } 152 | }; 153 | 154 | // API to get by id a costOfSales 155 | exports.get = async (req, res, next) => { 156 | try { 157 | const { id } = req.params; 158 | if (id) { 159 | console.log("oooooooooooooooooooooooo\n", CostOfSales); 160 | const costOfSales = await CostOfSales.findByPk(id); 161 | 162 | if (costOfSales) 163 | return res.json({ 164 | success: true, 165 | message: "costOfSales retrieved successfully", 166 | costOfSales, 167 | }); 168 | else 169 | return res.status(400).send({ 170 | success: false, 171 | message: "costOfSales not found for given Id", 172 | }); 173 | } else 174 | return res 175 | .status(400) 176 | .send({ success: false, message: "costOfSales Id is required" }); 177 | } catch (error) { 178 | return next(error); 179 | } 180 | }; 181 | -------------------------------------------------------------------------------- /src/api/controllers/front/expenses.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../../models"); 2 | const Expenses = db.Expenses; 3 | const Activity = db.Activity; 4 | // create program categorys 5 | exports.create = async (req, res, next) => { 6 | try { 7 | console.log("Req.body expenses controller =====>", req.body); 8 | // 9 | 10 | let expenses = { 11 | name: req.body.name, 12 | description: req.body.description, 13 | amount: req.body.amount, 14 | date: req.body.date, 15 | statusID: req.body.statusID 16 | }; 17 | 18 | //save the expenses in db 19 | expenses = await Expenses.create(expenses); 20 | await Activity.create({ 21 | action: "New Expenses Created", 22 | name: req.body.Uname, role: req.body.role, 23 | }); 24 | 25 | return res.json({ 26 | success: true, 27 | data: expenses, 28 | // Activity, 29 | message: "expenses created successfully", 30 | }); 31 | } catch (err) { 32 | // res.status(500).send({ 33 | // message: 34 | // err.message || "Some error occurred while creating the Tutorial." 35 | // }); 36 | console.log("Error handling =>", err); 37 | // console.log("catch block") 38 | next(); 39 | } 40 | }; 41 | 42 | // list expenses 43 | exports.list = async (req, res, next) => { 44 | try { 45 | const uni = await Expenses.findAndCountAll(); 46 | let { page, limit, name } = req.query; 47 | 48 | console.log("unitt", uni.count); 49 | console.log("req.queryy", req.query); //name 50 | const filter = {}; 51 | 52 | page = page !== undefined && page !== "" ? parseInt(page) : 1; 53 | limit = limit !== undefined && limit !== "" ? parseInt(limit) : 10; 54 | 55 | if (name) { 56 | filter.name = { $LIKE: name, $options: "gi" }; 57 | } 58 | 59 | const total = uni.count; 60 | 61 | if (page > Math.ceil(total / limit) && total > 0) 62 | page = Math.ceil(total / limit); 63 | 64 | console.log("filter", filter); 65 | const faqs = await Expenses.findAll({ 66 | order: [["updatedAt", "DESC"]], 67 | offset: limit * (page - 1), 68 | limit: limit, 69 | where: filter, 70 | }); 71 | console.log("faqs", faqs); 72 | // res.send(uni); 73 | return res.send({ 74 | success: true, 75 | message: "expenses fetched successfully", 76 | data: { 77 | faqs, 78 | pagination: { 79 | page, 80 | limit, 81 | total, 82 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit), 83 | }, 84 | }, 85 | }); 86 | } catch (err) { 87 | res.send("expenses Error " + err); 88 | } 89 | // next(); 90 | }; 91 | 92 | // API to edit expenses 93 | exports.edit = async (req, res, next) => { 94 | try { 95 | let payload = req.body; 96 | const expenses = await Expenses.update( 97 | // Values to update 98 | payload, 99 | { 100 | // Clause 101 | where: { 102 | id: payload.id, 103 | }, 104 | } 105 | ); 106 | await Activity.create({ 107 | action: "New expenses updated", 108 | name: req.body.Uname, role: req.body.role, 109 | }); 110 | 111 | return res.send({ 112 | success: true, 113 | message: "expenses updated successfully", 114 | expenses, 115 | }); 116 | } catch (error) { 117 | return next(error); 118 | } 119 | }; 120 | 121 | // API to delete expenses 122 | exports.delete = async (req, res, next) => { 123 | try { 124 | const { id } = req.params; 125 | if (id) { 126 | const expenses = await Expenses.destroy({ 127 | where: { id: id }, 128 | }); 129 | await Activity.create({ 130 | action: " expenses deleted", 131 | name: "samon", role: "superAdmin" 132 | }); 133 | 134 | if (expenses) 135 | return res.send({ 136 | success: true, 137 | message: "expenses Page deleted successfully", 138 | id, 139 | }); 140 | else 141 | return res.status(400).send({ 142 | success: false, 143 | message: "expenses Page not found for given Id", 144 | }); 145 | } else 146 | return res 147 | .status(400) 148 | .send({ success: false, message: "expenses Id is required" }); 149 | } catch (error) { 150 | return next(error); 151 | } 152 | }; 153 | 154 | // API to get by id a expenses 155 | exports.get = async (req, res, next) => { 156 | try { 157 | const { id } = req.params; 158 | if (id) { 159 | console.log("oooooooooooooooooooooooo\n", Expenses); 160 | const expenses = await Expenses.findByPk(id); 161 | 162 | if (expenses) 163 | return res.json({ 164 | success: true, 165 | message: "expenses retrieved successfully", 166 | expenses, 167 | }); 168 | else 169 | return res.status(400).send({ 170 | success: false, 171 | message: "expenses not found for given Id", 172 | }); 173 | } else 174 | return res 175 | .status(400) 176 | .send({ success: false, message: "expenses Id is required" }); 177 | } catch (error) { 178 | return next(error); 179 | } 180 | }; 181 | -------------------------------------------------------------------------------- /src/api/controllers/front/properties.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../../models"); 2 | const Property = db.Property; 3 | const Activity = db.Activity; 4 | 5 | // create Property 6 | exports.create = async (req, res, next) => { 7 | try { 8 | let payload = req.body; 9 | console.log("payload", payload); 10 | //save the property in db 11 | let property = await Property.create(payload); 12 | await Activity.create({ action: "New property Created", name: req.body.Uname, role: req.body.role }); 13 | 14 | return res.json({ 15 | success: true, 16 | data: property, 17 | message: "property created successfully", 18 | }); 19 | } catch (err) { 20 | next(); 21 | } 22 | }; 23 | 24 | // list Propertyies 25 | exports.list = async (req, res, next) => { 26 | try { 27 | const uni = await Property.findAndCountAll(); 28 | 29 | let { page, limit, name } = req.query; 30 | 31 | console.log("unitt", uni.count); 32 | console.log("req.queryy", req.query); //name 33 | const filter = {}; 34 | 35 | page = page !== undefined && page !== "" ? parseInt(page) : 1; 36 | limit = limit !== undefined && limit !== "" ? parseInt(limit) : 10; 37 | 38 | if (name) { 39 | filter.name = { $LIKE: name, $options: "gi" }; 40 | } 41 | 42 | const total = uni.count; 43 | 44 | if (page > Math.ceil(total / limit) && total > 0) 45 | page = Math.ceil(total / limit); 46 | 47 | console.log("filter", filter); 48 | const faqs = await Property.findAll({ 49 | order: [["updatedAt", "DESC"]], 50 | offset: limit * (page - 1), 51 | limit: limit, 52 | where: filter, 53 | }); 54 | console.log("faqs", faqs); 55 | // res.send(uni); 56 | return res.send({ 57 | success: true, 58 | message: "Properties fetched successfully", 59 | data: { 60 | faqs, 61 | pagination: { 62 | page, 63 | limit, 64 | total, 65 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit), 66 | }, 67 | }, 68 | }); 69 | } catch (err) { 70 | res.send("property Error " + err); 71 | } 72 | // next(); 73 | }; 74 | 75 | // API to edit property 76 | exports.edit = async (req, res, next) => { 77 | try { 78 | let payload = req.body; 79 | const property = await Property.update( 80 | // Values to update 81 | payload, 82 | { 83 | // Clause 84 | where: { 85 | id: payload.id, 86 | }, 87 | } 88 | ); 89 | await Activity.create({ action: "property updated", name: req.body.Uname, role: req.body.role }); 90 | 91 | return res.send({ 92 | success: true, 93 | message: "property updated successfully", 94 | property, 95 | }); 96 | } catch (error) { 97 | return next(error); 98 | } 99 | }; 100 | 101 | // API to delete property 102 | exports.delete = async (req, res, next) => { 103 | try { 104 | const { id } = req.params; 105 | if (id) { 106 | const property = await Property.destroy({ where: { id: id } }); 107 | 108 | await Activity.create({ action: "property deleted", 109 | name: "samon", role: "superAdmin" 110 | }); 111 | if (property) 112 | return res.send({ 113 | success: true, 114 | message: "property Page deleted successfully", 115 | id, 116 | }); 117 | else 118 | return res.status(400).send({ 119 | success: false, 120 | message: "property Page not found for given Id", 121 | }); 122 | } else 123 | return res 124 | .status(400) 125 | .send({ success: false, message: "property Id is required" }); 126 | } catch (error) { 127 | return next(error); 128 | } 129 | }; 130 | 131 | // API to get by id a property 132 | exports.get = async (req, res, next) => { 133 | try { 134 | const { id } = req.params; 135 | if (id) { 136 | const property = await Property.findByPk(id); 137 | 138 | if (property) 139 | return res.json({ 140 | success: true, 141 | message: "property retrieved successfully", 142 | property, 143 | }); 144 | else 145 | return res.status(400).send({ 146 | success: false, 147 | message: "property not found for given Id", 148 | }); 149 | } else 150 | return res 151 | .status(400) 152 | .send({ success: false, message: "property Id is required" }); 153 | } catch (error) { 154 | return next(error); 155 | } 156 | }; 157 | -------------------------------------------------------------------------------- /src/api/controllers/front/sales.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../../models"); 2 | const Sales = db.Sales; 3 | const Activity = db.Activity; 4 | // create program categorys 5 | exports.create = async (req, res, next) => { 6 | try { 7 | console.log("Req.body sales controller =====>", req.body); 8 | // 9 | 10 | let sales = { 11 | name: req.body.name, 12 | description: req.body.description, 13 | amount: req.body.amount, 14 | date: req.body.date, 15 | statusID: req.body.statusID 16 | }; 17 | 18 | //save the sales in db 19 | sales = await Sales.create(sales); 20 | await Activity.create({ 21 | action: "New Sales Created", 22 | name: req.body.Uname, role: req.body.role, 23 | }); 24 | 25 | return res.json({ 26 | success: true, 27 | data: sales, 28 | // Activity, 29 | message: "sales created successfully", 30 | }); 31 | } catch (err) { 32 | // res.status(500).send({ 33 | // message: 34 | // err.message || "Some error occurred while creating the Tutorial." 35 | // }); 36 | console.log("Error handling =>", err); 37 | // console.log("catch block") 38 | next(); 39 | } 40 | }; 41 | 42 | // list sales 43 | exports.list = async (req, res, next) => { 44 | try { 45 | const uni = await Sales.findAndCountAll(); 46 | let { page, limit, name } = req.query; 47 | 48 | console.log("unitt", uni.count); 49 | console.log("req.queryy", req.query); //name 50 | const filter = {}; 51 | 52 | page = page !== undefined && page !== "" ? parseInt(page) : 1; 53 | limit = limit !== undefined && limit !== "" ? parseInt(limit) : 10; 54 | 55 | if (name) { 56 | filter.name = { $LIKE: name, $options: "gi" }; 57 | } 58 | 59 | const total = uni.count; 60 | 61 | if (page > Math.ceil(total / limit) && total > 0) 62 | page = Math.ceil(total / limit); 63 | 64 | console.log("filter", filter); 65 | const faqs = await Sales.findAll({ 66 | order: [["updatedAt", "DESC"]], 67 | offset: limit * (page - 1), 68 | limit: limit, 69 | where: filter, 70 | }); 71 | console.log("faqs", faqs); 72 | // res.send(uni); 73 | return res.send({ 74 | success: true, 75 | message: "program categorys fetched successfully", 76 | data: { 77 | faqs, 78 | pagination: { 79 | page, 80 | limit, 81 | total, 82 | pages: Math.ceil(total / limit) <= 0 ? 1 : Math.ceil(total / limit), 83 | }, 84 | }, 85 | }); 86 | } catch (err) { 87 | res.send("sales Error " + err); 88 | } 89 | // next(); 90 | }; 91 | 92 | // API to edit sales 93 | exports.edit = async (req, res, next) => { 94 | try { 95 | let payload = req.body; 96 | const sales = await Sales.update( 97 | // Values to update 98 | payload, 99 | { 100 | // Clause 101 | where: { 102 | id: payload.id, 103 | }, 104 | } 105 | ); 106 | await Activity.create({ 107 | action: "New sales updated", 108 | name: req.body.Uname, role: req.body.role, 109 | }); 110 | 111 | return res.send({ 112 | success: true, 113 | message: "sales updated successfully", 114 | sales, 115 | }); 116 | } catch (error) { 117 | return next(error); 118 | } 119 | }; 120 | 121 | // API to delete sales 122 | exports.delete = async (req, res, next) => { 123 | try { 124 | const { id } = req.params; 125 | if (id) { 126 | const sales = await Sales.destroy({ 127 | where: { id: id }, 128 | }); 129 | await Activity.create({ 130 | action: " sales deleted", 131 | name: "samon", role: "superAdmin" 132 | }); 133 | 134 | if (sales) 135 | return res.send({ 136 | success: true, 137 | message: "sales Page deleted successfully", 138 | id, 139 | }); 140 | else 141 | return res.status(400).send({ 142 | success: false, 143 | message: "sales Page not found for given Id", 144 | }); 145 | } else 146 | return res 147 | .status(400) 148 | .send({ success: false, message: "sales Id is required" }); 149 | } catch (error) { 150 | return next(error); 151 | } 152 | }; 153 | 154 | // API to get by id a sales 155 | exports.get = async (req, res, next) => { 156 | try { 157 | const { id } = req.params; 158 | if (id) { 159 | console.log("oooooooooooooooooooooooo\n", Sales); 160 | const sales = await Sales.findByPk(id); 161 | 162 | if (sales) 163 | return res.json({ 164 | success: true, 165 | message: "sales retrieved successfully", 166 | sales, 167 | }); 168 | else 169 | return res.status(400).send({ 170 | success: false, 171 | message: "sales not found for given Id", 172 | }); 173 | } else 174 | return res 175 | .status(400) 176 | .send({ success: false, message: "sales Id is required" }); 177 | } catch (error) { 178 | return next(error); 179 | } 180 | }; 181 | -------------------------------------------------------------------------------- /src/api/controllers/front/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Hi, Troy Martin. Welcome to QETC! 8 | 91 | 92 | 93 | 94 |

Hi, {{ name }}. Welcome to QETC!

95 |

Dear Customer

96 |
Here is your code to confirm your e-mail l for become a part ot the Community of 97 | Mathematicaians.
98 |
99 | 100 |
{{usercode}}
101 |
102 |

Best Regards

103 |

GROTHENDIECK

104 | 105 | 106 | -------------------------------------------------------------------------------- /src/api/middlewares/error.js: -------------------------------------------------------------------------------- 1 | const httpStatus = require('http-status'); 2 | const expressValidation = require('express-validation'); 3 | const APIError = require('../utils/APIError'); 4 | const { env } = require('../../config/vars'); 5 | const { check } = require('express-validator') 6 | 7 | /** 8 | * Error handler. Send stacktrace only during development 9 | * @public 10 | */ 11 | const handler = (err, req, res, next) => { 12 | const response = { 13 | code: err.status, 14 | message: err.message || httpStatus[err.status], 15 | errors: err.errors, 16 | stack: err.stack, 17 | }; 18 | 19 | if (env !== 'development') { 20 | delete response.stack; 21 | } 22 | 23 | res.status(err.status); 24 | res.json(response); 25 | }; 26 | exports.handler = handler; 27 | 28 | /** 29 | * If error is not an instanceOf APIError, convert it. 30 | * @public 31 | */ 32 | exports.converter = (err, req, res, next) => { 33 | let convertedError = err; 34 | 35 | if (err instanceof expressValidation.ValidationError) { 36 | convertedError = new APIError({ 37 | message: 'Erro de Validação', 38 | errors: err.errors, 39 | status: err.status, 40 | stack: err.stack, 41 | }); 42 | } else if (!(err instanceof APIError)) { 43 | convertedError = new APIError({ 44 | message: err.message, 45 | status: err.status, 46 | stack: err.stack, 47 | }); 48 | } 49 | 50 | return handler(convertedError, req, res); 51 | }; 52 | 53 | /** 54 | * Catch 404 and forward to error handler 55 | * @public 56 | */ 57 | exports.notFound = (req, res, next) => { 58 | const err = new APIError({ 59 | message: 'We can not find something similar to this', 60 | status: httpStatus.NOT_FOUND, 61 | }); 62 | return handler(err, req, res); 63 | }; 64 | 65 | /** 66 | * Catch 422 for duplicate key 67 | * @public 68 | */ 69 | exports.checkDuplicate = (err, res, name = '') => { 70 | if (err.code === 11000 || err.code === 11001) { 71 | let message = `${name} with same `; 72 | if (err.errmsg.includes('email_1')) 73 | message += 'email already exists'; 74 | else { 75 | const pathRegex = err.message.match(/\.\$([a-z]+)/) 76 | const path = pathRegex ? pathRegex[1] : ''; 77 | const keyRegex = err.message.match(/key:\s+{\s+:\s\"(.*)(?=\")/) 78 | const key = keyRegex ? keyRegex[1] : ''; 79 | message = `'${path}' '${key}' already exists`; 80 | } 81 | return res.status(200).send({ success: false, message }); 82 | } 83 | }; 84 | 85 | exports.validationOptions = [ 86 | check('name', 'Name should be atleast me 3 characters long') 87 | .exists() 88 | .isLength({ min: 3 }), 89 | check('email', 'Invalid Email') 90 | .isEmail() 91 | .normalizeEmail(), 92 | check('password', 'Password should be atleast 8 characters long') 93 | .exists() 94 | .isLength({ min: 8 }), 95 | check( 96 | 'confirmpassword','Passwords do not match') 97 | .exists() 98 | .custom((value, { req }) => value === req.body.password), 99 | check( 100 | 'status','Status is required') 101 | .exists() 102 | 103 | ] -------------------------------------------------------------------------------- /src/api/middlewares/front/auth.js: -------------------------------------------------------------------------------- 1 | const byPassedRoutes = ['/v1/cron/conversion/rate/','/v1/admin/staff/create','/v1/front/test','/v1/front/auth/login','/v1/admin/staff/login','/v1/front/auth/register','/v1/front/auth/login','/v1/front/auth/forgot-password','/v1/front/auth/reset-password','/v1/mobile/auth/sigin','/v1/mobile/auth/signup','/v1/mobile/auth/forgotPassword','/v1/front/games/get-games']; 2 | const User = require('../../models/users.model'); 3 | const Admin = require('../../models/admin.model') 4 | const CryptoJS = require("crypto-js"); 5 | const { pwEncryptionKey, frontEncSecret } = require('./../../../config/vars'); 6 | const jwt = require('jsonwebtoken'); 7 | 8 | exports.authenticate = async (req, res, next) => { 9 | if (req.originalUrl.indexOf("/v1/") > -1) { 10 | if (byPassedRoutes.indexOf(req.originalUrl) > -1 || req.originalUrl.indexOf("/v1/xyz") > -1) { 11 | next(); 12 | } 13 | else { 14 | if (req.headers['x-auth-token']) { 15 | var decryption_string = req.headers['x-auth-token']; 16 | 17 | if (req.token) { 18 | var bytes = CryptoJS.AES.decrypt(req.token, decryption_string); 19 | // var decryptedData = bytes.toString(CryptoJS.enc.Utf8); 20 | // if (decryptedData !== frontEncSecret) { 21 | // const message = 'auth_request_required_front_error1' 22 | // return res.status(405).json({ success: false, message }); 23 | // } 24 | // else { 25 | next(); 26 | // } 27 | } 28 | else if (req.method.toLocaleLowerCase() !== 'options') { 29 | const message = 'auth_request_required_front_error2' 30 | return res.status(405).json({ success: false, message }); 31 | } 32 | else { 33 | next(); 34 | } 35 | } 36 | else if (req.method.toLocaleLowerCase() !== 'options' && 37 | (req.url.indexOf('/v1/admin/staff/private-admin') > -1)) { 38 | next() 39 | } 40 | else if (req.method.toLocaleLowerCase() !== 'options') { 41 | const message = 'auth_request_required_front_error3' 42 | return res.status(405).json({ success: false, message }); 43 | } 44 | else { 45 | next(); 46 | } 47 | } 48 | } 49 | else { 50 | next(); 51 | } 52 | } 53 | 54 | exports.userValidation = async (req, res, next) => { 55 | let flag = true; 56 | req.user = 0; 57 | if (req.headers['x-access-token']) { 58 | await jwt.verify(req.headers['x-access-token'], pwEncryptionKey, async (err, authorizedData) => { 59 | if (err) { 60 | flag = false; 61 | const message = 'session_expired_front_error' 62 | return res.send({ success: false, userDisabled: true, message, err }); 63 | } 64 | else { 65 | const reqPlatform = Number(req.headers['user-platform']) 66 | req.user = authorizedData.sub; 67 | if (reqPlatform === 1) { 68 | let user = await User.findById({ _id: req.user }).lean(); 69 | if (!user) { 70 | flag = false; 71 | return res.send({ success: false, user404: true, message: 'There is no account linked to that id', notExist: 1 }); 72 | } 73 | } 74 | else if (reqPlatform === 2) { 75 | let admin = await Admin.findById({ _id: req.user }).lean(); 76 | if (!admin) { 77 | flag = false; 78 | return res.send({ success: false, user404: true, message: 'There is no account linked to that id', notExist: 1 }); 79 | } 80 | } 81 | } 82 | }) 83 | } 84 | else if (req.method.toLocaleLowerCase() !== 'options') { 85 | req.user = 0; 86 | } 87 | 88 | if (flag) 89 | next(); 90 | } 91 | -------------------------------------------------------------------------------- /src/api/models-bk/activity.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * Activity Schema 5 | * @private 6 | */ 7 | const ActivitySchema = new mongoose.Schema({ 8 | userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, 9 | type: { type: Number }, 10 | price: { type: Number }, 11 | currency: { type: String } 12 | }, { timestamps: true } 13 | ); 14 | 15 | /** 16 | * @typedef Activities 17 | */ 18 | 19 | module.exports = mongoose.model('Activities', ActivitySchema); 20 | -------------------------------------------------------------------------------- /src/api/models-bk/admin.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const bcrypt = require('bcryptjs'); 3 | const moment = require('moment-timezone'); 4 | const jwt = require('jwt-simple'); 5 | const { 6 | pwdSaltRounds, 7 | jwtExpirationInterval, 8 | pwEncryptionKey 9 | } = require('../../config/vars'); 10 | 11 | /** 12 | * Admin Schema 13 | * @private 14 | */ 15 | const AdminSchema = new mongoose.Schema({ 16 | name: { type: String, required: true }, 17 | email: { type: String, required: true, lowercase: true, unique: true }, 18 | phone: { type: String }, 19 | password: { type: String, required: true }, 20 | roleId: { type: String, required: true }, 21 | status: { type: Boolean, required: true, default: false }, 22 | image: { type: String }, 23 | imageLocal: { type: String }, 24 | resetCode: { type: String } 25 | }, { timestamps: true } 26 | ); 27 | 28 | AdminSchema.methods.verifyPassword = function (password) { 29 | return bcrypt.compareSync(password, this.password); 30 | }; 31 | 32 | AdminSchema.methods.getPasswordHash = async function (password) { 33 | const rounds = pwdSaltRounds ? parseInt(pwdSaltRounds) : 10; 34 | const hash = await bcrypt.hash(password, rounds); 35 | return hash 36 | } 37 | 38 | /** 39 | * Methods 40 | */ 41 | AdminSchema.method({ 42 | transform() { 43 | const transformed = {}; 44 | const fields = ['email']; 45 | fields.forEach((field) => { 46 | transformed[field] = this[field]; 47 | }); 48 | return transformed; 49 | }, 50 | 51 | token() { 52 | const playload = { 53 | exp: moment().add(jwtExpirationInterval, 'minutes').unix(), 54 | iat: moment().unix(), 55 | sub: this._id, 56 | }; 57 | return jwt.encode(playload, pwEncryptionKey); 58 | }, 59 | async passwordMatches(password) { 60 | return bcrypt.compare(password, this.password); 61 | } 62 | }); 63 | 64 | AdminSchema.pre('save', async function save(next) { 65 | try { 66 | if (!this.isModified('password')) return next(); 67 | const rounds = pwdSaltRounds ? parseInt(pwdSaltRounds) : 10; 68 | const hash = await bcrypt.hash(this.password, rounds); 69 | this.password = hash; 70 | return next(); 71 | } 72 | catch (error) { 73 | return next(error); 74 | } 75 | }); 76 | 77 | /** 78 | * @typedef Admin 79 | */ 80 | 81 | module.exports = mongoose.model('Admin', AdminSchema); -------------------------------------------------------------------------------- /src/api/models-bk/cms.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * CMS Schema 5 | * @private 6 | */ 7 | const CMSSchema = new mongoose.Schema({ 8 | title: { type: String, required: true, unique: true }, 9 | slug: { type: String, required: true, unique: true }, 10 | description: { type: String, required: true }, 11 | status: { type: Boolean, default: false }, 12 | showInFooter: { type: Boolean, default: false } 13 | }, { timestamps: true } 14 | ); 15 | 16 | /** 17 | * @typedef CMS 18 | */ 19 | 20 | module.exports = mongoose.model('cms', CMSSchema); -------------------------------------------------------------------------------- /src/api/models-bk/contact.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * Contact Schema 5 | * @private 6 | */ 7 | const ContactSchema = new mongoose.Schema({ 8 | name: { type: String }, 9 | email: { type: String, required: true }, 10 | country: { type: String }, 11 | message: { type: String }, 12 | status: { type: Number, default: 1 } // 0 == In Progress, 1 == Pending, 2 == Closed 13 | }, { timestamps: true } 14 | ); 15 | 16 | /** 17 | * @typedef Contact 18 | */ 19 | 20 | 21 | module.exports = mongoose.model('contact', ContactSchema); -------------------------------------------------------------------------------- /src/api/models-bk/email.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * Email Schema 5 | * @private 6 | */ 7 | const EmailSchema = new mongoose.Schema({ 8 | type: { type: String, required: true, unique: true }, 9 | subject: { type: String, required: true }, 10 | text: { type: String, required: true } 11 | }, { timestamps: true } 12 | ); 13 | 14 | /** 15 | * @typedef Email 16 | */ 17 | 18 | module.exports = mongoose.model('Email', EmailSchema); -------------------------------------------------------------------------------- /src/api/models-bk/faq.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * FAQ Schema 5 | * @private 6 | */ 7 | const FaqSchema = new mongoose.Schema({ 8 | title: { type: String, required: true, unique: true }, 9 | catId: { type: mongoose.Schema.Types.ObjectId, ref: 'faq-categories', required: true }, 10 | desc: { type: String, required: true, default: '' }, 11 | status: { type: Boolean, default: false }, 12 | }, { timestamps: true } 13 | ); 14 | 15 | /** 16 | * @typedef FAQ 17 | */ 18 | 19 | module.exports = mongoose.model('faq', FaqSchema); -------------------------------------------------------------------------------- /src/api/models-bk/faqCategories.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * FAQCategories Schema 5 | * @private 6 | */ 7 | const FaqCategoriesSchema = new mongoose.Schema({ 8 | title: { type: String, required: true, unique:true }, 9 | desc: { type: String, required: true, default: ''}, 10 | status: { type: Boolean, default: false}, 11 | }, { timestamps: true } 12 | ); 13 | 14 | /** 15 | * @typedef FAQCategories 16 | */ 17 | 18 | module.exports = mongoose.model('faq-categories', FaqCategoriesSchema); -------------------------------------------------------------------------------- /src/api/models-bk/newsletter.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * Newsletter Schema 5 | * @private 6 | */ 7 | const NewsletterSchema = new mongoose.Schema({ 8 | email: { type: String, required: true, unique: true }, 9 | ip: { type: String, required: true } 10 | }, { timestamps: true } 11 | ); 12 | 13 | /** 14 | * @typedef Newsletter 15 | */ 16 | 17 | module.exports = mongoose.model('Newsletter', NewsletterSchema); -------------------------------------------------------------------------------- /src/api/models-bk/roles.model.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | 3 | const RolesSchema = new mongoose.Schema( 4 | { 5 | title: { type: String, required: true, lowercase: true, unique: true }, 6 | 7 | /** system permissions **/ 8 | 9 | viewDashboard: { type: Boolean, default: false }, 10 | 11 | // staff's records 12 | addStaff: { type: Boolean, default: false }, 13 | editStaff: { type: Boolean, default: false }, 14 | deleteStaff: { type: Boolean, default: false }, 15 | viewStaff: { type: Boolean, default: false }, 16 | 17 | // permissions 18 | addRole: { type: Boolean, default: false }, 19 | editRole: { type: Boolean, default: false }, 20 | deleteRole: { type: Boolean, default: false }, 21 | viewRole: { type: Boolean, default: false }, 22 | 23 | // users records 24 | addUser: { type: Boolean, default: false }, 25 | editUser: { type: Boolean, default: false }, 26 | deleteUser: { type: Boolean, default: false }, 27 | viewUsers: { type: Boolean, default: false }, 28 | 29 | // EmailTemplates 30 | viewEmailTemplates: { type: Boolean, default: false }, 31 | addEmailTemplates: { type: Boolean, default: false }, 32 | editEmailTemplates: { type: Boolean, default: false }, 33 | deleteEmailTemplates: { type: Boolean, default: false }, 34 | 35 | //FaqCategories 36 | viewFaqCategories: { type: Boolean, default: false }, 37 | addFaqCategories: { type: Boolean, default: false }, 38 | editFaqCategories: { type: Boolean, default: false }, 39 | deleteFaqCategories: { type: Boolean, default: false }, 40 | 41 | // FAQs 42 | addFaq: { type: Boolean, default: false }, 43 | editFaq: { type: Boolean, default: false }, 44 | deleteFaq: { type: Boolean, default: false }, 45 | viewFaqs: { type: Boolean, default: false }, 46 | 47 | // content 48 | viewContent: { type: Boolean, default: false }, 49 | addContent: { type: Boolean, default: false }, 50 | editContent: { type: Boolean, default: false }, 51 | deleteContent: { type: Boolean, default: false }, 52 | 53 | // contact 54 | viewContact: { type: Boolean, default: false }, 55 | editContact: { type: Boolean, default: false }, 56 | deleteContact: { type: Boolean, default: false }, 57 | 58 | // settings 59 | viewSetting: { type: Boolean, default: false }, 60 | editSetting: { type: Boolean, default: false }, 61 | 62 | // newsletter/subscriptions 63 | viewNewsLetter: { type: Boolean, default: false }, 64 | 65 | // status (i.e: true for active & false for in-active) 66 | status: { type: Boolean, default: false }, 67 | }, 68 | { 69 | timestamps: true 70 | } 71 | ); 72 | 73 | RolesSchema.index({ identityNumber: 'title' }); 74 | 75 | module.exports = mongoose.model("Roles", RolesSchema); 76 | -------------------------------------------------------------------------------- /src/api/models-bk/settings.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | /** 4 | * Settings Schema 5 | * @private 6 | */ 7 | const SettingsSchema = new mongoose.Schema({ 8 | email: { type: String, default: '' }, 9 | address: { type: String, default: '' }, 10 | 11 | discord: { type: String, default: '' }, 12 | twitter: { type: String, default: '' }, 13 | youtube: { type: String, default: '' }, 14 | instagram: { type: String, default: '' }, 15 | medium: { type: String, default: '' }, 16 | reddit: { type: String, default: '' }, 17 | telegram: { type: String, default: '' }, 18 | github: { type: String, default: '' }, 19 | linkedIn: { type: String, default: '' }, 20 | facebook: { type: String, default: '' }, 21 | 22 | desc: { type: String, default: '' }, 23 | domain: { type: String, default: '' }, 24 | api: { type: String, default: '' }, 25 | referrarPercentage: { type: Number }, 26 | }, { timestamps: true } 27 | ); 28 | 29 | /** 30 | * @typedef Settings 31 | */ 32 | 33 | module.exports = mongoose.model('Settings', SettingsSchema); -------------------------------------------------------------------------------- /src/api/models-bk/users.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const bcrypt = require('bcryptjs'); 3 | const moment = require('moment-timezone'); 4 | const jwt = require('jwt-simple'); 5 | const { 6 | pwdSaltRounds, 7 | jwtExpirationInterval, 8 | pwEncryptionKey, 9 | uploadedImgPath 10 | } = require('../../config/vars'); 11 | 12 | /** 13 | * User Schema 14 | * @private 15 | */ 16 | const UserSchema = new mongoose.Schema({ 17 | firstName: { type: String }, 18 | lastName: { type: String }, 19 | dob: { type: Date }, 20 | referralKey: { type: String }, 21 | refferedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, 22 | email: { type: String, required: true, lowercase: true, unique: true }, 23 | password: { type: String, required: true }, 24 | status: { type: Boolean, default: true }, 25 | resetPasswordToken: { type: String }, 26 | connectedWalletAddress: { type: String }, 27 | profileImage: { type: String }, 28 | bannerImage: { type: String }, 29 | profileImageLocal: { type: String }, 30 | bannerImageLocal: { type: String }, 31 | userLevel: { type: Number, default: 0 }, //0- Basic, 1- Bronze, 2-Silver, 3- Gold, 4-Platinum 32 | userSubLevel: { type: Number }, //1,2,3 33 | userKeyStatus: { type: Number, required: true, default: 1 }, // 1- Non Verified KYC, 2- Verification Of KYC, 3- KYC Verified 34 | twoFactorTempSecret: { type: String }, 35 | twoFactorEnabled: { type: Boolean, default: false }, 36 | referralBonus: { type: Number, default: 0 }, 37 | deletedAccount: { type: Boolean, default: false } 38 | }, { timestamps: true } 39 | ); 40 | 41 | /** 42 | * Methods 43 | */ 44 | 45 | UserSchema.method({ 46 | verifyPassword(password) { 47 | return bcrypt.compareSync(password, this.password); 48 | }, 49 | transform() { 50 | const transformed = {}; 51 | const fields = ['_id', 'firstName', 'lastName', 'email', 'profileImage', 'status', 'dob', 'connectedWalletAddress', 'bannerImage', 'referralKey', 'userKeyStatus', 'refferedBy', 'referralBonus']; 52 | 53 | fields.forEach((field) => { 54 | transformed[field] = this[field]; 55 | }); 56 | 57 | return transformed; 58 | }, 59 | 60 | token() { 61 | const playload = { 62 | exp: moment().add(jwtExpirationInterval, 'minutes').unix(), 63 | iat: moment().unix(), 64 | sub: this._id, 65 | }; 66 | return jwt.encode(playload, pwEncryptionKey); 67 | }, 68 | }); 69 | 70 | UserSchema.pre('save', async function save(next) { 71 | try { 72 | if (!this.isModified('password')) return next(); 73 | const rounds = pwdSaltRounds ? parseInt(pwdSaltRounds) : 10; 74 | const hash = await bcrypt.hash(this.password, rounds); 75 | this.password = hash; 76 | return next(); 77 | } 78 | catch (error) { 79 | return next(error); 80 | } 81 | }); 82 | 83 | /** 84 | * @typedef User 85 | */ 86 | 87 | module.exports = mongoose.model('User', UserSchema); -------------------------------------------------------------------------------- /src/api/models/acctivity.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Activity extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | // Activity.hasOne(models.Users, { foreignKey: "userId" }); 13 | Activity.belongsTo(models.Users, { foreignKey: "userID" }); 14 | } 15 | } 16 | Activity.init( 17 | { 18 | action: DataTypes.STRING, 19 | name: DataTypes.STRING, 20 | role: DataTypes.STRING 21 | }, 22 | { 23 | sequelize, 24 | modelName: "Activity", 25 | tableName: "activities", 26 | } 27 | ); 28 | return Activity; 29 | }; 30 | -------------------------------------------------------------------------------- /src/api/models/applicants.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Applicants extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | Applicants.hasOne(models.ApplicationDetails); 13 | // University.hasMany(models.Campus); 14 | } 15 | } 16 | Applicants.init( 17 | { 18 | fullName: DataTypes.STRING, 19 | email: DataTypes.STRING, 20 | phoneNumber: DataTypes.STRING, 21 | address1: DataTypes.STRING, 22 | address2: DataTypes.STRING, 23 | country: DataTypes.STRING, 24 | image: DataTypes.STRING, 25 | passportNo: DataTypes.STRING, 26 | fileUpload: DataTypes.STRING, 27 | // applicantsId: DataTypes.INTEGER 28 | }, 29 | { 30 | sequelize, 31 | modelName: "Applicants", 32 | tableName: "applicants", 33 | } 34 | ); 35 | return Applicants; 36 | }; 37 | -------------------------------------------------------------------------------- /src/api/models/applicationdetails.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class ApplicationDetails extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | ApplicationDetails.belongsTo(models.Applicants); 13 | ApplicationDetails.belongsTo(models.ApplicationModuleStatus, { 14 | foreignKey: "status", 15 | }); 16 | ApplicationDetails.belongsTo(models.Branch, { 17 | foreignKey: "branchID", 18 | }); 19 | } 20 | } 21 | ApplicationDetails.init( 22 | { 23 | applicationLevel: DataTypes.STRING, 24 | interestedProgramme: DataTypes.STRING, 25 | schoolName: DataTypes.STRING, 26 | qualificationType: DataTypes.STRING, 27 | selectUniversity: DataTypes.STRING, 28 | completionLetter: DataTypes.STRING, 29 | programmeLevel: DataTypes.STRING, 30 | healthForm: DataTypes.STRING, 31 | paymentReceipt: DataTypes.STRING, 32 | researchProposal: DataTypes.STRING, 33 | refreeForm: DataTypes.STRING, 34 | medium: DataTypes.STRING, 35 | scholorshipForm: DataTypes.STRING, 36 | otherDocuments: DataTypes.STRING, 37 | attestationLetter: DataTypes.STRING, 38 | releaseLetter: DataTypes.STRING, 39 | status: DataTypes.STRING, 40 | // applicantsId: DataTypes.INTEGER 41 | }, 42 | { 43 | sequelize, 44 | modelName: "ApplicationDetails", 45 | tableName: "applicationdetails", 46 | } 47 | ); 48 | return ApplicationDetails; 49 | }; 50 | -------------------------------------------------------------------------------- /src/api/models/applicationmodulestatus.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class ApplicationModuleStatus extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | ApplicationModuleStatus.hasMany(models.ApplicationDetails, { 15 | foreignKey: "status", 16 | }); 17 | } 18 | } 19 | ApplicationModuleStatus.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | name: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | }, 38 | Color: { 39 | type: DataTypes.STRING, 40 | allowNull: false, 41 | }, 42 | }, 43 | { 44 | sequelize, 45 | modelName: "ApplicationModuleStatus", 46 | tableName: "applicationmodulestatus", 47 | } 48 | ); 49 | // const level = await ApplicationModuleStatus.findAll(); 50 | return ApplicationModuleStatus; 51 | }; 52 | -------------------------------------------------------------------------------- /src/api/models/billinginfo.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class BillingInfo extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | BillingInfo.hasMany(models.CommissionInvoice, { 15 | foreignKey: "billingID", 16 | }); 17 | } 18 | } 19 | BillingInfo.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | addressOne: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | }, 38 | addressTwo: { 39 | type: DataTypes.STRING, 40 | allowNull: false, 41 | }, 42 | country: { 43 | type: DataTypes.STRING, 44 | allowNull: false, 45 | }, 46 | phone: { 47 | type: DataTypes.STRING, 48 | allowNull: false, 49 | }, 50 | email: { 51 | type: DataTypes.STRING, 52 | allowNull: false, 53 | }, 54 | }, 55 | { 56 | sequelize, 57 | modelName: "BillingInfo", 58 | tableName: "BillingInfo".toLowerCase(), 59 | } 60 | ); 61 | // const level = await BillingInfo.findAll(); 62 | return BillingInfo; 63 | }; 64 | -------------------------------------------------------------------------------- /src/api/models/branch.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Branch extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | Branch.hasMany(models.CommissionInvoice, { 13 | foreignKey: "branchID", 14 | }); 15 | Branch.hasMany(models.ApplicationDetails, { 16 | foreignKey: "branchID", 17 | }); 18 | Branch.hasMany(models.Lead, { 19 | foreignKey: "branchID", 20 | }); 21 | Branch.hasMany(models.Users, { 22 | foreignKey: "branchID", 23 | }); 24 | } 25 | } 26 | Branch.init( 27 | { 28 | name: DataTypes.STRING, 29 | address: DataTypes.STRING, 30 | country: DataTypes.STRING, 31 | manager: DataTypes.STRING, 32 | email: DataTypes.STRING, 33 | phone: DataTypes.STRING, 34 | role: DataTypes.STRING 35 | }, 36 | { 37 | sequelize, 38 | modelName: "Branch", 39 | tableName: "branches", 40 | } 41 | ); 42 | return Branch; 43 | }; 44 | -------------------------------------------------------------------------------- /src/api/models/campus.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Campus extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | Campus.belongsTo(models.University), { foreignKey: "universityId" }; 13 | } 14 | } 15 | Campus.init( 16 | { 17 | name: DataTypes.STRING, 18 | address1: DataTypes.STRING, 19 | address2: DataTypes.STRING, 20 | phone: DataTypes.INTEGER, 21 | email: DataTypes.STRING, 22 | isMain: DataTypes.BOOLEAN, 23 | }, 24 | { 25 | sequelize, 26 | modelName: "Campus", 27 | tableName: "campuses", 28 | } 29 | ); 30 | return Campus; 31 | }; 32 | -------------------------------------------------------------------------------- /src/api/models/commissioninvoice.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class CommissionInvoice extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | CommissionInvoice.belongsTo(models.University, { 15 | foreignKey: "universityID", 16 | }); 17 | CommissionInvoice.belongsTo(models.InvoiceModuleStatus, { 18 | foreignKey: "statusID", 19 | }); 20 | CommissionInvoice.belongsTo(models.Branch, { 21 | foreignKey: "branchID", 22 | }); 23 | CommissionInvoice.belongsTo(models.BillingInfo, { 24 | foreignKey: "billingID", 25 | }); 26 | CommissionInvoice.belongsTo(models.MailingInfo, { 27 | foreignKey: "mailingID", 28 | }); 29 | CommissionInvoice.hasMany(models.CommissionInvoiceItem, { 30 | foreignKey: "invoiceID", 31 | }); 32 | } 33 | } 34 | CommissionInvoice.init( 35 | { 36 | ID: { 37 | type: DataTypes.INTEGER, 38 | autoIncrement: true, 39 | allowNull: false, 40 | primaryKey: true, 41 | }, 42 | itemdate: { 43 | type: DataTypes.STRING, 44 | allowNull: false, 45 | defaultValue: DataTypes.NOW, 46 | }, 47 | createdAt: { 48 | type: DataTypes.DATE, 49 | defaultValue: DataTypes.NOW, 50 | }, 51 | updatedAt: { 52 | type: DataTypes.DATE, 53 | defaultValue: DataTypes.NOW, 54 | }, 55 | recipient: { 56 | type: DataTypes.STRING, 57 | allowNull: false, 58 | }, 59 | email: { 60 | type: DataTypes.STRING, 61 | allowNull: false, 62 | defaultValue: "*@*", 63 | }, 64 | service: { 65 | type: DataTypes.STRING, 66 | allowNull: true, 67 | }, 68 | amount: { 69 | type: DataTypes.STRING, 70 | allowNull: true, 71 | }, 72 | price: { 73 | type: DataTypes.STRING, 74 | allowNull: true, 75 | }, 76 | statusID: { 77 | type: DataTypes.INTEGER, 78 | allowNull: true, 79 | defaultValue: Math.floor(Math.random() * 4 + 1), 80 | }, 81 | universityID: { 82 | type: DataTypes.INTEGER, 83 | allowNull: true, 84 | defaultValue: Math.floor(Math.random() * 4 + 1), 85 | }, 86 | branchID: { 87 | type: DataTypes.INTEGER, 88 | allowNull: true, 89 | defaultValue: Math.floor(Math.random() * 4 + 1), 90 | }, 91 | billingID: { 92 | type: DataTypes.INTEGER, 93 | allowNull: true, 94 | defaultValue: Math.floor(Math.random() * 4 + 1), 95 | }, 96 | mailingID: { 97 | type: DataTypes.INTEGER, 98 | allowNull: true, 99 | defaultValue: Math.floor(Math.random() * 4 + 1), 100 | }, 101 | type: { 102 | type: DataTypes.STRING, 103 | allowNull: true, 104 | defaultValue: "commission", // or general 105 | }, 106 | }, 107 | { 108 | sequelize, 109 | modelName: "CommissionInvoice", 110 | tableName: "CommissionInvoice".toLowerCase(), 111 | } 112 | ); 113 | // const level = await CommissionInvoice.findAll(); 114 | return CommissionInvoice; 115 | }; 116 | -------------------------------------------------------------------------------- /src/api/models/commissioninvoiceitem.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class CommissionInvoiceItem extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | CommissionInvoiceItem.belongsTo(models.CommissionInvoice, { 15 | foreignKey: "invoiceID", 16 | }); 17 | } 18 | } 19 | CommissionInvoiceItem.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | name: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | defaultValue: "", 38 | }, 39 | price: { 40 | type: DataTypes.STRING, 41 | allowNull: false, 42 | defaultValue: "", 43 | }, 44 | quantity: { 45 | type: DataTypes.STRING, 46 | allowNull: false, 47 | defaultValue: "", 48 | }, 49 | total: { 50 | type: DataTypes.STRING, 51 | allowNull: false, 52 | defaultValue: "", 53 | }, 54 | invoiceID: { 55 | type: DataTypes.INTEGER, 56 | allowNull: false, 57 | defaultValue: 0, 58 | }, 59 | }, 60 | { 61 | sequelize, 62 | modelName: "CommissionInvoiceItem", 63 | tableName: "CommissionInvoiceItem".toLowerCase(), 64 | } 65 | ); 66 | // const level = await CommissionInvoiceItem.findAll(); 67 | return CommissionInvoiceItem; 68 | }; 69 | -------------------------------------------------------------------------------- /src/api/models/costofsales.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class CostOfSales extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | CostOfSales.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | description: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | amount: { 40 | type: DataTypes.STRING, 41 | allowNull: false, 42 | }, 43 | date: { 44 | type: DataTypes.DATE, 45 | allowNull: false, 46 | defaultValue: DataTypes.NOW, 47 | }, 48 | statusID: { 49 | type: DataTypes.INTEGER, 50 | defaultValue: DataTypes.NOW, 51 | }, 52 | }, 53 | { 54 | sequelize, 55 | modelName: "CostOfSales", 56 | tableName: "CostOfSales".toLowerCase(), 57 | } 58 | ); 59 | // const level = await CostOfSales.findAll(); 60 | return CostOfSales; 61 | }; 62 | -------------------------------------------------------------------------------- /src/api/models/currency.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Currency extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | } 13 | } 14 | Currency.init( 15 | { 16 | name: DataTypes.STRING, 17 | iso: DataTypes.STRING, 18 | exRate: DataTypes.INTEGER, 19 | status: DataTypes.INTEGER, 20 | }, 21 | { 22 | sequelize, 23 | modelName: "Currency", 24 | tableName: "currencies", 25 | } 26 | ); 27 | return Currency; 28 | }; 29 | -------------------------------------------------------------------------------- /src/api/models/depitandcredit.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class DepitAndCredit extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | DepitAndCredit.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | description: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | amount: { 40 | type: DataTypes.STRING, 41 | allowNull: false, 42 | }, 43 | type: { 44 | type: DataTypes.INTEGER, 45 | allowNull: false, 46 | defaultValue: 0, 47 | }, 48 | date: { 49 | type: DataTypes.DATE, 50 | allowNull: false, 51 | defaultValue: DataTypes.NOW, 52 | }, 53 | }, 54 | { 55 | sequelize, 56 | modelName: "DepitAndCredit", 57 | tableName: "DepitAndCredit".toLowerCase(), 58 | } 59 | ); 60 | // const level = await DepitAndCredit.findAll(); 61 | return DepitAndCredit; 62 | }; 63 | -------------------------------------------------------------------------------- /src/api/models/expenses.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class Expenses extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | Expenses.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | description: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | amount: { 40 | type: DataTypes.STRING, 41 | allowNull: false, 42 | }, 43 | date: { 44 | type: DataTypes.DATE, 45 | allowNull: false, 46 | defaultValue: DataTypes.NOW, 47 | }, 48 | statusID: { 49 | type: DataTypes.INTEGER, 50 | defaultValue: DataTypes.NOW, 51 | }, 52 | }, 53 | { 54 | sequelize, 55 | modelName: "Expenses", 56 | tableName: "Expenses".toLowerCase(), 57 | } 58 | ); 59 | // const level = await Expenses.findAll(); 60 | return Expenses; 61 | }; 62 | -------------------------------------------------------------------------------- /src/api/models/generalinvoice.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class GeneralInvoice extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | GeneralInvoice.belongsTo(models.University, { 15 | foreignKey: "universityID", 16 | }); 17 | GeneralInvoice.belongsTo(models.InvoiceModuleStatus, { 18 | foreignKey: "statusID", 19 | }); 20 | GeneralInvoice.belongsTo(models.Branch, { 21 | foreignKey: "branchID", 22 | }); 23 | GeneralInvoice.belongsTo(models.BillingInfo, { 24 | foreignKey: "billingID", 25 | }); 26 | GeneralInvoice.belongsTo(models.MailingInfo, { 27 | foreignKey: "mailingID", 28 | }); 29 | GeneralInvoice.hasMany(models.GeneralInvoiceItem, { 30 | foreignKey: "invoiceID", 31 | }); 32 | } 33 | } 34 | GeneralInvoice.init( 35 | { 36 | ID: { 37 | type: DataTypes.INTEGER, 38 | autoIncrement: true, 39 | allowNull: false, 40 | primaryKey: true, 41 | }, 42 | itemdate: { 43 | type: DataTypes.STRING, 44 | allowNull: false, 45 | defaultValue: DataTypes.NOW, 46 | }, 47 | createdAt: { 48 | type: DataTypes.DATE, 49 | defaultValue: DataTypes.NOW, 50 | }, 51 | updatedAt: { 52 | type: DataTypes.DATE, 53 | defaultValue: DataTypes.NOW, 54 | }, 55 | recipient: { 56 | type: DataTypes.STRING, 57 | allowNull: false, 58 | }, 59 | email: { 60 | type: DataTypes.STRING, 61 | allowNull: false, 62 | defaultValue: "*@*", 63 | }, 64 | service: { 65 | type: DataTypes.STRING, 66 | allowNull: true, 67 | defaultValue: "", 68 | }, 69 | amount: { 70 | type: DataTypes.STRING, 71 | allowNull: true, 72 | defaultValue: "", 73 | }, 74 | price: { 75 | type: DataTypes.STRING, 76 | allowNull: true, 77 | defaultValue: "", 78 | }, 79 | statusID: { 80 | type: DataTypes.INTEGER, 81 | allowNull: true, 82 | defaultValue: Math.floor(Math.random() * 4 + 1), 83 | }, 84 | universityID: { 85 | type: DataTypes.INTEGER, 86 | allowNull: true, 87 | defaultValue: Math.floor(Math.random() * 4 + 1), 88 | }, 89 | branchID: { 90 | type: DataTypes.INTEGER, 91 | allowNull: true, 92 | defaultValue: Math.floor(Math.random() * 4 + 1), 93 | }, 94 | billingID: { 95 | type: DataTypes.INTEGER, 96 | allowNull: true, 97 | defaultValue: Math.floor(Math.random() * 4 + 1), 98 | }, 99 | mailingID: { 100 | type: DataTypes.INTEGER, 101 | allowNull: true, 102 | defaultValue: Math.floor(Math.random() * 4 + 1), 103 | }, 104 | type: { 105 | type: DataTypes.STRING, 106 | allowNull: true, 107 | defaultValue: "general", // or general 108 | }, 109 | }, 110 | { 111 | sequelize, 112 | modelName: "GeneralInvoice", 113 | tableName: "GeneralInvoice".toLowerCase(), 114 | } 115 | ); 116 | // const level = await GeneralInvoice.findAll(); 117 | return GeneralInvoice; 118 | }; 119 | -------------------------------------------------------------------------------- /src/api/models/generalinvoiceitem.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class GeneralInvoiceItem extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | GeneralInvoiceItem.belongsTo(models.GeneralInvoice, { 15 | foreignKey: "invoiceID", 16 | }); 17 | } 18 | } 19 | GeneralInvoiceItem.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | name: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | defaultValue: "", 38 | }, 39 | price: { 40 | type: DataTypes.STRING, 41 | allowNull: false, 42 | defaultValue: "", 43 | }, 44 | quantity: { 45 | type: DataTypes.STRING, 46 | allowNull: false, 47 | defaultValue: "", 48 | }, 49 | total: { 50 | type: DataTypes.STRING, 51 | allowNull: false, 52 | defaultValue: "", 53 | }, 54 | invoiceID: { 55 | type: DataTypes.INTEGER, 56 | allowNull: false, 57 | defaultValue: 0, 58 | }, 59 | }, 60 | { 61 | sequelize, 62 | modelName: "GeneralInvoiceItem", 63 | tableName: "GeneralInvoiceItem".toLowerCase(), 64 | } 65 | ); 66 | // const level = await GeneralInvoiceItem.findAll(); 67 | return GeneralInvoiceItem; 68 | }; 69 | -------------------------------------------------------------------------------- /src/api/models/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const fs = require("fs"); 4 | const path = require("path"); 5 | const Sequelize = require("sequelize"); 6 | const process = require("process"); 7 | const basename = path.basename(__filename); 8 | const env = process.env.NODE_ENV || "development"; 9 | const config = require(__dirname + "../../../../config/config.json")[env]; 10 | const db = {}; 11 | 12 | let sequelize; 13 | if (config.use_env_variable) { 14 | sequelize = new Sequelize(process.env[config.use_env_variable], config); 15 | } else { 16 | sequelize = new Sequelize( 17 | config.database, 18 | config.username, 19 | config.password, 20 | config 21 | ); 22 | } 23 | 24 | fs.readdirSync(__dirname) 25 | .filter((file) => { 26 | return ( 27 | file.indexOf(".") !== 0 && 28 | file !== basename && 29 | file.slice(-3) === ".js" && 30 | file.indexOf(".test.js") === -1 31 | ); 32 | }) 33 | .forEach((file) => { 34 | const model = require(path.join(__dirname, file))( 35 | sequelize, 36 | Sequelize.DataTypes 37 | ); 38 | db[model.name] = model; 39 | }); 40 | 41 | Object.keys(db).forEach((modelName) => { 42 | if (db[modelName].associate) { 43 | db[modelName].associate(db); 44 | } 45 | }); 46 | 47 | db.sequelize = sequelize; 48 | db.Sequelize = Sequelize; 49 | 50 | module.exports = db; 51 | -------------------------------------------------------------------------------- /src/api/models/interestedprogram.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class InterestedProgram extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | InterestedProgram.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | Color: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | }, 40 | { 41 | sequelize, 42 | modelName: "InterestedProgram", 43 | tableName: "interestedprogram", 44 | } 45 | ); 46 | // const level = await InterestedProgram.findAll(); 47 | return InterestedProgram; 48 | }; 49 | -------------------------------------------------------------------------------- /src/api/models/invoicemodulestatus.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class InvoiceModuleStatus extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | InvoiceModuleStatus.hasMany(models.CommissionInvoice, { 15 | foreignKey: "statusID", 16 | }); 17 | } 18 | } 19 | InvoiceModuleStatus.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | name: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | }, 38 | Color: { 39 | type: DataTypes.STRING, 40 | allowNull: false, 41 | }, 42 | }, 43 | { 44 | sequelize, 45 | modelName: "InvoiceModuleStatus", 46 | tableName: "InvoiceModuleStatus".toLowerCase(), 47 | } 48 | ); 49 | // const level = await InvoiceModuleStatus.findAll(); 50 | return InvoiceModuleStatus; 51 | }; 52 | -------------------------------------------------------------------------------- /src/api/models/lead.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Lead extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | Lead.hasOne(models.ProgrameDetails, { 13 | foreignKey: "leadId", 14 | as: "ProgrameDetail", 15 | }); 16 | Lead.belongsTo(models.Branch, { 17 | foreignKey: "branchID", 18 | }); 19 | Lead.belongsTo(models.Programme, { 20 | foreignKey: "programID", 21 | }); 22 | Lead.belongsTo(models.LeadsManagmentModuleStatus, { 23 | foreignKey: "statusID", 24 | }); 25 | Lead.belongsTo(models.University, { 26 | foreignKey: "universityID", 27 | }); 28 | } 29 | } 30 | Lead.init( 31 | { 32 | image: DataTypes.STRING, 33 | name: DataTypes.STRING, 34 | passportNo: DataTypes.INTEGER, 35 | leadGroup: DataTypes.STRING, 36 | country: DataTypes.STRING, 37 | phoneNo: DataTypes.STRING, 38 | email: DataTypes.STRING, 39 | refferalName: DataTypes.STRING, 40 | refferalEmail: DataTypes.STRING, 41 | programID: { 42 | type: DataTypes.INTEGER, 43 | allowNull: true, 44 | defaultValue: Math.floor(Math.random() * 4 + 1), 45 | }, 46 | universityID: { 47 | type: DataTypes.INTEGER, 48 | allowNull: true, 49 | defaultValue: Math.floor(Math.random() * 4 + 1), 50 | }, 51 | branchID: { 52 | type: DataTypes.INTEGER, 53 | allowNull: true, 54 | defaultValue: Math.floor(Math.random() * 4 + 1), 55 | }, 56 | statusID: { 57 | type: DataTypes.INTEGER, 58 | allowNull: true, 59 | defaultValue: Math.floor(Math.random() * 4 + 1), 60 | }, 61 | }, 62 | { 63 | sequelize, 64 | modelName: "Lead", 65 | tableName: "leads", 66 | } 67 | ); 68 | return Lead; 69 | }; 70 | -------------------------------------------------------------------------------- /src/api/models/leadgroup.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class LeadGroup extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | LeadGroup.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | Color: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | }, 40 | { 41 | sequelize, 42 | modelName: "LeadGroup", 43 | tableName: "leadgroup", 44 | } 45 | ); 46 | // const level = await LeadGroup.findAll(); 47 | return LeadGroup; 48 | }; 49 | -------------------------------------------------------------------------------- /src/api/models/leadsmanagmentmodulestatus.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class LeadsManagmentModuleStatus extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | // LeadsManagmentModuleStatus.belongsTo(models.ProgrameDetails, { 15 | // foreignKey: "I", 16 | // }); 17 | // } 18 | LeadsManagmentModuleStatus.hasMany(models.ProgrameDetails, { 19 | foreignKey: "status", 20 | }); 21 | // edits 22 | LeadsManagmentModuleStatus.hasMany(models.Lead, { 23 | foreignKey: "statusID", 24 | }); 25 | // 26 | // LeadsManagmentModuleStatus.belongsToMany(models.ProgrameDetails, { 27 | // foreignKey: "status", 28 | // }); 29 | } 30 | } 31 | LeadsManagmentModuleStatus.init( 32 | { 33 | ID: { 34 | type: DataTypes.INTEGER, 35 | primaryKey: true, 36 | autoIncrement: true, 37 | }, 38 | createdAt: { 39 | type: DataTypes.DATE, 40 | defaultValue: DataTypes.NOW, 41 | }, 42 | updatedAt: { 43 | type: DataTypes.DATE, 44 | defaultValue: DataTypes.NOW, 45 | }, 46 | name: { 47 | type: DataTypes.STRING, 48 | allowNull: false, 49 | }, 50 | Color: { 51 | type: DataTypes.STRING, 52 | allowNull: false, 53 | }, 54 | }, 55 | { 56 | sequelize, 57 | modelName: "LeadsManagmentModuleStatus", 58 | tableName: "LeadsManagmentModuleStatus".toLowerCase(), 59 | } 60 | ); 61 | // const level = await LeadsManagmentModuleStatus.findAll(); 62 | return LeadsManagmentModuleStatus; 63 | }; 64 | -------------------------------------------------------------------------------- /src/api/models/mailinginfo.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class MailingInfo extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | MailingInfo.hasMany(models.CommissionInvoice, { 15 | foreignKey: "mailingID", 16 | }); 17 | } 18 | } 19 | MailingInfo.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | addressOne: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | }, 38 | addressTwo: { 39 | type: DataTypes.STRING, 40 | allowNull: false, 41 | }, 42 | country: { 43 | type: DataTypes.STRING, 44 | allowNull: false, 45 | }, 46 | phone: { 47 | type: DataTypes.STRING, 48 | allowNull: false, 49 | }, 50 | email: { 51 | type: DataTypes.STRING, 52 | allowNull: false, 53 | }, 54 | }, 55 | { 56 | sequelize, 57 | modelName: "MailingInfo", 58 | tableName: "MailingInfo".toLowerCase(), 59 | } 60 | ); 61 | // const level = await MailingInfo.findAll(); 62 | return MailingInfo; 63 | }; 64 | -------------------------------------------------------------------------------- /src/api/models/programcategory.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class ProgramCategory extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | ProgramCategory.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | Color: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | }, 40 | { 41 | sequelize, 42 | modelName: "ProgramCategory", 43 | tableName: "programcategory", 44 | } 45 | ); 46 | // const level = await ProgramCategory.findAll(); 47 | return ProgramCategory; 48 | }; 49 | -------------------------------------------------------------------------------- /src/api/models/programedetails.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class ProgrameDetails extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | ProgrameDetails.belongsTo(models.LeadsManagmentModuleStatus, { 13 | foreignKey: "status", 14 | }); 15 | ProgrameDetails.belongsTo(models.Lead, { 16 | foreignKey: "leadId", 17 | as: "ProgrameDetail", 18 | }); 19 | // ProgrameDetails.belongsTo(models.LeadsManagmentModuleStatus); 20 | // ProgrameDetails.hasOne(models.LeadsManagmentModuleStatus); 21 | } 22 | } 23 | ProgrameDetails.init( 24 | { 25 | schoolName: DataTypes.STRING, 26 | qualificationType: DataTypes.STRING, 27 | selectUniversity: DataTypes.STRING, 28 | interestedProgramme: DataTypes.STRING, 29 | // status: DataTypes.STRING, 30 | // status: DataTypes.INTEGER, // Add this line 31 | cert: DataTypes.STRING, 32 | comments: DataTypes.STRING, 33 | }, 34 | { 35 | sequelize, 36 | modelName: "ProgrameDetails", 37 | tableName: "programedetails", 38 | } 39 | ); 40 | return ProgrameDetails; 41 | }; 42 | -------------------------------------------------------------------------------- /src/api/models/programlevel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class ProgramLevel extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | ProgramLevel.hasMany(models.Programme, { 15 | foreignKey: "programmeLevel", 16 | }); 17 | } 18 | } 19 | ProgramLevel.init( 20 | { 21 | ID: { 22 | type: DataTypes.INTEGER, 23 | primaryKey: true, 24 | autoIncrement: true, 25 | }, 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | defaultValue: DataTypes.NOW, 29 | }, 30 | updatedAt: { 31 | type: DataTypes.DATE, 32 | defaultValue: DataTypes.NOW, 33 | }, 34 | name: { 35 | type: DataTypes.STRING, 36 | allowNull: false, 37 | }, 38 | }, 39 | { 40 | sequelize, 41 | modelName: "ProgramLevel", 42 | tableName: "programlevel", 43 | } 44 | ); 45 | // const level = await ProgramLevel.findAll(); 46 | return ProgramLevel; 47 | }; 48 | -------------------------------------------------------------------------------- /src/api/models/programme.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | module.exports = (sequelize, DataTypes) => { 5 | class Programme extends Model { 6 | /** 7 | * Helper method for defining associations. 8 | * This method is not a part of Sequelize lifecycle. 9 | * The `models/index` file will call this method automatically. 10 | */ 11 | static associate(models) { 12 | // define association here 13 | Programme.hasMany(models.Lead, { 14 | foreignKey: "programID", 15 | }); 16 | Programme.belongsTo(models.ProgramLevel, { 17 | foreignKey: "programmeLevel", 18 | }); 19 | } 20 | } 21 | Programme.init( 22 | { 23 | name: DataTypes.STRING, 24 | selectUniversity: DataTypes.STRING, 25 | programmeLevel: DataTypes.STRING, 26 | programmeIntake: DataTypes.STRING, 27 | programmeDuration: DataTypes.STRING, 28 | programmeCategory: DataTypes.STRING, 29 | tutionFee: DataTypes.INTEGER, 30 | otherFee: DataTypes.INTEGER, 31 | engRequirement: DataTypes.STRING, 32 | entryRequirement: DataTypes.STRING, 33 | }, 34 | { 35 | sequelize, 36 | modelName: "Programme", 37 | tableName: "programmes", 38 | } 39 | ); 40 | return Programme; 41 | }; 42 | -------------------------------------------------------------------------------- /src/api/models/property.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Property extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | } 13 | } 14 | Property.init( 15 | { 16 | //4 program level 5 Program Category 6 Qualificaton type 7 university type 8 LeadGroup 9 intreseted program 17 | type: DataTypes.INTEGER, //1 application status //2 lead status 3 invoice status 18 | property: DataTypes.STRING, 19 | }, 20 | { 21 | sequelize, 22 | modelName: "Property", 23 | tableName: "properties", 24 | } 25 | ); 26 | return Property; 27 | }; 28 | -------------------------------------------------------------------------------- /src/api/models/qualificationtype.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class QualificationType extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | QualificationType.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | Color: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | }, 40 | { 41 | sequelize, 42 | modelName: "QualificationType", 43 | tableName: "qualificationtype", 44 | } 45 | ); 46 | // const level = await QualificationType.findAll(); 47 | return QualificationType; 48 | }; 49 | -------------------------------------------------------------------------------- /src/api/models/roles.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Roles extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | // Roles.hasMany(models.Users); 13 | } 14 | } 15 | 16 | Roles.init( 17 | { 18 | title: { 19 | type: DataTypes.STRING, 20 | allowNull: false, 21 | unique: true, 22 | }, 23 | 24 | addUni: { type: DataTypes.BOOLEAN, defaultValue: false }, 25 | editUni: { type: DataTypes.BOOLEAN, defaultValue: false }, 26 | deleteUni: { type: DataTypes.BOOLEAN, defaultValue: false }, 27 | viewUni: { type: DataTypes.BOOLEAN, defaultValue: false }, 28 | 29 | addUProgram: { type: DataTypes.BOOLEAN, defaultValue: false }, 30 | editUProgram: { type: DataTypes.BOOLEAN, defaultValue: false }, 31 | deleteUProgram: { type: DataTypes.BOOLEAN, defaultValue: false }, 32 | viewUProgram: { type: DataTypes.BOOLEAN, defaultValue: false }, 33 | 34 | addLeads: { type: DataTypes.BOOLEAN, defaultValue: false }, 35 | editLeads: { type: DataTypes.BOOLEAN, defaultValue: false }, 36 | deleteLeads: { type: DataTypes.BOOLEAN, defaultValue: false }, 37 | viewLeads: { type: DataTypes.BOOLEAN, defaultValue: false }, 38 | 39 | addApplication: { type: DataTypes.BOOLEAN, defaultValue: false }, 40 | editApplication: { type: DataTypes.BOOLEAN, defaultValue: false }, 41 | deleteApplication: { type: DataTypes.BOOLEAN, defaultValue: false }, 42 | viewApplication: { type: DataTypes.BOOLEAN, defaultValue: false }, 43 | 44 | addApplicationStatus: { type: DataTypes.BOOLEAN, defaultValue: false }, 45 | editApplicationStatus: { type: DataTypes.BOOLEAN, defaultValue: false }, 46 | deleteApplicationStatus: { type: DataTypes.BOOLEAN, defaultValue: false }, 47 | viewApplicationStatus: { type: DataTypes.BOOLEAN, defaultValue: false }, 48 | 49 | addInvCommission: { type: DataTypes.BOOLEAN, defaultValue: false }, 50 | editInvCommission: { type: DataTypes.BOOLEAN, defaultValue: false }, 51 | deleteInvCommission: { type: DataTypes.BOOLEAN, defaultValue: false }, 52 | viewInvCommission: { type: DataTypes.BOOLEAN, defaultValue: false }, 53 | 54 | addInvGeneral: { type: DataTypes.BOOLEAN, defaultValue: false }, 55 | editInvGeneral: { type: DataTypes.BOOLEAN, defaultValue: false }, 56 | deleteInvGeneral: { type: DataTypes.BOOLEAN, defaultValue: false }, 57 | viewInvGeneral: { type: DataTypes.BOOLEAN, defaultValue: false }, 58 | 59 | addAccounting: { type: DataTypes.BOOLEAN, defaultValue: false }, 60 | editAccounting: { type: DataTypes.BOOLEAN, defaultValue: false }, 61 | deleteAccounting: { type: DataTypes.BOOLEAN, defaultValue: false }, 62 | viewAccounting: { type: DataTypes.BOOLEAN, defaultValue: false }, 63 | 64 | // title: DataTypes.STRING 65 | }, 66 | { 67 | sequelize, 68 | modelName: "Roles", 69 | tableName: "roles", 70 | } 71 | ); 72 | return Roles; 73 | }; 74 | -------------------------------------------------------------------------------- /src/api/models/sales.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class Sales extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | Sales.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | description: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | amount: { 40 | type: DataTypes.STRING, 41 | allowNull: false, 42 | }, 43 | date: { 44 | type: DataTypes.DATE, 45 | allowNull: false, 46 | defaultValue: DataTypes.NOW, 47 | }, 48 | statusID: { 49 | type: DataTypes.INTEGER, 50 | defaultValue: DataTypes.NOW, 51 | }, 52 | }, 53 | { 54 | sequelize, 55 | modelName: "Sales", 56 | tableName: "Sales".toLowerCase(), 57 | } 58 | ); 59 | // const level = await Sales.findAll(); 60 | return Sales; 61 | }; 62 | -------------------------------------------------------------------------------- /src/api/models/university.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class University extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | University.hasMany(models.Campus); 13 | University.hasMany(models.CommissionInvoice, { 14 | foreignKey: "universityID", 15 | }); 16 | University.hasMany(models.Lead, { 17 | foreignKey: "universityID", 18 | }); 19 | } 20 | } 21 | University.init( 22 | { 23 | logo: DataTypes.STRING, 24 | name: DataTypes.STRING, 25 | type: DataTypes.INTEGER, 26 | counserllerName: DataTypes.STRING, 27 | phone: DataTypes.STRING, 28 | email: DataTypes.STRING, 29 | visaAppFee: DataTypes.INTEGER, 30 | addmissionFee: DataTypes.INTEGER, 31 | qetcFee: DataTypes.INTEGER, 32 | commisionDuration: DataTypes.STRING, 33 | }, 34 | { 35 | sequelize, 36 | modelName: "University", 37 | tableName: "universities", 38 | } 39 | ); 40 | return University; 41 | }; 42 | -------------------------------------------------------------------------------- /src/api/models/universitytype.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Model } = require("sequelize"); 4 | // const Sequelize = require("sequelize"); 5 | module.exports = (sequelize, DataTypes) => { 6 | class UniversityType extends Model { 7 | /** 8 | * Helper method for defining associations. 9 | * This method is not a part of Sequelize lifecycle. 10 | * The `models/index` file will call this method automatically. 11 | */ 12 | static associate(models) { 13 | // define association here 14 | } 15 | } 16 | UniversityType.init( 17 | { 18 | ID: { 19 | type: DataTypes.INTEGER, 20 | primaryKey: true, 21 | autoIncrement: true, 22 | }, 23 | createdAt: { 24 | type: DataTypes.DATE, 25 | defaultValue: DataTypes.NOW, 26 | }, 27 | updatedAt: { 28 | type: DataTypes.DATE, 29 | defaultValue: DataTypes.NOW, 30 | }, 31 | name: { 32 | type: DataTypes.STRING, 33 | allowNull: false, 34 | }, 35 | Color: { 36 | type: DataTypes.STRING, 37 | allowNull: false, 38 | }, 39 | }, 40 | { 41 | sequelize, 42 | modelName: "UniversityType", 43 | tableName: "universitytype", 44 | } 45 | ); 46 | // const level = await UniversityType.findAll(); 47 | return UniversityType; 48 | }; 49 | -------------------------------------------------------------------------------- /src/api/models/user.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class User extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | User.belongsTo(models.Activity), { foreignKey: "userId" }; 13 | } 14 | } 15 | User.init( 16 | { 17 | firstName: DataTypes.STRING, 18 | lastName: DataTypes.STRING, 19 | email: DataTypes.STRING, 20 | }, 21 | { 22 | sequelize, 23 | modelName: "User", 24 | tableName: "uusers", 25 | } 26 | ); 27 | return User; 28 | }; 29 | -------------------------------------------------------------------------------- /src/api/models/users.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Model } = require("sequelize"); 3 | module.exports = (sequelize, DataTypes) => { 4 | class Users extends Model { 5 | /** 6 | * Helper method for defining associations. 7 | * This method is not a part of Sequelize lifecycle. 8 | * The `models/index` file will call this method automatically. 9 | */ 10 | static associate(models) { 11 | // define association here 12 | // Users.belongsTo(models.Activity), { foreignKey: "userId" }; 13 | // Users.belongsTo(models.Roles), { foreignKey: "roleId" }; 14 | Users.belongsTo(models.Branch, { foreignKey: "branchID" }); 15 | Users.hasMany(models.Activity, { 16 | foreignKey: "userID", 17 | }); 18 | } 19 | } 20 | Users.init( 21 | { 22 | name: DataTypes.STRING, 23 | email: DataTypes.STRING, 24 | [`number`]: DataTypes.STRING, 25 | role: DataTypes.STRING, 26 | branch: DataTypes.STRING, 27 | position: DataTypes.STRING, 28 | date: DataTypes.STRING, 29 | password: DataTypes.STRING, 30 | image: DataTypes.STRING 31 | }, 32 | { 33 | sequelize, 34 | modelName: "Users", 35 | tableName: "users", 36 | } 37 | ); 38 | return Users; 39 | }; 40 | -------------------------------------------------------------------------------- /src/api/routes/v1/admin/activity.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/activity.controller') 4 | 5 | router.route('/list').get(controller.list) 6 | 7 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/admin.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/admin.controller') 4 | const { cpUpload,uploadSingle,uploadContentImage } = require('../../../utils/upload') 5 | const { validationOptions } = require('../../../middlewares/error') 6 | 7 | 8 | router.route('/login').post(controller.login) 9 | router.route('/create').post(cpUpload, controller.create) 10 | router.route('/edit').put(cpUpload, controller.edit) 11 | router.route('/delete/:adminId').delete(controller.delete) 12 | router.route('/get/:adminId').get(controller.get) 13 | router.route('/list').get(controller.list) 14 | router.route('/edit-password').put(cpUpload, controller.editPassword) 15 | router.route('/forgot-password').post(controller.forgotPassword) 16 | router.route('/reset-password').put(cpUpload, controller.resetPassword) 17 | router.route('/dashboard').get(controller.dashboard) 18 | router.route('/verify-admin-password').post(controller.verify) 19 | router.route('/private-admin').get(controller.privateAdmin) 20 | router.route('/private-admin/create-private-admin').post(controller.createPrivateAdmin) 21 | router.route('/upload-image').post(uploadSingle,controller.imageUpload); 22 | router.route('/test-route').post(controller.testRoute) 23 | router.route('/upload-content').post(uploadContentImage,controller.uploadContent); 24 | 25 | 26 | 27 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/cms.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/cms.controller') 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/create').post(cpUpload, controller.create) 7 | router.route('/edit').put(cpUpload, controller.edit) 8 | router.route('/delete/:contentId').delete(controller.delete) 9 | router.route('/get/:contentId').get(controller.get) 10 | router.route('/list').post(controller.list) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/contact.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const controller = require('../../../controllers/admin/contact.controller'); 3 | const router = express.Router(); 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/list').post(controller.list); 7 | router.route('/edit').put(cpUpload, controller.edit); 8 | 9 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/admin/email.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/email.controller') 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/create').post(cpUpload, controller.create) 7 | router.route('/edit').put(cpUpload, controller.edit) 8 | router.route('/delete/:emailId').delete(controller.delete) 9 | router.route('/get/:emailId').get(controller.get) 10 | router.route('/list').get(controller.list) 11 | controller.createEmailBulkTemplate() 12 | 13 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/faq.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/faq.controller') 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/create').post(cpUpload, controller.create) 7 | router.route('/edit').put(cpUpload, controller.edit) 8 | router.route('/delete/:faqId').delete(controller.delete) 9 | router.route('/get/:faqId').get(controller.get) 10 | router.route('/list').post(controller.list) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/faqCategories.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/faqCategories.controller') 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/create').post(cpUpload, controller.create) 7 | router.route('/edit').put(cpUpload, controller.edit) 8 | router.route('/delete/:faqId').delete(controller.delete) 9 | router.route('/get/:faqId').get(controller.get) 10 | router.route('/list').get(controller.list) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const userRoutes = require('./users.route') 3 | const adminRoutes = require('./admin.route') 4 | const roleRoutes = require('./roles.route') 5 | const emailRoutes = require('./email.route') 6 | const settingsRoutes = require('./settings.route') 7 | const faqRoutes = require('./faq.route') 8 | const contactRoutes = require('./contact.route') 9 | const cmsRoutes = require('./cms.route') 10 | const activityRoutes = require('./activity.route') 11 | const newsletterRoutes = require('./newsletter.route') 12 | const faqCategoriesRoutes = require('./faqCategories.route') 13 | const router = express.Router() 14 | 15 | /** 16 | * GET v1/admin 17 | */ 18 | router.use('/staff', adminRoutes) 19 | router.use('/role', roleRoutes) 20 | router.use('/user', userRoutes) 21 | router.use('/email', emailRoutes) 22 | router.use('/settings', settingsRoutes) 23 | router.use('/faq', faqRoutes) 24 | router.use('/contacts', contactRoutes) 25 | router.use('/content', cmsRoutes) 26 | router.use('/activity', activityRoutes) 27 | router.use('/newsletter', newsletterRoutes) 28 | router.use('/faq-categories', faqCategoriesRoutes) 29 | 30 | module.exports = router 31 | -------------------------------------------------------------------------------- /src/api/routes/v1/admin/newsletter.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/newsletter.controller') 4 | 5 | router.route('/list').get(controller.list) 6 | router.route('/send-email').post(controller.sendEmailToSubscribers) 7 | 8 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/roles.route.js: -------------------------------------------------------------------------------- 1 | const router = require('express').Router(); 2 | const controller = require('../../../controllers/admin/roles.controller'); 3 | 4 | router.route('/create').post(controller.create); 5 | router.route('/edit').put(controller.edit); 6 | router.route('/delete').delete(controller.delete); 7 | router.route('/get').get(controller.get); 8 | router.route('/list').get(controller.list); 9 | router.route('/list-names').get(controller.getRolesByName); 10 | 11 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/admin/settings.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/settings.controller') 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/edit').put(cpUpload, controller.edit) 7 | router.route('/get').get(controller.get) 8 | 9 | 10 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/admin/staff.route.js: -------------------------------------------------------------------------------- 1 | const router = require('express').Router(); 2 | const controller = require('../../controllers/staff.controller'); 3 | 4 | router.route('/create').post(validate.create, controller.create); 5 | router.route('/edit').put(validate.edit, controller.edit); 6 | router.route('/delete').delete(validate.del, controller.delete); 7 | router.route('/get').get(validate.get, controller.get); 8 | router.route('/list').get(controller.list); 9 | 10 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/admin/users.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/admin/users.controller') 4 | 5 | router.route('/create').post(controller.create) 6 | router.route('/edit').put(controller.edit) 7 | router.route('/list').post(controller.list) 8 | router.route('/delete/:userId').delete(controller.delete) 9 | router.route('/:userId').get(controller.get) 10 | 11 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/auth.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const controller = require('../../../controllers/front/auth.controller'); 3 | const { profileUpload } = require('../../../utils/upload') 4 | const router = express.Router(); 5 | 6 | 7 | router.route('/register').post(controller.register); 8 | router.route('/login').post(controller.login); 9 | router.route('/forgot-password').post(controller.forgotPassword) 10 | router.route('/reset-password').post(controller.resetPassword) 11 | router.route('/change-password').put(controller.changePassword) 12 | router.route('/edit-profile').put(controller.editProfile) 13 | router.route('/update-banner').put(profileUpload, controller.updateBanner); 14 | 15 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/cms.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const controller = require('../../../controllers/front/cms.controller'); 3 | const router = express.Router(); 4 | 5 | router.route('/get/:slug').get(controller.get); 6 | router.route('/list').get(controller.list) 7 | 8 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/contact.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const controller = require('../../../controllers/front/contact.controller'); 3 | const router = express.Router(); 4 | const { cpUpload } = require('../../../utils/upload') 5 | 6 | router.route('/submit').post(cpUpload, controller.create); 7 | 8 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/faq.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/front/faq.controller') 4 | 5 | router.route('/list/:catId').get(controller.list) 6 | router.route('/list-faq-categories').get(controller.listFaqCategories) 7 | 8 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/footer.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const controller = require('../../../controllers/front/footer.controller'); 3 | const { cpUpload } = require('../../../utils/upload') 4 | const router = express.Router(); 5 | 6 | router.route('/submit').post(cpUpload, controller.submit); 7 | router.route('/get').get(controller.get); 8 | router.route('/cryptocurrency').get(controller.cryptocurrencyListing); 9 | 10 | 11 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const authRoutes = require('./auth.route') 3 | const usersRoutes = require('./users.route') 4 | const settingsRoutes = require('./settings.route') 5 | const faqRoutes = require('./faq.route') 6 | const contactRoutes = require('./contact.route') 7 | const cmsRoutes = require('./cms.route') 8 | const footerRoutes = require('./footer.route') 9 | 10 | const router = express.Router() 11 | const { uploadToCloudinary, cpUpload } = require('../../../utils/upload') 12 | /** 13 | * GET v1/status 14 | */ 15 | router.use('/auth', authRoutes) 16 | router.use('/users', usersRoutes) 17 | router.use('/settings', settingsRoutes) 18 | router.use('/faq', faqRoutes) 19 | router.use('/contact', contactRoutes) 20 | router.use('/cms', cmsRoutes) 21 | router.use('/footer', footerRoutes) 22 | router.use('/test', cpUpload, async (req, res) => { 23 | const url = [] 24 | const { path } = req.files.image[0]; 25 | const newPath = await uploadToCloudinary(path) 26 | url.push(newPath) 27 | 28 | res.status(200).json({ data: url, message: "image upload successfully" }) 29 | }) 30 | 31 | module.exports = router 32 | -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/settings.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controller = require('../../../controllers/front/settings.controller') 4 | 5 | router.route('/get').get(controller.get) 6 | 7 | 8 | module.exports = router -------------------------------------------------------------------------------- /src/api/routes/v1/front-bk/users.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const controller = require('../../../controllers/front/users.controller'); 3 | const router = express.Router(); 4 | const { profileUpload, uploadSingle } = require('../../../utils/upload') 5 | 6 | router.route('/:userId').put(profileUpload, controller.update); 7 | router.route('/:userId').get(controller.getUser); 8 | router.route('/upload-image').post(uploadSingle, controller.uploadContent); 9 | router.route('/refferals/:userId').get(controller.getUserReferrals); 10 | 11 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/front/activities.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const controller = require("../../../controllers/front/activities.controller"); 3 | const router = express.Router(); 4 | const { cpUpload } = require("../../../utils/upload"); 5 | 6 | router.route("/list").get(controller.list); 7 | 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/applicants.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller'); 3 | const controller = require("../../../controllers/front/applicants.controller"); 4 | const router = express.Router(); 5 | // const { uploadSingle } = require('../../../utils/upload'); 6 | const { cpUpload } = require("../../../utils/upload"); 7 | 8 | router.route("/createApplicant").post(cpUpload, controller.createApplicant); 9 | router.route("/listApplicants").get(controller.listApplicants); 10 | // 11 | router.route("/edit").put(cpUpload, controller.edit); 12 | router.route("/delete/:id").delete(controller.delete); 13 | router.route("/get/:id").get(controller.get); 14 | router.route("/search").post(controller.search); 15 | 16 | module.exports = router; 17 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/applicationmodulestatus.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/applicationmodulestatus.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router 9 | .route("/create") 10 | .post(upload.any(), controller.createApplicationModuleStatus); 11 | router 12 | .route("/listApplicationModuleStatuss") 13 | .get(controller.listApplicationModuleStatuss); 14 | router.route("/edit").put(controller.edit); 15 | router.route("/delete").post(controller.delete); 16 | router.route("/get/:id").get(controller.get); 17 | // router.findAll(); 18 | 19 | module.exports = router; 20 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/backups.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const controller = require("../../../controllers/front/backup.controller"); 3 | const router = express.Router(); 4 | const { uploadSingle, cpUpload } = require("../../../utils/upload"); 5 | 6 | router.route("/create").post(uploadSingle, controller.create); 7 | router.route("/list").get(controller.list); 8 | router.route("/restore/:fileName").put(uploadSingle, controller.restore); 9 | router.route("/delete/:fileName").delete(controller.delete); 10 | router.route("/download/:fileName").get(controller.download); 11 | 12 | module.exports = router; -------------------------------------------------------------------------------- /src/api/routes/v1/front/billinginfo.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller'); 3 | const controller = require("../../../controllers/front/billinginfo.controller"); 4 | const router = express.Router(); 5 | const { uploadSingle, cpUpload, upload } = require("../../../utils/upload"); 6 | 7 | router.route("/create").post(upload.any(), controller.create); 8 | router.route("/list").get(controller.list); 9 | router.route("/edit").put(upload.any(), controller.edit); 10 | router.route("/delete/:id").delete(controller.delete); 11 | router.route("/get/:id").get(controller.get); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/branch.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller'); 3 | const controller = require("../../../controllers/front/branch.controller"); 4 | const router = express.Router(); 5 | const { uploadSingle, cpUpload } = require("../../../utils/upload"); 6 | 7 | router.route("/create").post( controller.create); 8 | router.route("/list").get(controller.list); 9 | router.route("/edit").put(controller.edit); 10 | router.route("/delete/:id").delete(controller.delete); 11 | router.route("/search").post(controller.search); 12 | router.route("/get/:id").get(controller.get); 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/commissioninvoice.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/commissioninvoice.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.create); 9 | router.route("/list").get(controller.list); 10 | router.route(upload.any(), "/edit").put(controller.edit); 11 | router.route("/delete/:id").delete(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | router.route("/search").post(controller.search); 14 | 15 | // router.findAll(); 16 | 17 | module.exports = router; 18 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/commissioninvoiceitem.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller'); 3 | const controller = require("../../../controllers/front/commissioninvoiceitem.controller"); 4 | const router = express.Router(); 5 | const { uploadSingle, cpUpload, upload } = require("../../../utils/upload"); 6 | 7 | router.route("/create").post(upload.any(), controller.create); 8 | router.route("/list").get(controller.list); 9 | router.route("/edit").put(upload.any(), controller.edit); 10 | router.route("/delete/:id").delete(controller.delete); 11 | router.route("/get/:id").get(controller.get); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/costofsales.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/costofsales.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.create); 9 | router.route("/list").get(controller.list); 10 | router.route("/edit").put(upload.any(), controller.edit); 11 | router.route("/delete/:id").delete(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/currencies.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const controller = require("../../../controllers/front/currencies.controller"); 3 | const router = express.Router(); 4 | const { cpUpload } = require("../../../utils/upload"); 5 | 6 | router.route("/create").post(cpUpload, controller.create); 7 | router.route("/list").get(controller.list); 8 | router.route("/lists").get(controller.lists); 9 | router.route("/edit").put(cpUpload, controller.edit); 10 | router.route("/delete/:id").delete(controller.delete); 11 | router.route("/get/:id").get(controller.get); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/depitandcredit.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/depitandcredit.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.create); 9 | router.route("/list").get(controller.list); 10 | router.route("/edit").put(upload.any(), controller.edit); 11 | router.route("/delete/:id").delete(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/expenses.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/expenses.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.create); 9 | router.route("/list").get(controller.list); 10 | router.route("/edit").put(upload.any(), controller.edit); 11 | router.route("/delete/:id").delete(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/generalinvoice.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/generalinvoice.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.create); 9 | router.route("/list").get(controller.list); 10 | router.route("/edit").put(upload.any(), controller.edit); 11 | router.route("/delete/:id").delete(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | router.route("/search").post(controller.search); 14 | 15 | // router.findAll(); 16 | 17 | module.exports = router; 18 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/generalinvoiceitem.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller'); 3 | const controller = require("../../../controllers/front/generalinvoiceitem.controller"); 4 | const router = express.Router(); 5 | const { uploadSingle, cpUpload, upload } = require("../../../utils/upload"); 6 | 7 | router.route("/create").post(upload.any(), controller.create); 8 | router.route("/list").get(controller.list); 9 | router.route("/edit").put(upload.any(), controller.edit); 10 | router.route("/delete/:id").delete(controller.delete); 11 | router.route("/get/:id").get(controller.get); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/index.js: -------------------------------------------------------------------------------- 1 | // all modules 2 | 3 | const express = require("express"); 4 | // const { route } = require("./university.route"); 5 | const universityRoutes = require("./university.route"); 6 | const programmeRoutes = require("./programme.route"); 7 | const leadRoutes = require("./lead.route"); 8 | const applicantsRoute = require("./applicants.route"); 9 | const usersRoute = require("./users.route"); 10 | const backupsRoutes = require("./backups.route"); 11 | const PropertiesRoutes = require("./properties.route"); 12 | const currencieRoutes = require("./currencies.route"); 13 | const activitiesRoutes = require("./activities.route"); 14 | const branchRoutes = require("./branch.route"); 15 | // Anasite - Edits 16 | const programLevel = require("./programlevel.route"); 17 | const programCategory = require("./programcategory.route"); 18 | const qualificationType = require("./qualificationtype.route"); 19 | const universityType = require("./universitytype.route"); 20 | const leadGroup = require("./leadgroup.route"); 21 | const interestedProgram = require("./interestedprogram.route"); 22 | const applicationModuleStatus = require("./applicationmodulestatus.route"); 23 | const leadsManagmentModuleStatus = require("./leadsmanagmentmodulestatus.route"); 24 | const invoiceModuleStatus = require("./invoicemodulestatus.route"); 25 | const commissionInvoice = require("./commissioninvoice.route"); 26 | const sales = require("./sales.route"); 27 | const costofsales = require("./costofsales.route"); 28 | const expenses = require("./expenses.route"); 29 | const depitandcredit = require("./depitandcredit.route"); 30 | const billinginfo = require("./billinginfo.route"); 31 | const mailinginfo = require("./mailinginfo.route"); 32 | const generalinvoice = require("./generalinvoice.route"); 33 | const commissioninvoiceitem = require("./commissioninvoiceitem.route"); 34 | const generalinvoiceitem = require("./generalinvoiceitem.route"); 35 | 36 | const router = express.Router(); 37 | 38 | /** 39 | * GET v1/status 40 | */ 41 | router.use("/branch", branchRoutes); 42 | router.use("/backups", backupsRoutes); 43 | router.use("/properties", PropertiesRoutes); 44 | router.use("/university", universityRoutes); 45 | router.use("/programme", programmeRoutes); 46 | router.use("/lead", leadRoutes); 47 | router.use("/applicants", applicantsRoute); 48 | router.use("/users", usersRoute); 49 | router.use("/currencies", currencieRoutes); 50 | router.use("/activities", activitiesRoutes); 51 | // Anasite - Edits: 52 | router.use("/programlevel", programLevel); 53 | router.use("/programcategory", programCategory); 54 | router.use("/qualificationtype", qualificationType); 55 | router.use("/universitytype", universityType); 56 | router.use("/leadgroup", leadGroup); 57 | router.use("/interestedprogram", interestedProgram); 58 | router.use("/applicationmodulestatus", applicationModuleStatus); 59 | router.use("/leadsmanagmentmodulestatus", leadsManagmentModuleStatus); 60 | router.use("/invoicemodulestatus", invoiceModuleStatus); 61 | router.use("/sales", sales); 62 | router.use("/costofsales", costofsales); 63 | router.use("/expenses", expenses); 64 | router.use("/commissioninvoice", commissionInvoice); 65 | router.use("/billinginfo", billinginfo); 66 | router.use("/mailinginfo", mailinginfo); 67 | router.use("/generalinvoice", generalinvoice); 68 | router.use("/depitandcredit", depitandcredit); 69 | router.use("/commissioninvoiceitem", commissioninvoiceitem); 70 | router.use("/generalinvoiceitem", generalinvoiceitem); 71 | 72 | // currencieRoutes; 73 | module.exports = router; 74 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/interestedprogram.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/interestedprogram.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.createInterestedProgram); 9 | router.route("/listInterestedPrograms").get(controller.listInterestedPrograms); 10 | router.route("/edit").put(controller.edit); 11 | router.route("/delete").post(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/invoicemodulestatus.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/invoicemodulestatus.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router 9 | .route("/create") 10 | .post(upload.any(), controller.createInvoiceModuleStatus); 11 | router 12 | .route("/listInvoiceModuleStatuss") 13 | .get(controller.listInvoiceModuleStatuss); 14 | router.route("/edit").put(controller.edit); 15 | router.route("/delete").post(controller.delete); 16 | router.route("/get/:id").get(controller.get); 17 | // router.findAll(); 18 | 19 | module.exports = router; 20 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/lead.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const controller = require("../../../controllers/front/lead.controller"); 3 | const router = express.Router(); 4 | const { uploadSingle, upload } = require("../../../utils/upload"); 5 | 6 | router.route("/createLead").post(upload.single("logo"), controller.createLead); 7 | router.route("/listLead").get(controller.listLead); 8 | router.route("/edit").put(upload.single("logo"), controller.edit); 9 | router.route("/delete/:id").delete(controller.delete); 10 | router.route("/get/:id").get(controller.get); 11 | router.route("/search").post(controller.search); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/leadgroup.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/leadgroup.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.createLeadGroup); 9 | router.route("/listLeadGroups").get(controller.listLeadGroups); 10 | router.route("/edit").put(controller.edit); 11 | router.route("/delete").post(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/leadsmanagmentmodulestatus.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/leadsmanagmentmodulestatus.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router 9 | .route("/create") 10 | .post(upload.any(), controller.createLeadsManagmentModuleStatus); 11 | router 12 | .route("/listLeadsManagmentModuleStatuss") 13 | .get(controller.listLeadsManagmentModuleStatuss); 14 | router.route("/edit").put(controller.edit); 15 | router.route("/delete").post(controller.delete); 16 | router.route("/get/:id").get(controller.get); 17 | // router.findAll(); 18 | 19 | module.exports = router; 20 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/mailinginfo.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller'); 3 | const controller = require("../../../controllers/front/mailing.controller"); 4 | const router = express.Router(); 5 | const { uploadSingle, cpUpload, upload } = require("../../../utils/upload"); 6 | 7 | router.route("/create").post(upload.any(), controller.create); 8 | router.route("/list").get(controller.list); 9 | router.route("/edit").put(upload.any(), controller.edit); 10 | router.route("/delete/:id").delete(controller.delete); 11 | router.route("/get/:id").get(controller.get); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/programcategory.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/programcategory.controller"); 5 | const router = express.Router(); 6 | 7 | const multer = require("multer"); 8 | const upload = multer(); 9 | router.route("/create").post(upload.any(), controller.createProgramCategory); 10 | router.route("/listProgramCategorys").get(controller.listProgramCategorys); 11 | router.route("/edit").put(controller.edit); 12 | router.route("/delete").post(controller.delete); 13 | router.route("/get/:id").get(controller.get); 14 | // router.findAll(); 15 | 16 | module.exports = router; 17 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/programlevel.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/programlevel.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.createProgramLevel); 9 | router.route("/listProgramLevels").get(controller.listProgramLevels); 10 | router.route("/edit").put(controller.edit); 11 | router.route("/delete").post(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/programme.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | // const controller = require('../../../controllers/front/university.controller') 3 | const controller = require("../../../controllers/front/programme.controller"); 4 | const router = express.Router(); 5 | 6 | router.route("/createProgramme").post(controller.createProgramme); 7 | router.route("/listProgrammes").get(controller.listProgrammes); 8 | router.route("/edit").put(controller.edit); 9 | router.route("/delete/:id").delete(controller.delete); 10 | router.route("/get/:id").get(controller.get); 11 | router.route("/search").post(controller.search); 12 | 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/properties.route.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const controller = require("../../../controllers/front/properties.controller"); 3 | const router = express.Router(); 4 | const { cpUpload } = require("../../../utils/upload"); 5 | 6 | router.route("/create").post(cpUpload,controller.create); 7 | router.route("/list").get(controller.list); 8 | router.route("/edit").put(controller.edit); 9 | router.route("/delete/:id").delete(controller.delete); 10 | router.route("/get/:id").get(controller.get); 11 | 12 | module.exports = router; 13 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/qualificationtype.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/qualificationtype.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.createQualificationType); 9 | router.route("/listQualificationTypes").get(controller.listQualificationTypes); 10 | router.route("/edit").put(controller.edit); 11 | router.route("/delete").post(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/sales.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/sales.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.create); 9 | router.route("/list").get(controller.list); 10 | router.route("/edit").put(upload.any(), controller.edit); 11 | router.route("/delete/:id").delete(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/university.route.js: -------------------------------------------------------------------------------- 1 | // const express = require("express"); 2 | // const controller = require("../../../controllers/front/university.controller"); 3 | // const router = express.Router(); 4 | // const { uploadSingle } = require("../../../utils/upload"); 5 | 6 | // router.route("/create").post(uploadSingle, controller.create); 7 | // router.route("/listUniversity").get(controller.listUniversity); 8 | // router.route("/edit").put(uploadSingle, controller.edit); 9 | // router.route("/delete/:id").delete(controller.delete); 10 | // router.route("/get/:id").get(controller.get); 11 | 12 | // module.exports = router; 13 | 14 | const express = require("express"); 15 | const router = express.Router(); 16 | 17 | const controller = require("../../../controllers/front/university.controller"); 18 | const { uploadSingle } = require("../../../utils/upload"); 19 | 20 | router.route("/create").post(uploadSingle, controller.create); 21 | router.route("/listUniversity").get(controller.listUniversity); 22 | router.route("/edit").put(uploadSingle, controller.edit); 23 | router.route("/delete/:id").delete(controller.delete); 24 | router.route("/get/:id").get(controller.get); 25 | router.route("/search").post(controller.search); 26 | 27 | 28 | module.exports = router; 29 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/universitytype.route.js: -------------------------------------------------------------------------------- 1 | // Anasite - Edits: setting up routes 2 | const express = require("express"); 3 | // const controller = require('../../../controllers/front/university.controller') 4 | const controller = require("../../../controllers/front/universitytype.controller"); 5 | const router = express.Router(); 6 | const multer = require("multer"); 7 | const upload = multer(); 8 | router.route("/create").post(upload.any(), controller.createUniversityType); 9 | router.route("/listUniversityTypes").get(controller.listUniversityTypes); 10 | router.route("/edit").put(controller.edit); 11 | router.route("/delete").post(controller.delete); 12 | router.route("/get/:id").get(controller.get); 13 | // router.findAll(); 14 | 15 | module.exports = router; 16 | -------------------------------------------------------------------------------- /src/api/routes/v1/front/users.route.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | // const controller = require('../../../controllers/front/university.controller') 3 | // const controller = require('../../../controllers/front/users.controller'); 4 | const { uploadSingle, upload } = require("../../../utils/upload"); 5 | const controller = require('../../../controllers/front/users.controller'); 6 | 7 | const router = express.Router(); 8 | 9 | // router.route("/createUser").post(controller.createUser); 10 | // router.route("/listUsers").get(controller.listUsers) 11 | router.route("/create").post(controller.create); 12 | router.route("/getUser").post(controller.getUser); 13 | router.route("/list").get(controller.list); 14 | router.route("/edit").put(upload.single("logo"), controller.edit); 15 | router.route("/delete/:id").delete(controller.delete); 16 | router.route("/get/:id").get(controller.get); 17 | router.route("/login").post(controller.login); 18 | router.route("/signup").post(controller.signup); 19 | router.route("/search").post(controller.search); 20 | router.route("/signout").post(controller.signout); 21 | 22 | module.exports = router; 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/api/utils/APIError.js: -------------------------------------------------------------------------------- 1 | const httpStatus = require('http-status'); 2 | 3 | /** 4 | * @extends Error 5 | */ 6 | class ExtendableError extends Error { 7 | constructor({ 8 | message, errors, status, isPublic, stack, 9 | }) { 10 | super(message); 11 | this.name = this.constructor.name; 12 | this.message = message; 13 | this.errors = errors; 14 | this.status = status; 15 | this.isPublic = isPublic; 16 | this.isOperational = true; // This is required since bluebird 4 doesn't append it anymore. 17 | this.stack = stack; 18 | // Error.captureStackTrace(this, this.constructor.name); 19 | } 20 | } 21 | 22 | /** 23 | * Class representing an API error. 24 | * @extends ExtendableError 25 | */ 26 | class APIError extends ExtendableError { 27 | /** 28 | * Creates an API error. 29 | * @param {string} message - Error message. 30 | * @param {number} status - HTTP status code of error. 31 | * @param {boolean} isPublic - Whether the message should be visible to user or not. 32 | */ 33 | constructor({ 34 | message, 35 | errors, 36 | stack, 37 | status = httpStatus.INTERNAL_SERVER_ERROR, 38 | isPublic = false, 39 | }) { 40 | super({ 41 | message, errors, status, isPublic, stack, 42 | }); 43 | } 44 | } 45 | 46 | module.exports = APIError; 47 | -------------------------------------------------------------------------------- /src/api/utils/emails/emails.js: -------------------------------------------------------------------------------- 1 | const Settings = require('../../models/settings.model') 2 | const Mail = require('../../models/email.model') 3 | const {emailAdd,mailgunDomain,mailgunApi} = require('../../../config/vars') 4 | 5 | //send email to mentioned users 6 | exports.sendEmail = async (email = '', type = '', content = null, subject = '') => { 7 | if (email) { 8 | const getTemplate = await Mail.findOne({ type }) 9 | if (getTemplate) { 10 | let setting = await Settings.findOne() 11 | let api=setting?.api ? setting?.api : ''; 12 | let domain=setting?.domain ? setting?.domain : ''; 13 | let siteEmail=setting?.email ? setting?.email : ''; 14 | var mailgun = require('mailgun-js')({ apiKey: api, domain: domain }); 15 | 16 | let sub = '' 17 | if(subject){ 18 | sub = subject 19 | } 20 | else{ 21 | sub = getTemplate.subject 22 | } 23 | 24 | const msg = { 25 | to: email, 26 | from: `Biiview <${siteEmail}>`, 27 | subject: sub, 28 | html: getHtml(getTemplate, content) 29 | }; 30 | 31 | mailgun.messages().send(msg, function (err,body) { 32 | if (err) { 33 | console.log(err, "\u2B55") 34 | } 35 | else { 36 | console.log(body) 37 | } 38 | }); 39 | } 40 | } 41 | } 42 | 43 | function getHtml(getTemplate, content) { 44 | let text = getTemplate.text 45 | if (content) { 46 | for (let key in content) { 47 | text = text.replace(`${key}`, "'" + `${content[key]}` + "'") 48 | } 49 | } 50 | return text 51 | } 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/api/utils/upload.js: -------------------------------------------------------------------------------- 1 | // multer 2 | const fs = require("fs"); 3 | const multer = require("multer"); 4 | const cloudinary = require("cloudinary"); 5 | const { resolve } = require("path"); 6 | const uploadsDir = "./src/uploads/"; 7 | const imagesDir = `${uploadsDir}images/`; 8 | cloudinary.config({ 9 | cloud_name: process.env.CLOUD_NAME, 10 | api_key: process.env.API_KEY, 11 | api_secret: process.env.API_SECRET, 12 | }); 13 | 14 | const storage = multer.diskStorage({ 15 | destination: function (req, file, cb) { 16 | console.log("ooo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n reqreqreq", req); 17 | // make uploads directory if do not exist 18 | if (!fs.existsSync(uploadsDir)) fs.mkdirSync(uploadsDir); 19 | 20 | if (!fs.existsSync(imagesDir)) fs.mkdirSync(imagesDir); 21 | 22 | cb(null, imagesDir); 23 | }, 24 | filename: function (req, file, cb) { 25 | try { 26 | console.log("\n\n\n\n\n\n\n\n File from Multer", file); 27 | var fileExtension = file.mimetype.split("/")[1]; 28 | if ( 29 | !file.originalname 30 | .toLowerCase() 31 | .match(/\.(jpg|jpeg|png|gif|svg|ico|webp)$/) 32 | ) { 33 | return cb(new Error("Only image files are allowed.")); 34 | } 35 | console.log("\n\n\n\n\n\n\n\n after checking extension from Multer"); 36 | 37 | cb( 38 | null, 39 | +Date.now() + 40 | "." + 41 | fileExtension + 42 | "." + 43 | file.originalname.toLowerCase() 44 | ); 45 | } catch (err) { 46 | console.log("Error From Multer", err); 47 | } 48 | }, 49 | }); 50 | 51 | const upload = multer({ 52 | storage, 53 | limits: { 54 | fileSize: 2 * 1024 * 1024, // 2 MB 55 | }, 56 | }); 57 | // console.log("\nlll\nllll\nnnnn", upload); 58 | // exports.cpUpload = upload.fields([{ name: 'image', maxCount: 1 }, { name: 'screenShot', maxCount: 1 }, { name: 'icon', maxCount: 1 }, { name: 'files', maxCount: 1 }, { name: 'manifestFile', maxCount: 1 }, { name: 'crashLog', maxCount: 1 },]) 59 | exports.cpUpload = upload.fields([ 60 | { name: "image", maxCount: 1 }, 61 | { name: "fileUpload", maxCount: 1 }, 62 | ]); 63 | 64 | // exports.cpUpload = upload.fields([{ name: 'image', maxCount: 1 }, { name: 'fileUpload', maxCount: 1 }]) 65 | exports.uploadSingle = upload.single("logo"); 66 | exports.upload = upload; 67 | exports.uploadContentImage = upload.single("files"); 68 | exports.profileUpload = upload.fields([ 69 | { name: "profileImage", maxCount: 1 }, 70 | { name: "bannerImage", maxCount: 1 }, 71 | ]); 72 | exports.kycPersonalDoc = upload.fields([ 73 | { name: "personalDocumentPassportFront", maxCount: 1 }, 74 | { name: "personalDocumentPassportBack", maxCount: 1 }, 75 | { name: "personalDocumentIDCardFront", maxCount: 1 }, 76 | { name: "personalDocumentIDCardBack", maxCount: 1 }, 77 | { name: "personalDocumentDrivingIDFront", maxCount: 1 }, 78 | { name: "personalDocumentDrivingIDBack", maxCount: 1 }, 79 | { name: "addressDocument", maxCount: 1 }, 80 | { name: "additionalDocument", maxCount: 1 }, 81 | ]); 82 | 83 | exports.uploadToCloudinary = async (data) => { 84 | return new Promise((resolve) => { 85 | cloudinary.uploader.upload( 86 | data, 87 | (result) => { 88 | resolve(result.secure_url); 89 | }, 90 | { resource_type: "auto" } 91 | ); 92 | }); 93 | 94 | // return `oooooooooooo` 95 | }; 96 | -------------------------------------------------------------------------------- /src/api/utils/util.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require("path"); 3 | 4 | exports.leadingZeros =async (data)=>{ 5 | const transformed = {}; 6 | const fields = ['_id', 'gameId', 'description', 'name', 'icon', 'platformType', 'developmentEnv', 'userId', 'monitizationModel' , 'gameFormat' , 'winningScore' , 'orientation','downloaded','inProgress','launched','prizeEnabled','archived','updatedAt','createdAt']; 7 | for(let i=0;i 0) { 13 | num= Array(+numZeroes).join("0") + num; 14 | } 15 | transformed.gameId=num; 16 | return transformed; 17 | } 18 | 19 | 20 | exports.leadingZerosMobile =async (data)=>{ 21 | const transformed = {}; 22 | const fields = [ 'gameID', 'gameName', 'gameImage', 'gamePlatform', 'gameGenre', 'gameInstructions','gameRank']; 23 | for(let i=0;i 0) { 29 | num= Array(+numZeroes).join("0") + num; 30 | } 31 | transformed.gameID=num; 32 | return transformed; 33 | } 34 | 35 | 36 | exports.removeFile =async (data)=>{ 37 | const imagePath=path.resolve(__dirname, `../../uploads/images/${data}`) 38 | await fs.unlinkSync(imagePath); 39 | return imagePath; 40 | } -------------------------------------------------------------------------------- /src/config/demo.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/multikitty/education-consultancy-backend/b958ee8adefda822565d5387035a6118ebc84baf/src/config/demo.sql -------------------------------------------------------------------------------- /src/config/emailtemplate.json: -------------------------------------------------------------------------------- 1 | [{"type":"forgot-password","subject":"Forgot Password","text":"

To reset your password click this link:

 ${url}

If you didn’t ask to reset your password, you can ignore this email.

  1. Thanks,
"},{"type":"contact-email","subject":"Contact Form","text":"

CONTACT US

"},{"type":"verify-user","subject":"Verify your ban account ....","text":"

Hello ${email} :

hjbjjkhh,kjwdjkaxznjdsjk

To verify your email click this link:

 ${url}

If you already verify your email, you can ignore this email.

Thanks,

"},{"type":"new-user","subject":"Congratulation for Deskillz User","text":"

PASTE HERE THE RESET NEW USER TEMPLATE SAMPLEs

"},{"type":"contact-status","subject":"Change Status for Contact Formssss","text":"

Your Query No# ${_id} status has been updggggated to ${status}…………… .

"},{"type":"invite-user","subject":"Invite Usersd","text":"

Hello ${email} :

Join to our platform join us with    43 : ${url}

Thanks,

"}] -------------------------------------------------------------------------------- /src/config/errors.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Catch 422 for duplicate key 3 | * @public 4 | */ 5 | exports.checkDuplicate = (err, res, name = '') => { 6 | if (err.code === 11000 || err.code === 11001) { 7 | let message = `${name} with same `; 8 | if (err.errmsg.includes('name_1')) 9 | message += 'name already exists'; 10 | else if (err.errmsg.includes('email_1')) 11 | message += 'email already exists'; 12 | else { 13 | const pathRegex = err.message.match(/\.\$([a-z]+)/) 14 | const path = pathRegex ? pathRegex[1] : ''; 15 | const keyRegex = err.message.match(/key:\s+{\s+:\s\"(.*)(?=\")/) 16 | const key = keyRegex ? keyRegex[1] : ''; 17 | 18 | message = `'${path}' '${key}' already exists` 19 | } 20 | return res.status(200).send({ success: false, message }); 21 | } 22 | }; -------------------------------------------------------------------------------- /src/config/express.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const bodyParser = require("body-parser"); 3 | const methodOverride = require("method-override"); 4 | const cors = require("cors"); 5 | // const frontAuth = require("../api/middlewares/front/auth"); 6 | // const adminRoutes = require("../api/routes/v1/admin/index"); 7 | // const frontRoutes = require("../api/routes/v1/front/index"); 8 | const frontRoutes = require("../api/routes/v1/front/index") 9 | const error = require("../api/middlewares/error"); 10 | const path = require("path"); 11 | const rateLimit = require("express-rate-limit"); 12 | const bearerToken = require("express-bearer-token"); 13 | const compression = require("compression"); 14 | 15 | /** 16 | * Express instance 17 | * @public 18 | */ 19 | const app = express(); 20 | 21 | app.use(bodyParser.json({ limit: "50mb" })); 22 | app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); 23 | app.use(bearerToken()); 24 | 25 | app.use(methodOverride()); 26 | const apiRequestLimiterAll = rateLimit({ 27 | windowMs: 15 * 60 * 1000, // 15 minutes 28 | max: 90000, 29 | }); 30 | 31 | app.use(express.static(path.join(__dirname, "../uploads"))); 32 | app.use(express.static(path.join(__dirname, "../../admin/static/css"))); 33 | 34 | app.use("/v1/", apiRequestLimiterAll); 35 | 36 | var corsOptions = { 37 | origin: "*", 38 | optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204 39 | }; 40 | app.use(cors(corsOptions)); 41 | 42 | // compress all responses 43 | app.use(compression()); 44 | 45 | // authentication middleware to enforce authnetication and authorization 46 | // app.use(frontAuth.userValidation); 47 | 48 | // // authentication middleware to get token 49 | // app.use(frontAuth.authenticate); 50 | 51 | // mount admin api v1 routes 52 | // app.use("/v1/admin", adminRoutes); 53 | 54 | // mount admin api v1 routes 55 | app.use("/v1/front", frontRoutes); 56 | 57 | // Admin Site Build Path 58 | app.use("/admin/", express.static(path.join(__dirname, "../../admin"))); 59 | app.get("/admin/*", function (req, res) { 60 | res.sendFile(path.join(__dirname, "../../admin", "index.html")); 61 | }); 62 | 63 | // Front Site Build Path 64 | app.use("/", express.static(path.join(__dirname, "../../build"))); 65 | app.get("/*", function (req, res) { 66 | res.sendFile(path.join(__dirname, "../../build", "index.html")); 67 | }); 68 | 69 | // if error is not an instanceOf APIError, convert it. 70 | app.use(error.converter); 71 | 72 | // catch 404 and forward to error handler 73 | app.use(error.notFound); 74 | 75 | // error handler, send stacktrace only during development 76 | app.use(error.handler); 77 | 78 | module.exports = app; 79 | -------------------------------------------------------------------------------- /src/config/mongoose.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const { mongo, env } = require('./vars'); 3 | 4 | // set mongoose Promise to Bluebird 5 | mongoose.Promise = Promise; 6 | 7 | // Exit application on error 8 | mongoose.connection.on('error', (err) => { 9 | process.exit(-1); 10 | }); 11 | 12 | // print mongoose logs in dev env 13 | if (env === 'development') { 14 | mongoose.set('debug', true); 15 | } 16 | 17 | /** 18 | * Connect to mongo db 19 | * 20 | * @returns {object} Mongoose connection 21 | * @public 22 | */ 23 | exports.connect = () => { 24 | mongoose.connect(mongo.uri, { 25 | useNewUrlParser: true, 26 | useCreateIndex: true, 27 | useFindAndModify: false, 28 | useUnifiedTopology: true, 29 | keepAlive: 1, 30 | }); 31 | return mongoose.connection; 32 | }; 33 | -------------------------------------------------------------------------------- /src/config/vars.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const moment = require("moment"); 3 | 4 | // import .env variables 5 | require('dotenv').config(); 6 | 7 | module.exports = { 8 | jwtExpirationInterval: process.env.JWT_EXPIRATION_MINUTES, 9 | encryptionKey: process.env.ENCRYPTION_KEY, 10 | env: process.env.NODE_ENV, 11 | port: process.env.PORT, 12 | frontEncSecret: process.env.FRONT_ENC_SECRET, 13 | emailAdd: process.env.EMAIL, 14 | mongo: { 15 | uri: process.env.MONGO_URI, 16 | }, 17 | mailgunDomain: process.env.MAILGUN_DOMAIN, 18 | mailgunApi:process.env.MAILGUN_API, 19 | pwEncryptionKey: process.env.PW_ENCRYPTION_KEY, 20 | pwdSaltRounds: process.env.PWD_SALT_ROUNDS, 21 | baseUrl: process.env.BASE_URL, 22 | frontenUrl: process.env.REACT_APP_FRONT_URL, 23 | adminPasswordKey: process.env.ADMIN_PASSWORD_KEY, 24 | xAuthToken : process.env.XAUTHTOKEN, 25 | authorization : process.env.AUTHORIZATION 26 | }; 27 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | Promise = require("bluebird"); 2 | // const { port } = require("./config/vars"); 3 | // const mongoose = require('./config/mongoose'); 4 | var models = require("../src/api/models"); 5 | const app = require("./config/express"); 6 | app.set("view engine", "ejs"); 7 | const http = require("http"); 8 | // mongoose.connect(); 9 | const port = 8080; 10 | 11 | models.sequelize.sync().then(function () { 12 | // app.listen(port); 13 | http.createServer(app).listen(port); 14 | 15 | }); 16 | 17 | 18 | console.log(`servers is running on ${port}` ) 19 | 20 | 21 | 22 | // http.createServer(app).listen(port); 23 | // console.log(`App is running on ${port}`); 24 | module.exports = app; --------------------------------------------------------------------------------