1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2024-11-26 07:19:23 +00:00

Can create text posts

This commit is contained in:
Pierre HUBERT 2020-01-04 17:06:43 +01:00
parent a726ba4230
commit 037916e7eb
4 changed files with 127 additions and 5 deletions

View File

@ -13,6 +13,7 @@ import { GroupsAccessLevel } from "../entities/Group";
import { GroupsHelper } from "../helpers/GroupsHelper"; import { GroupsHelper } from "../helpers/GroupsHelper";
import { time } from "../utils/DateUtils"; import { time } from "../utils/DateUtils";
import { findKey } from "../utils/ArrayUtils"; import { findKey } from "../utils/ArrayUtils";
import { check_string_before_insert } from "../utils/StringUtils";
/** /**
* Posts controller * Posts controller
@ -139,7 +140,7 @@ export class PostsController {
userID: h.getUserId(), userID: h.getUserId(),
timeCreate: time(), timeCreate: time(),
kind: <PostKind>h.postString("kind"), kind: <PostKind>h.postString("kind"),
content: h.postContent("content"), content: h.postContent("content", 0),
visibilityLevel: this.PostVisibilityLevel(h, "visibility"), visibilityLevel: this.PostVisibilityLevel(h, "visibility"),
// Post target // Post target
@ -148,8 +149,31 @@ export class PostsController {
}); });
console.info(newPost); // Process each kind of post
h.success("Go on."); switch(newPost.kind) {
// Text posts
case PostKind.POST_KIND_TEXT:
// Check the string
if(!check_string_before_insert(newPost.content))
h.error(400, "Specified post content is invalid!");
break;
default:
h.error(500, "Unsupported kind of post!");
}
// Create the post
const postID = await PostsHelper.Create(newPost);
// TODO : create a notification
h.send({
success: "The post has been created!",
postID: postID
});
} }
/** /**

View File

@ -85,9 +85,10 @@ export class RequestHandler {
* Get some content for post and satinize it (remove HTML nodes) * Get some content for post and satinize it (remove HTML nodes)
* *
* @param name The name of the POST field * @param name The name of the POST field
* @param minLength Optionnal minimal length for the post
*/ */
public postContent(name: string) : string { public postContent(name: string, minLength ?: number) : string {
const content = this.postString(name); const content = this.postString(name, minLength);
if(content.match(/data:image/)) if(content.match(/data:image/))
this.error(401, "Please do not include inline images!"); this.error(401, "Please do not include inline images!");

View File

@ -4,6 +4,7 @@ import { DatabaseHelper } from "./DatabaseHelper";
import { UserHelper } from "./UserHelper"; import { UserHelper } from "./UserHelper";
import { GroupsHelper } from "./GroupsHelper"; import { GroupsHelper } from "./GroupsHelper";
import { GroupMembershipLevels } from "../entities/GroupMember"; import { GroupMembershipLevels } from "../entities/GroupMember";
import { mysql_date } from "../utils/DateUtils";
/** /**
* Posts helper * Posts helper
@ -35,6 +36,90 @@ const PostDBTypes : Record<string, PostKind> = {
*/ */
export class PostsHelper { export class PostsHelper {
/**
* Create a new post
*
* @param p Information about the post
* @returns The ID of the created post
* @throws In case of failure
*/
public static async Create(p: Post) : Promise<number> {
// Extract the kind of post
let kindDb : string = "";
for (const key in PostDBTypes) {
if (PostDBTypes.hasOwnProperty(key) && PostDBTypes[key] == p.kind)
kindDb = key;
}
if(kindDb == "")
throw new Error("Unknown post kind: " + kindDb);
// Prepare post target
let userID: number, friendID: number, groupID: number;
// Post on user page
if(p.isUserPage) {
userID = p.userPageID;
friendID = p.userID;
groupID = 0;
}
// Post on group page
else {
userID = p.userID;
friendID = 0;
groupID = p.groupID;
}
// Generate database entry
let data = {
// Post meta-data & basic info
ID_personne: userID,
ID_amis: friendID,
group_id: groupID,
date_envoi: mysql_date(),
time_insert: p.timeCreate,
niveau_visibilite: p.visibilityLevel,
type: kindDb,
texte: p.hasContent ? p.content : "",
// Generic file infos
size: !p.hasFile ? null : p.file.size,
file_type: !p.hasFile ? null : p.file.type,
path: !p.hasFile ? null : p.file.path,
// Movies post
idvideo: p.hasMovie ? p.movieID : null,
// Countdown timer (TODO : implement)
jour_fin: null,
mois_fin: null,
annee_fin: null,
time_end: p.hasTimeEnd ? p.timeEnd : null,
// Weblink
url_page: !p.hasLink ? null : p.link.url,
titre_page: !p.hasLink ? null : p.link.title,
description_page: !p.hasLink ? null : p.link.description,
image_page: !p.hasLink ? null : p.link.image
}
// Insert the post
const postID = await DatabaseHelper.InsertRow(TABLE_NAME, data);
return postID;
}
/** /**
* Get the posts of a user * Get the posts of a user
* *

View File

@ -46,3 +46,15 @@ export function removeHTMLNodes(input : string) : string {
return input.replace(/</g, "&lt;") return input.replace(/</g, "&lt;")
.replace(/>/g, "&gt;"); .replace(/>/g, "&gt;");
} }
/**
* Check a string before inserting it
*
* Legacy function that might be completed
* / replaced in the future
*
* @param s The string to check
*/
export function check_string_before_insert(s: string) : boolean {
return s.trim().length >= 3;
}