Skip to content

Commit

Permalink
Better sqlite3 (#60)
Browse files Browse the repository at this point in the history
* [add] - better-sqlite3

* [add] - @types/better-sqlite3

* [change] - authLoginをbetter-sqlite3化

* [fix] - better-sqlite3のデータ無かった時の型が違っていた

* [change] - fetchUserをbetter-sqlite3へ

* [change] - 変数名

* [add] - コメント

* [change] - checkSessionをbetter-sqlite3へ

* [change] - こだわり

* [fix] - ユーザー情報のパース忘れてた

* [add] - authRegisterをbetter-sqlite3へ

* [change] - changePasswordをbetter-sqlite3へ

* [fix] - 忘れてた

* [change] - fetchSessionをbetter-sqlite3へ

* [remove] - また忘れてた

* [change] - changeSessionNameをbetter-sqlite3へ

* [change] - sessionLogoutをbetter-sqlite3へ

* [remove] - ログ無効化

* [add] - type

* [change] - createChannelをbetter-sqlite3へ

* [change] - チャンネル取得関数の処理方法改善

* [remove] - 不要なログ

* [change] - roleCheckをbetter-sqlite3へ

* [change] - エラーコード変更

* [change] - deleteChannelをbetter-sqlite3へ

* [change] - updateChannelをbetter-sqlite3へ

* [remove] - sqlite3のコード

* [change] - fetchChannelをbetter-sqlite3へ

* [change] - fetchChannelListをbetter-sqlite3へ

* [change] - joinChannelをbetter-sqlite3へ

* [remove] - 忘れてた

* [change] - leaveChannelをbetter-sqlite3へ

* [add] - チャンネル作成時に履歴テーブルを作るように

* [change] - saveMessageをbetter-sqlite3へ

* [change] - genLinkPreviewをbetter-sqlite3へ

* [change] - deleteMessageをbetter-sqlite3へ

* [add] - type付け

* [change] - editMessageをbetter-sqlite3へ

* [change] - fetchHistoryをbetter-sqlite3へ

* [remove]

* [change] - 変数名

* [change] - reactMessageをbetter-sqlite3へ

* [add] - コメント

* [change] - setMessageReadTimeをbetter-sqlite3へ

* [change] - getMessageReadTimeをbetter-sqlite3へ

* [remove] - getMessageReadTimeからasyncを削除

* [change] - fetchFileIndexをbetter-sqlite3へ

* [change] - fetchFileInfoをbetter-sqlite3へ

* [change] - deleteFileをbetter-sqlite3へ

* [remove] - await

* [change] - fetchFoldersをbetter-sqlite3へ

* [change] - 変数名とコメント

* [change] - calcFullFolderSizeをbetter-sqlite3へ

* [remove] - ログ

* [change] - toggleFileIsPublicをbetter-sqlite3へ

* [remove] - await

* [change] - createFolderをbetter-sqlite3へ

* [change] - deleteFoldersをbetter-sqlite3へ

* [fetchUserをasyncじゃなくした

* [remove] - await

* [change] - fetchMessageをbetter-sqlite3へ

* [change] - fetchOnlineUsersをbetter-sqlite-3へ

* [remove] - await

* [fix] - ファイル名

* [change] - addUserOnlineをbetter-sqlite3へ

* [remove] - 不要なimport

* [change] - fetchRolesをbetter-sqlite3へ

* [remove] - await

* [change] - searchRoleをbetter-sqlite3へ

* [change] - 変数名

* [change] - fetchRoleSingleをbetter-sqlite3へ

* [change] - addRoleをbetter-sqlite3へ

* [change] - roleCheckからasync削除

* [change] - calcRoleUserのelse省略

* [remove] - ロール系関数のasync削除

* [change] - unlinkRoleをbetter-sqlite3へ

* [change] - createRoleをbetter-sqlite3へ

* [change] - updateRoleをbetter-sqlite3へ

* [change] - deleteRoleをbetter-sqlite3へ

* [change] - Server系処理のコード整理

* [change] - fetchUserConfigをbetter-sqlite3へ

* [remove] - 不要なログ

* [change] - fetchUserChannelOrderをbetter-sqlite3へ

* [change] - fetchUserInboxをbetter-sqlite3へ

* [change] - removeFromUserInboxをbetter-sqlite3へ

削除キューシステムは念のため残す

* [change] - saveUserConfigをbetter-sqlite3へ

* [change] - saveUserChannelOrderをbetter-sqlite3へ

* [change] - fetchUserAllをbetter-sqlite3へ

* [change] - searchUserをbetter-sqlite3へ

* [change] - changeUserNameをbetter-sqlite3へ

* [change] - 自分標的のBAN時のエラーコード変更

* [change] - banUserをbetter-sqlite3へ

* [change]- pardonUserをbetter-sqlite3へ

* [change] - removeUserOnlineBySocketIdをbetter-sqlite3へ

* [remove] - 不要なファイル

* Biome Check

* [change] - uploadfileをbetter-sqlite3へ

* Biome Check fetchfile

* Biome Check downloadfile

* [add] - node:

* [change] - Fileからawait削除

* [remove/change] - Message系Socketハンドラからasyncとawait排除

* [remove] - ここもいらない

* [remove] - File系Socketハンドラからawaitとasync排除

* [remove] - Channel系Socketハンドラからawaitとasync排除

* [remove] - User系Socketハンドラからawaitとasync排除

* [remove] - Server系Socketハンドラからasyncとawait排除

* [change] - auth系Socketハンドラからawaitとasync排除
  • Loading branch information
NfoAlex committed Aug 13, 2024
1 parent 73c6e6e commit 6026501
Show file tree
Hide file tree
Showing 77 changed files with 2,213 additions and 2,633 deletions.
21 changes: 21 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"dependencies": {
"better-sqlite3": "^11.1.2",
"express": "^4.18.3",
"install": "^0.13.0",
"multer": "^1.4.5-lts.1",
Expand All @@ -8,6 +9,7 @@
"sqlite3": "^5.1.7"
},
"devDependencies": {
"@types/better-sqlite3": "^7.6.11",
"@types/multer": "^1.4.11",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
Expand Down
10 changes: 5 additions & 5 deletions src/INDEX.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// 実行 :: npx ts-node ./src/INDEX.ts

import fs from "fs";
import { createServer } from "http";
import { Server, Socket } from "socket.io";
import fs from "node:fs";
import { createServer } from "node:http";
import { Server, type Socket } from "socket.io";
import express from "express";

const app = express();
Expand Down Expand Up @@ -56,8 +56,8 @@ io.on("connection", (socket:Socket) => {
//ユーザーから切断されたとき
socket.on("disconnect", async () => {
//接続を削除
const userIdDisconnecting = await removeUserOnlineBySocketId(socket.id);
//ログイン中の全員に切断されたユーザーIdを返す
const userIdDisconnecting = removeUserOnlineBySocketId(socket.id);
//完全に切断されたのなら(nullじゃない)、ログイン中のユーザー全員に通知
if (userIdDisconnecting !== null) {
io.to("LOGGEDIN").emit("removeOnlineUser", {data:userIdDisconnecting});
}
Expand Down
91 changes: 54 additions & 37 deletions src/actionHandler/Channel/createChannel.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,64 @@
import sqlite3 from "sqlite3";
const db = new sqlite3.Database("./records/SERVER.db");
import fetchUser from "../User/fetchUser";
import fetchChannel from "./fetchChannel";

import Database from 'better-sqlite3';
const db = new Database('./records/SERVER.db');
db.pragma('journal_mode = WAL');

/**
* チャンネルを作成する
* @param channelName
* @param description
* @param isPrivate
* @param userId
* @returns
*/
export default async function createChannel(
channelName:string,
description:string,
isPrivate:boolean,
userId:string,
_channelName:string,
_description:string,
_isPrivate:boolean,
_userId:string,
):Promise<boolean> {
try {

return new Promise(async (resolve) => {
//TODO :: ロールチェック
//空いているチャンネルIDを探して取得
const channelIdGen = await getNewChannelId();
//IDが空なら失敗として返す
if (channelIdGen === "") return false;

//空いているチャンネルIDを探して取得
const channelIdGen = await getNewChannelId();
//IDが空なら失敗として返す
if (channelIdGen === "") return false;
//チャンネル用履歴テーブル作成
db.exec(
`
create table if not exists C${channelIdGen}(
messageId TEXT PRIMARY KEY,
channelId TEXT NOT NULL,
userId TEXT NOT NULL,
content TEXT NOT NULL,
isEdited BOOLEAN NOT NULL DEFAULT '0',
linkData TEXT DEFAULT '{}',
fileId TEXT NOT NULL,
time TEXT NOT NULL DEFAULT (DATETIME('now', 'localtime')),
reaction TEXT NOT NULL
)
`
);

//チャンネルデータを挿入
return db.run(`
INSERT INTO CHANNELS (
channelId, channelName, description, createdBy, isPrivate, speakableRole
)
values (?,?,?,?,?,?)
`,
channelIdGen,
channelName,
description,
userId,
isPrivate,
"",
(err:Error) => { //結果処理
//エラーなら失敗と返し、無事ならtrueを返す
if (err) {
resolve(false);
} else {
resolve(true);
}
}
);
});
db.prepare(
`
INSERT INTO CHANNELS (
channelId, channelName, description, createdBy, isPrivate, speakableRole
)
values (?,?,?,?,?,?)
`
).run(
channelIdGen,
_channelName,
_description,
_userId,
_isPrivate?1:0,
""
);

return true;

} catch(e) {

Expand All @@ -53,7 +70,7 @@ export default async function createChannel(

//チャンネルIDの空きを探す
async function getNewChannelId():Promise<string> {
let tryCount:number = 0;
let tryCount = 0;

return new Promise<string>((resolve) => {
try {
Expand Down
48 changes: 21 additions & 27 deletions src/actionHandler/Channel/deleteChannel.ts
Original file line number Diff line number Diff line change
@@ -1,46 +1,40 @@
import sqlite3 from "sqlite3";
const db = new sqlite3.Database("./records/SERVER.db");
import fetchChannel from "./fetchChannel";
import roleCheck from "../../util/roleCheck";

export default async function deleteChannel(
userId: string,
channelId: string
):Promise<boolean> {
import Database from 'better-sqlite3';
const db = new Database('./records/SERVER.db');
db.pragma('journal_mode = WAL');

/**
* チャンネルを削除する
* @param _userId 削除する操作元のユーザーId
* @param _channelId 削除するチャンネルId
* @returns
*/
export default function deleteChannel(
_userId: string,
_channelId: string
):boolean {
try {

//チャンネル情報を取得
const channelInfo = await fetchChannel(channelId, userId);
const channelInfo = fetchChannel(_channelId, _userId);
//無ければ停止
if (channelInfo === null) return false;

//チャンネル作成者でない場合権限があるかを確認
if (channelInfo.createdBy !== userId) {
if (channelInfo.createdBy !== _userId) {
//チャンネル管理のロール権限を確認する
const roleCheckResult = await roleCheck(userId, "ChannelManage");
const roleCheckResult = roleCheck(_userId, "ChannelManage");
if (!roleCheckResult) { //falseなら停止
return false;
}
}

return new Promise((resolve) => {
//テーブルからチャンネルを削除
db.run(
"DELETE FROM CHANNELS WHERE channelId=?",
channelId,
(err) => {
//結果に応じてbooleanで結果を返す
if (err) {
resolve(false);
return;
} else {
resolve(true);
return;
}
}
);

});
//チャンネルのテーブルを削除
db.prepare("DELETE FROM CHANNELS WHERE channelId=?").run(_channelId);

return true;

} catch(e) {

Expand Down
103 changes: 50 additions & 53 deletions src/actionHandler/Channel/fetchChannel.ts
Original file line number Diff line number Diff line change
@@ -1,59 +1,56 @@
import sqlite3 from "sqlite3";
const db = new sqlite3.Database("./records/SERVER.db");
import Database from 'better-sqlite3';
const db = new Database('./records/SERVER.db');
db.pragma('journal_mode = WAL');

import fetchUser from "../User/fetchUser";
import roleCheck from "../../util/roleCheck";

import type { IChannelbeforeParsing, IChannel } from "../../type/Channel";

export default async function fetchChannel(channelId:string, userId:string)
:Promise<IChannel|null> {
return new Promise<IChannel|null>(async (resolve) => {
db.all("SELECT * FROM CHANNELS WHERE channelId = ?", [channelId], async (err:Error, datChannels:IChannelbeforeParsing[]) => {
if (err) {
console.log("fetchChannel :: db : エラー->", err);
resolve(null);
return;
} else {
//console.log("fetchChannel :: db : 取得結果->", datChannels);
//チャンネルデータが無ければnull、あれば整形して返す
if (datChannels.length === 0) {
resolve(null);
return;
} else {
//プラベなら権限と参加を調べて無いならnull
if (datChannels[0].isPrivate) {
//ユーザー情報を取得
const userInfo = await fetchUser(userId, null);
//ユーザー情報がそもそもないならnull
if (userInfo === null) {
resolve(null);
return;
}

//このユーザーがサーバー管理権限がありプラベを見られるか調べる
if (
!userInfo.channelJoined.includes(channelId)
&&
!(await roleCheck(userId, "ServerManage"))
) {
//返す
resolve(null);
return;
}
}

//チャンネル情報を整形する
const infoGotIt:IChannel = {
...datChannels[0],
isPrivate: datChannels[0].isPrivate===1?true:false,
speakableRole: //空文字列なら空配列にする
datChannels[0].speakableRole!==""?datChannels[0].speakableRole.split(","):[]
};
//返す
resolve(infoGotIt);
return;
}
}
});
});
/**
* チャンネル情報を取得する
* @param _channelId
* @param _userId
* @returns
*/
export default function fetchChannel(_channelId:string, _userId:string)
:IChannel|null {
try {

const channelInfo = db.prepare(
"SELECT * FROM CHANNELS WHERE channelId=?"
).get(_channelId) as IChannelbeforeParsing|undefined;

if (channelInfo === undefined) return null;

//プライベートならユーザーの権限、あるいは作成者と同じか調べる
if (channelInfo.isPrivate) {
//ユーザー情報を取得
const userInfo = fetchUser(_userId, null);
if (userInfo === null) return null;

//チャンネル作成者と同じか、あるいはサーバー管理権限があるか調べる
if (
!userInfo.channelJoined.includes(_channelId)
&&
!(roleCheck(_userId, "ServerManage"))
) return null;
}

//チャンネル情報をパースする
const channelInfoParsed:IChannel = {
...channelInfo,
isPrivate: channelInfo.isPrivate === 1,
speakableRole: //👇空文字列なら空配列にする
channelInfo.speakableRole!==""?channelInfo.speakableRole.split(","):[]
}

return channelInfoParsed;

} catch(e) {

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

}
}
Loading

0 comments on commit 6026501

Please sign in to comment.