From 71674ff6ee69b24761e35770fab4427f9c184564 Mon Sep 17 00:00:00 2001 From: Mikail Asada Date: Sat, 7 Oct 2023 05:00:10 +0700 Subject: [PATCH 1/2] feat: redirect when missing route to web page --- src/Main.js | 5 ++++- src/middlewares/Handler.middleware.js | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) 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/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; From fa9c872d18a6b761af814d89deb78720c07fd05e Mon Sep 17 00:00:00 2001 From: Mikail Asada Date: Sat, 4 Nov 2023 02:48:04 +0700 Subject: [PATCH 2/2] feat: project featured --- src/controller/primary/Project.controller.js | 10 ++++++++ src/models/ProjectFeatured.model.js | 26 ++++++++++++++++++++ src/routes/primary/Project.route.js | 1 + src/services/primary/Project.service.js | 16 ++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 src/models/ProjectFeatured.model.js 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/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: [