Skip to content

Commit

Permalink
Refactor storage module and update dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
taisan11 committed Oct 20, 2024
1 parent b771182 commit 1ffcaa8
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 136 deletions.
217 changes: 97 additions & 120 deletions src/module/storage/drizzle.ts
Original file line number Diff line number Diff line change
@@ -1,129 +1,106 @@
import { and, eq } from "drizzle-orm";
import { createStorage } from "unstorage";
import { config } from "../config";
import { subjectpaser,datpaser } from "../pase";
import { NewThreadParams,PostThreadParams, getSubjectReturn, getThreadReturn, postReturn, postThread } from "../storage";
import { posts, threds } from "./schema/sqlite";
import {nanoid} from 'nanoid'
import { NewThreadParams,PostThreadParams, driver, getSubjectReturn, getThreadReturn, postReturn } from "../storage";
import * as schema from "./schema/sqlite"
import { drizzle } from 'drizzle-orm/bun-sqlite';
import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";

const drizzleInstance = config().preference.site.drizzle;
const db = drizzleInstance

export async function addSubject_db(BBSKEY:string,postnum: number, title: string,id: string):Promise<void> {
const now = new Date().toISOString()
// UnixTime
const nowUnix = Math.floor(new Date(now).getTime() / 1000)
db.insert(threds).values({
id: id,
ItaID: BBSKEY,
ThTitle: title,
PostNumNow: postnum,
createdAt: nowUnix
})
}
async function postNumEdit(BBSKEY:string,id: string):Promise<string> {
const thread = await db.select().from(threds).where(and(eq(threds.id,id),eq(threds.ItaID,BBSKEY))).get()
if(thread){
db.update(threds).set({
PostNumNow:thread.PostNumNow+1
}).where(and(eq(threds.id,id),eq(threds.ItaID,BBSKEY)))
}
return thread!.PostNumNow+1
}
export async function DeleteOldSubject_db(BBSKEY:string,):Promise<void> {
return
}
export async function getSubjecttxt_db(BBSKEY:string,):Promise<string> {
const threads = await db.select().from(threds).where(eq(threds.ItaID,BBSKEY))
return threads.map((thread)=>{
return `${thread.id}.dat<>${thread.ThTitle} (${thread.PostNumNow})`
}).join('\n')
}
export async function getSubject_db(BBSKEY:string,):Promise<getSubjectReturn> {
const threads = await db.select().from(threds).where(eq(threds.ItaID,BBSKEY))
const result: { [key: string]: [string, string] } = {};
threads.map((threads=>{
result[threads.id]=[threads.ThTitle,threads.PostNumNow]
}))
return {'data':result,has:true}
}
export async function NewThread_db(BBSKEY:string,{ name, mail, message, date, title, id }: NewThreadParams):Promise<postReturn> {
const now = new Date().toISOString()
// UnixTime
const nowUnix = Math.floor(new Date(now).getTime() / 1000).toString()
addSubject_db(BBSKEY,1, title,id);
db.insert(posts).values({
name: name,
date: date,
id: id+BBSKEY+"1"+nanoid(10),
ItaID: BBSKEY,
ThID: id,
postNum: 1,
mail: mail,
MESSAGE: message,
createAt: nowUnix
})
return { 'sc': true, 'redirect': `${BBSKEY}/${id}` };
}
export async function postThread_db(BBSKEY:string,{ name, mail, message, date, id }: PostThreadParams):Promise<postReturn> {
const now = new Date().toISOString()
// UnixTime
const nowUnix = Math.floor(new Date(now).getTime() / 1000)
const thread = await db.select().from(threds).where(and(eq(threds.id,id),eq(threds.ItaID,BBSKEY)))
const postnum = await postNumEdit(BBSKEY,id)
if(thread){
db.insert(posts).values({
name: name,
date: date,
id: id+BBSKEY+postnum+nanoid(10),
ItaID: BBSKEY,
ThID: id,
postNum: postnum,
mail: mail,
MESSAGE: message,
createAt: nowUnix
})
//例えばdrizzle()をある関数の引数として受け入れたいときどのような型を指定すればいいでしょうか?
export function unstorage_driver(db:BaseSQLiteDatabase<'sync', void, Record<string, never>>):driver{
async function addSubject_file(BBSKEY:string,postnum: number, title: string,id: string):Promise<void> {
await db.insert(schema.threds).values({id:id,BBSKEY,postnum:postnum,title:title,createAt:new Date()}).execute();
}
return {'sc':true,'redirect':`${BBSKEY}/${id}`};
}
export async function getThread_db(BBSKEY:string,id: string):Promise<getThreadReturn> {
const thread = await db.select().from(threds).where(and(eq(threds.id,id),eq(threds.ItaID,BBSKEY))).get()
if(thread){
const postss = await db.select().from(posts).where(and(eq(posts.ThID,id),eq(posts.ItaID,BBSKEY)))
const result:getThreadReturn = {
has:true,
data:{
title:thread.ThTitle,
post:postss.map((post)=>{
return {
postid:post.id,
name:post.name,
mail:post.mail,
date:post.date,
message:post.MESSAGE
}
})
async function postNumEdit(BBSKEY:string,id: string):Promise<void> {
const storage = createStorage(drives);
const SUBJECT = await storage.getItem(`${BBSKEY}/SUBJECT.TXT`);
const lines = String(SUBJECT).split('\n');
const newLines = lines.map((line) => {
if (line.startsWith(`${id}.dat`)) {
const [id, title] = line.split('<>');
const [postnum] = title.match(/\((\d+)\)/) || ['0'];
//(1) -> 1
const newNum = postnum.replace(/\((\d+)\)/, '$1');
//title (1) -> title (2)
const newTitle = title.replace(/\((\d+)\)/, `(${Number(newNum) + 1})`);
return `${id}<>${newTitle}`;
}
};
return result
return line;
});
const newSubject = newLines.join('\n');
await storage.setItem(`${BBSKEY}/SUBJECT.TXT`, newSubject);
}
return {
has:false,
data:{
title:"",
post:[]
}
async function DeleteOldSubject_file(BBSKEY:string,):Promise<void> {
const storage = createStorage(drives);
const SUBJECT = await storage.getItem(`${BBSKEY}/SUBJECT.TXT`);
const lines = String(SUBJECT).split('\n');
const newLines = lines.slice(0, config()!.preference!.limit!.MaxSubject); // Keep the first 10 lines
const newSubject = newLines.join('\n');
await storage.setItem(`${BBSKEY}/SUBJECT.TXT`, newSubject);
}
}
export async function getdat_db(BBSKEY:string,idextension: string):Promise<string> {
const post = await db.select().from(posts).where(and(eq(posts.id,idextension),eq(posts.ItaID,BBSKEY)))
const title = await db.select().from(threds).where(and(eq(threds.id,post[0].ThID),eq(threds.ItaID,BBSKEY)))
let a = ""
post.map((post)=>{
//最初の一回だけ分岐
if(post.postNum===1){
a + `${post.name}<>${post.mail}<>${post.date}<>${post.MESSAGE}<>${title[0].ThTitle}`
async function getSubjecttxt_file(BBSKEY:string,):Promise<string> {
const storage = createStorage(drives);
const SUBTXT = await storage.getItem(`${BBSKEY}/SUBJECT.TXT`);
return String(SUBTXT);
}
async function getSubject_file(BBSKEY:string,):Promise<getSubjectReturn> {
const storage = createStorage(drives);
const HASSUB = await storage.hasItem(`${BBSKEY}/SUBJECT.TXT`);
if (!HASSUB) {
return {'data':{'a':["a","a"]},'has':HASSUB};
}
a + `${post.name}<>${post.mail}<>${post.date}<>${post.MESSAGE}`
})
return a
const SUBTXT = await storage.getItem(`${BBSKEY}/SUBJECT.TXT`);
return {'data':subjectpaser(String(SUBTXT)),'has':HASSUB};
}
async function NewThread_file(BBSKEY:string,{ name, mail, message, date, title, id }: NewThreadParams):Promise<postReturn> {
const storage = createStorage(drives);
await storage.setItem(`${BBSKEY}/dat/${id}.dat`, `${name}<>${mail}<>${date}<>${message}<>${title}`);
await addSubject_file(BBSKEY,1, title,id);
return { 'sc': true, 'redirect': `${BBSKEY}/${id}` };
}

async function postThread_file(BBSKEY:string,{ name, mail, message, date, id }: PostThreadParams):Promise<postReturn> {
const storage = createStorage(drives);
const THDATTXT = await storage.getItem(`${BBSKEY}/dat/${id}.dat`);
await storage.setItem(`${BBSKEY}/dat/${id}.dat`, `${THDATTXT}\n${name}<>${mail}<>${date}<>${message}`);
await postNumEdit(BBSKEY,id);
return {'sc':true,'redirect':`${BBSKEY}/${id}`};
}

async function getThread_file(BBSKEY:string,id: string):Promise<getThreadReturn> {
const storage = createStorage(drives);
const dat = await storage.getItem(`${BBSKEY}/dat/${id}.dat`);
const hasdat= await storage.hasItem(`${BBSKEY}/dat/${id}.dat`);
return {'data':datpaser(String(dat)),has:hasdat};
}
async function getdat_file(BBSKEY:string,idextension: string):Promise<string> {
const storage = createStorage(drives);
const dat = await storage.getItem(`${BBSKEY}/dat/${idextension}.dat`);
return String(dat)
}

/**
* @description 仮実装 init admin
*/
async function init_file():Promise<string> {
const storage = createStorage(drives);
await storage.clear();
await storage.setItem("/test/SUBJECT.TXT", '1.dat<>初期スレ (1)');
console.log('TEST(subjectFile):',await storage.hasItem("/test/SUBJECT.TXT"))
await storage.setItem("/test/dat/1.dat", 'カワイイ名無しさん<><>2022/09/08(木) 17:40:07.67 ID:000000000<>こんにちは!!<>初期スレ');
console.log('TEST(datFile):',await storage.hasItem("/test/dat/1.dat"))
return String('init!!')
}

return {
addSubject: (BBSKEY:string,postnum: number, title: string,id: string) => addSubject_file(BBSKEY,postnum, title,id),
DeleteOldSubject: (BBSKEY: string) => DeleteOldSubject_file(BBSKEY),
getSubjecttxt: (BBSKEY: string) => getSubjecttxt_file(BBSKEY),
getSubject: (BBSKEY: string) => getSubject_file(BBSKEY),
NewThread: (BBSKEY: string, { name, mail, message, date, title, id }: NewThreadParams) => NewThread_file(BBSKEY,{ name, mail, message, date, title, id }),
postThread: (BBSKEY: string, { name, mail, message, date, id }: PostThreadParams) => postThread_file(BBSKEY,{ name, mail, message, date, id }),
getThread: (BBSKEY: string, id: string) => getThread_file(BBSKEY,id),
getdat: (BBSKEY: string, idextension: string) => getdat_file(BBSKEY,idextension),
init: () => init_file(),
}
}
33 changes: 17 additions & 16 deletions src/module/storage/schema/sqlite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,28 @@ import { sql } from 'drizzle-orm';
import { sqliteTable, text, integer, uniqueIndex,index } from 'drizzle-orm/sqlite-core';

export const Ita = sqliteTable('Ita', {
id: text('id').primaryKey(),
name: text('name'),
id: text("id").primaryKey(),
title: text("title").notNull(),
config_file: text("config_file"),
}
);

export const threds = sqliteTable('threds', {
id: text('id').primaryKey(),
ItaID:text('ItaID').notNull().references(()=>Ita.id),
PostNumNow:text('PostNumNow').notNull(),//1~1000など
ThTitle:text('ThTitle').notNull(),
createdAt: text('created_at').notNull().default(sql`(CURRENT_TIMESTAMP)`),
id: text("id").primaryKey(),
BBSKEY: text("BBSKEY").notNull().references(() => Ita.id),
title: text("title").notNull(),
Res: integer("Res").notNull(),
createAt: integer("createAt",{mode:"timestamp_ms"}).notNull(),
})

export const posts = sqliteTable('posts', {
id: text('id').primaryKey(),// ItaID+thID+postNum
postNum: integer('postnum').notNull(),
ItaID:text('ItaID').notNull().references(()=>Ita.id),
ThID:text('ThID').notNull().references(()=>threds.id),//1~1000など
name:text('name').notNull(),
MESSAGE:text('MESSAGE').notNull(),
mail:text('mail').notNull(),
date: text('date').notNull(),
createAt: text('created_at').notNull().default(sql`(CURRENT_TIMESTAMP)`),
id: text("id").primaryKey(),
BBSKEY: text("BBSKEY").notNull().references(() => Ita.id),
ThID: text("ThID").notNull().references(() => threds.id),
ResNum: integer("ResNum").notNull(),
name: text("name").notNull(),
mail: text("mail"),
date: text("date").notNull(),
message: text("message").notNull(),
createAt: integer("createAt",{mode:"timestamp_ms"}).notNull(),
})

0 comments on commit 1ffcaa8

Please sign in to comment.