diff --git a/src/Main.js b/src/Main.js index 243c4d3..9b0f88e 100644 --- a/src/Main.js +++ b/src/Main.js @@ -57,9 +57,12 @@ class Server { run() { this.API = Express(); + const middlewareHandler = new MiddlewareHandler(this); - new MiddlewareHandler(this); + middlewareHandler.global(); new RouteHandler(this); + middlewareHandler.missingRoute(); + this.API.listen(this.env.PORT, this.env.IP, () => this.sendLogs('Server Started, Listening PORT ' + this.env.PORT)); } diff --git a/src/controller/primary/Project.controller.js b/src/controller/primary/Project.controller.js index 50239cd..09f583a 100644 --- a/src/controller/primary/Project.controller.js +++ b/src/controller/primary/Project.controller.js @@ -710,6 +710,16 @@ class ProjectController { )); } + // --- Get Project Featured + async getProjectFeatured(req, res) { + const getProjectTrendsSrv = await this.ProjectService.getProjectFeatured(); + + return res.status(200).json(this.ResponsePreset.resOK( + 'OK', + getProjectTrendsSrv + )); + } + async searchProject(req, res) { const { text, category } = req.query; const { userId } = req.middlewares.authorization; diff --git a/src/middlewares/Handler.middleware.js b/src/middlewares/Handler.middleware.js index 40970e4..de7e01e 100644 --- a/src/middlewares/Handler.middleware.js +++ b/src/middlewares/Handler.middleware.js @@ -11,8 +11,6 @@ class Handler { this.API = this.server.API; this.ResponsePreset = new ResponsePreset(); - - this.global(); } global() { @@ -107,6 +105,13 @@ class Handler { })); } } + + missingRoute() { + this.API.get('*', (req, res) => { + // Redirect to the desired URL + res.redirect(`${this.server.env.WEB_HOST}/not-found`); + }); + } } export default Handler; diff --git a/src/models/ProjectFeatured.model.js b/src/models/ProjectFeatured.model.js new file mode 100644 index 0000000..be51c46 --- /dev/null +++ b/src/models/ProjectFeatured.model.js @@ -0,0 +1,26 @@ +// Library +import { DataTypes } from "sequelize"; + +class ProjectFeatured { + constructor(server) { + const table = server.model.db.define('project_featured', { + project_rank: DataTypes.STRING(17.10), + project_id: DataTypes.STRING(36), + user_id: DataTypes.STRING(36), + title: DataTypes.STRING(25), + description: DataTypes.STRING(700), + logo_path: DataTypes.TEXT, + published_datetime: DataTypes.DATE, + total_likes: DataTypes.BIGINT(21), + total_comments: DataTypes.BIGINT(21) + }, { + tableName: 'project_featured', + timestamps: false + }); + table.removeAttribute('id'); + + this.table = table; + } +} + +export default ProjectFeatured; \ No newline at end of file diff --git a/src/routes/primary/Project.route.js b/src/routes/primary/Project.route.js index e92b18a..42a0a4a 100644 --- a/src/routes/primary/Project.route.js +++ b/src/routes/primary/Project.route.js @@ -42,6 +42,7 @@ class ProjectRoute extends Primary { // Get List Projects this.API.get(this.endpointPrefix + '/get/foryou', this.AuthorizationMiddleware.check(), (req, res) => this.ProjectController.getForYou(req, res)); this.API.get(this.endpointPrefix + '/trends/project', this.AuthorizationMiddleware.check(), (req, res) => this.ProjectController.getProjectTrends(req, res)); + this.API.get(this.endpointPrefix + '/featured/project', (req, res) => this.ProjectController.getProjectFeatured(req, res)); // Get Project Searching this.API.get(this.endpointPrefix + '/search', this.AuthorizationMiddleware.check(), (req, res) => this.ProjectController.searchProject(req, res)); diff --git a/src/services/primary/Project.service.js b/src/services/primary/Project.service.js index a95bddf..178f8bf 100644 --- a/src/services/primary/Project.service.js +++ b/src/services/primary/Project.service.js @@ -9,6 +9,7 @@ import ProjectThumbnailModel from "../../models/ProjectThumbnail.model.js"; import ProjectPreviewModel from "../../models/ProjectPreview.model.js"; import ProjectFilesModel from "../../models/ProjectFiles.model.js"; import ProjectRankModel from "../../models/ProjectRank.model.js"; +import ProjectFeaturedModel from "../../models/ProjectFeatured.model.js"; import ProjectLikesModel from "../../models/ProjectLikes.model.js"; import ProjectCommentsModel from "../../models/ProjectComments.model.js"; import FollowingModel from "../../models/Following.model.js"; @@ -34,6 +35,7 @@ class ProjectService { this.ProjectPreviewModel = new ProjectPreviewModel(this.server).table; this.ProjectFilesModel = new ProjectFilesModel(this.server).table; this.ProjectRankModel = new ProjectRankModel(this.server).table; + this.ProjectFeaturedModel = new ProjectFeaturedModel(this.server).table; this.ProjectLikesModel = new ProjectLikesModel(this.server).table; this.ProjectCommentsModel = new ProjectCommentsModel(this.server).table; this.FollowingModel = new FollowingModel(this.server).table; @@ -1083,6 +1085,20 @@ class ProjectService { return await this.getListPreviewProjects(getDataProjectRankModel, userId); } + async getProjectFeatured() { + const getDataProjectFeaturedModel = await this.ProjectFeaturedModel.findAll({ + attributes: [ + ['project_id', 'id'], + 'user_id', + 'title', + 'description', + ['logo_path', 'logo'] + ] + }); + + return await this.getListPreviewProjects(getDataProjectFeaturedModel, null); + } + async getCategoryProject() { const getDataCategoryModel = await this.CategoryModel.findAll({ order: [