From 2924b205fd3c15dbcffd19cf942657eadec243f5 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Fri, 3 Jan 2020 17:31:39 +0100 Subject: [PATCH] Get & return the comments of a post --- src/controllers/CommentsController.ts | 48 +++++++++++++++++++++++++++ src/controllers/PostsController.ts | 4 ++- src/entities/Comment.ts | 39 ++++++++++++++++++++++ src/helpers/CommentsHelper.ts | 46 +++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/controllers/CommentsController.ts create mode 100644 src/entities/Comment.ts create mode 100644 src/helpers/CommentsHelper.ts diff --git a/src/controllers/CommentsController.ts b/src/controllers/CommentsController.ts new file mode 100644 index 0000000..cc84b70 --- /dev/null +++ b/src/controllers/CommentsController.ts @@ -0,0 +1,48 @@ +import { RequestHandler } from "../entities/RequestHandler"; +import { Comment } from "../entities/Comment"; +import { LikesHelper, LikesType } from "../helpers/LikesHelper"; + +/** + * Comments controller + * + * @author Pierre HUBERT + */ + +export class CommentsController { + + + /** + * Turn a list of comment object into API entries + * + * @param h Request handler + * @param l List of comments + */ + public static async CommentsToAPI(h: RequestHandler, l: Comment[]) : Promise> { + const list = []; + for (const comment of l) { + list.push(await this.CommentToAPI(h, comment)); + } + return list; + } + + /** + * Turn a comment into an API object + * + * @param h Request handler + * @param c Comment + */ + public static async CommentToAPI(h: RequestHandler, c: Comment) : Promise { + return { + ID: c.id, + userID: c.userID, + postID: c.postID, + time_sent: c.timeSent, + content: c.content, + img_path: c.hasImage ? c.imagePath : null, + img_url: c.hasImage ? c.imageURL : null, + likes: await LikesHelper.Count(c.id, LikesType.COMMENT), + userlike: h.signedIn ? await LikesHelper.IsLiking(h.getUserId(), c.id, LikesType.COMMENT) : false + } + } + +} \ No newline at end of file diff --git a/src/controllers/PostsController.ts b/src/controllers/PostsController.ts index b467c37..a40dd9b 100644 --- a/src/controllers/PostsController.ts +++ b/src/controllers/PostsController.ts @@ -7,6 +7,8 @@ import { MoviesHelper } from "../helpers/MoviesHelper"; import { SurveyHelper } from "../helpers/SurveyHelper"; import { SurveyController } from "./SurveyController"; import { LikesHelper, LikesType } from "../helpers/LikesHelper"; +import { CommentsHelper } from "../helpers/CommentsHelper"; +import { CommentsController } from "./CommentsController"; /** * Posts controller @@ -106,7 +108,7 @@ export class PostsController { user_access: ACCESS_LEVELS_API[await PostsHelper.GetAccessLevel(h.optionnalUserID, p)], // Load comments (if possible) - comments: await PostsHelper.AllowCommentsOnPost(p) ? "to come" : null, + comments: await PostsHelper.AllowCommentsOnPost(p) ? await CommentsController.CommentsToAPI(h, await CommentsHelper.Get(p.id)) : null, }; return data; diff --git a/src/entities/Comment.ts b/src/entities/Comment.ts new file mode 100644 index 0000000..5b3baaa --- /dev/null +++ b/src/entities/Comment.ts @@ -0,0 +1,39 @@ +import { pathUserData } from "../utils/UserDataUtils"; + +/** + * Single comment information + * + * @author Pierre HUBERT + */ + +export interface CommentBuilder { + id: number, + timeSent: number, + userID: number, + postID: number, + content: string, + imagePath ?: string, +} + +export class Comment implements CommentBuilder { + id: number; timeSent: number; + userID: number; + postID: number; + content: string; + imagePath?: string; + + public constructor(info: CommentBuilder) { + for (const key in info) { + if (info.hasOwnProperty(key)) + this[key] = info[key]; + } + } + + get hasImage() : boolean { + return this.imagePath != null && this.imagePath != "" && this.imagePath != "null"; + } + + get imageURL() : string { + return pathUserData(this.imagePath); + } +} \ No newline at end of file diff --git a/src/helpers/CommentsHelper.ts b/src/helpers/CommentsHelper.ts new file mode 100644 index 0000000..0a092ee --- /dev/null +++ b/src/helpers/CommentsHelper.ts @@ -0,0 +1,46 @@ +import { Comment } from "../entities/Comment"; +import { DatabaseHelper } from "./DatabaseHelper"; + +/** + * Comments helper + * + * @author Pierre HUBERT + */ + +const COMMENTS_TABLE = "commentaires"; + +export class CommentsHelper { + + /** + * Get the comments of a POST + * + * @param postID Target post ID + */ + public static async Get(postID: number) : Promise> { + const results = await DatabaseHelper.Query({ + table: COMMENTS_TABLE, + where: { + ID_texte: postID + }, + order: "ID" + }); + + return results.map(this.DbToComment); + } + + /** + * Turn a database entry into a Comment object + * + * @param row Database entry + */ + private static DbToComment(row: any) : Comment { + return new Comment({ + id: row.ID, + userID: row.ID_personne, + postID: row.ID_texte, + timeSent: row.time_insert == null ? new Date(row.date_envoi).getTime() / 100 : row.time_insert, + content: row.commentaire, + imagePath: (row.image_commentaire != null && row.image_commentaire != "") ? row.image_commentaire.replace("file:", "") : null + }); + } +} \ No newline at end of file