Skip to content

Commit

Permalink
Edit message (#53)
Browse files Browse the repository at this point in the history
* [add] - メッセージ編集用の関数とSocketハンドラ作成

* [add] - メッセージを編集したかどうかのカラム追加

* [fix] - typo

* [add] - メッセージInterfaceに編集したかどうか値追加

* [add] - 編集したかどうかカラム用のmigration追加

* [add] - メッセのパースに編集したかどうかを追加

* [fix] - migrationファイル用の日付間違い

* [change] - メッセージの編集データをそのチャンネル参加者に送るように

* [change] - メッセージ編集時、メッセデータを渡しつつクライアントへの返し方も更新

* [add] - 編集適用時内容が一緒なら停止
  • Loading branch information
NfoAlex committed Jul 14, 2024
1 parent 99682ef commit 8be385e
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 1 deletion.
66 changes: 66 additions & 0 deletions src/actionHandler/Message/editMessage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import sqlite3 from "sqlite3";
const db = new sqlite3.Database("./records/MESSAGE.db");
import fetchMessage from "./fetchMessage";

import type { IMessage } from "../../type/Message";

/**
* メッセージの編集
* @param channelId
* @param messageId
* @param userIdBy
* @returns
*/
export default async function editMessage(
channelId: string,
messageId: string,
contentUpdating: string,
userIdBy: string,
):Promise<IMessage|null> {
try {

//もし更新内容が空なら停止
if (contentUpdating === "" || contentUpdating === null) return null;

//編集するメッセージを取得
const messageEditing = await fetchMessage(channelId, messageId);
if (messageEditing === null) return null;

//もし現在のテキストと編集内容が一緒なら停止
if (messageEditing.content === contentUpdating) return null;

//操作者とメッセ主が違うならエラーで停止
if (messageEditing.userId !== userIdBy) return null;

return new Promise((resolve) => {
db.run(
`
UPDATE C` + channelId + ` SET
content=?,
isEdited=?
WHERE messageId='` + messageId + `'
`,
[contentUpdating, true],
(err:Error) => {
if (err) {
console.log("editMessage :: db : エラー->", err);
resolve(null);
return;
} else {
//取得したメッセデータも上書きして結果として渡す
messageEditing.content = contentUpdating;
messageEditing.isEdited = true;
resolve(messageEditing);
return;
}
}
);
});

} catch(e) {

console.log("editMessage :: エラー->", e);
return null;

}
}
1 change: 1 addition & 0 deletions src/actionHandler/Message/fetchHistory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export default async function fetchHistory(

historyParsed.push({
...history[index],
isEdited: history[index].isEdited===1?true:false,
linkData: linkDataParsed,
reaction: JSON.parse(history[index].reaction)
});
Expand Down
1 change: 1 addition & 0 deletions src/actionHandler/Message/fetchMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export default function fetchMessage(
//生メッセージデータを扱える形にパースする
const messageParsed:IMessage = {
...message[0],
isEdited: message[0].isEdited===1?true:false,
linkData: message[0].linkData!==undefined?JSON.parse(message[0].linkData):{},
reaction: message[0].reaction!==undefined?JSON.parse(message[0].reaction):{}
};
Expand Down
3 changes: 2 additions & 1 deletion src/actionHandler/Message/saveMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@ export default async function saveMessage(
messageId: "",
channelId: message.channelId,
userId: userId,
isEdited: false,
content: message.content,
linkData: {},
time: "",
reaction: {}
reaction: {},
};

//もしメッセージ長がサーバー設定より長ければエラー
Expand Down
3 changes: 3 additions & 0 deletions src/db/InitMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import sqlite3 from "sqlite3";
const db = new sqlite3.Database("./records/MESSAGE.db");

import migration20240603 from "./migration/Message/20240603";
import migrationMessage20240709 from "./migration/Message/20240709";

db.serialize(() => {
//migration
migration20240603();
migrationMessage20240709();

//randomチャンネル用のテーブル作成
db.run(
Expand All @@ -14,6 +16,7 @@ db.serialize(() => {
channelId TEXT NOT NULL,
userId TEXT NOT NULL,
content TEXT NOT NULL,
isEdited BOOLEAN NOT NULL DEFAULT '0',
linkData TEXT DEFAULT '{}',
time TEXT NOT NULL DEFAULT (DATETIME('now', 'localtime')),
reaction TEXT NOT NULL
Expand Down
23 changes: 23 additions & 0 deletions src/db/migration/Message/20240709.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import sqlite3 from "sqlite3";
const db = new sqlite3.Database("./records/MESSAGE.db");

/**
* すべてのチャンネル履歴テーブルへisEditedカラムを追加
*/
export default async function migrationMessage20240709() {
//チャンネル分のテーブルへisEditedカラムを追加
db.all(
`
SELECT name FROM sqlite_master WHERE type='table';
`,
(err:Error, tables:[{name:string}]) => {
//console.log("20240709 :: tables->", tables);

//ループしてisEditedカラムを追加
for (let channelName of tables) {
db.run(`ALTER TABLE ` + channelName.name + ` ADD isEdited BOLEAN NOT NULL DEFAULT '0'`, (err:Error)=>{});
}
return;
}
);
}
46 changes: 46 additions & 0 deletions src/socketHandler/Message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import genLinkPreview from "../util/genLinkPreview";

import type IRequestSender from "../type/requestSender";
import type { IMessage, IMessageReadTime } from "../type/Message";
import editMessage from "../actionHandler/Message/editMessage";

module.exports = (io:Server) => {
io.on("connection", (socket:Socket) => {
Expand Down Expand Up @@ -146,6 +147,51 @@ module.exports = (io:Server) => {
}
});

//メッセージの編集
socket.on("editMessage", async (
dat:{
RequestSender: IRequestSender,
channelId: string,
messageId: string,
contentUpdating: string,
}
) => {
//セッション認証
if (!(await checkSession(dat.RequestSender))) {
socket.emit("RESULT::editMessage", { result:"ERROR_SESSION_ERROR", data:null });
return;
}

try {
const msgEditResult = await editMessage(
dat.channelId,
dat.messageId,
dat.contentUpdating,
dat.RequestSender.userId
);

//結果に応じてデータを送信
if (msgEditResult !== null) {
//編集の結果
socket.emit("RESULT::editMessage", { result:"SUCCESS", data:null });
//編集したメッセージそのものをチャンネル参加者へ送信
io.to(dat.channelId).emit(
"updateMessage",
{
result: "SUCCESS",
data: msgEditResult
}
);
} else {
socket.emit("RESULT::editMessage", { result:"ERROR_DB_THING", data:null });
return;
}
} catch(e) {
socket.emit("RESULT::editMessage", { result:"ERROR_INTERNAL_THING", data:null });
return;
}
})

//履歴の取得
socket.on("fetchHistory", async (
dat: {
Expand Down
2 changes: 2 additions & 0 deletions src/type/Message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export interface IMessageBeforeParsing {
channelId: string,
userId: string,
content: string,
isEdited: 1|0,
linkData: string,
time: string,
reaction: string
Expand All @@ -14,6 +15,7 @@ export interface IMessage {
messageId: string,
channelId: string,
userId: string,
isEdited: boolean,
content: string,
linkData: {
[key: string]:
Expand Down

0 comments on commit 8be385e

Please sign in to comment.