-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor storage module and update dependencies
- Loading branch information
Showing
2 changed files
with
114 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(), | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters