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

Can refresh conversation messages

This commit is contained in:
Pierre HUBERT 2019-11-30 16:35:32 +01:00
parent c9f25a46ae
commit 2d29db4900
3 changed files with 78 additions and 6 deletions

View File

@ -132,7 +132,7 @@ export class ConversationsController {
// Check for new conversations // Check for new conversations
if(h.hasPostParameter("newConversations")) { if(h.hasPostParameter("newConversations")) {
for(const convID of h.postNumbersSet("newConversations")) { for(const convID of h.postNumbersSet("newConversations", 0)) {
if(!ConversationsHelper.DoesUsersBelongsTo(h.getUserId(), convID)) if(!ConversationsHelper.DoesUsersBelongsTo(h.getUserId(), convID))
h.error(401, "You are not allowed to fetch the messages of this conversation ("+convID+")!"); h.error(401, "You are not allowed to fetch the messages of this conversation ("+convID+")!");
@ -144,7 +144,37 @@ export class ConversationsController {
} }
} }
// TODO : Check for refresh on some conversations // Check for refresh on some conversations
if(h.hasPostParameter("toRefresh")) {
const toRefresh = h.postJSON("toRefresh");
for (const key in toRefresh) {
if (toRefresh.hasOwnProperty(key)) {
const element = toRefresh[key];
// Extract conversation ID
if(!key.startsWith("conversation-"))
h.error(400, "Entries of 'toRefresh' should start with 'conversation-' !");
const convID = Number.parseInt(key.replace("conversation-", ""));
// Extract last message ID
if(!element.hasOwnProperty("last_message_id"))
h.error(400, "Missing last_message_id for conversation " + convID + "!");
const lastMessageID = Number.parseInt(element.last_message_id);
// Check user rights
if(!ConversationsHelper.DoesUsersBelongsTo(h.getUserId(), convID))
h.error(401, "You are not allowed to fetch the messages of this conversation ("+convID+")!");
// Get the messages
list["conversation-" + convID] = (await ConversationsHelper.GetNewMessages(convID, lastMessageID))
.map(e => this.ConversationMessageToAPI(e));
// Mark the user has seen the messages
await ConversationsHelper.MarkUserSeen(convID, h.getUserId());
}
}
}
h.send(list); h.send(list);
} }

View File

@ -103,9 +103,10 @@ export class RequestHandler {
* Get a list of integeres included in the request * Get a list of integeres included in the request
* *
* @param name The name of the post field * @param name The name of the post field
* @param minEntries Specify the minimum number of entries required
*/ */
public postNumbersList(name: string) : Array<number> { public postNumbersList(name: string, minEntries : number = 1) : Array<number> {
const param = this.postString(name); const param = this.postString(name, minEntries < 1 ? 0 : minEntries, minEntries > 0);
let list = []; let list = [];
for (const el of param.split(",")) { for (const el of param.split(",")) {
@ -119,6 +120,9 @@ export class RequestHandler {
} }
if(list.length < minEntries)
this.error(400, "Not enough entries in '" + name + "'!")
return list; return list;
} }
@ -126,9 +130,29 @@ export class RequestHandler {
* Turn a list of string into a Set object * Turn a list of string into a Set object
* *
* @param name Name of POST field * @param name Name of POST field
* @param minEntries Minimum number of entries to specify
*/ */
public postNumbersSet(name : string) : Set<number> { public postNumbersSet(name : string, minEntries : number = 1) : Set<number> {
return new Set(this.postNumbersList(name)); return new Set(this.postNumbersList(name, minEntries));
}
/**
* Attempt to decode JSON included in a POST request
*
* @param name Name of POST field
*/
public postJSON(name: string) : any {
const src = this.getPostParam(name);
if(src == undefined)
this.error(400, "Missing JSON '" + name + "' in the request!");
try {
const response = JSON.parse(src);
return response;
} catch(e) {
this.error(500, "'" + name + "' is not a valid JSON !");
}
} }
/** /**

View File

@ -255,6 +255,24 @@ export class ConversationsHelper {
}, },
limit: numberOfMessages, limit: numberOfMessages,
order: "id DESC" order: "id DESC"
})).map(m => this.DBToConversationMessage(convID, m)).reverse();
}
/**
* Get the new messages of a conversation
*
* @param convID Target conversation ID
* @param lastMessageID The ID of the last known message
*/
public static async GetNewMessages(convID: number, lastMessageID: number): Promise<Array<ConversationMessage>> {
return (await DatabaseHelper.Query({
table: MESSAGES_TABLE,
where: {
conv_id: convID
},
customWhere: "ID > ?",
customWhereArgs: [lastMessageID.toString()],
order: "id"
})).map(m => this.DBToConversationMessage(convID, m)); })).map(m => this.DBToConversationMessage(convID, m));
} }