|
import fs from 'node:fs'; |
|
import path from 'node:path'; |
|
|
|
import express from 'express'; |
|
import sanitize from 'sanitize-filename'; |
|
import { sync as writeFileAtomicSync } from 'write-file-atomic'; |
|
|
|
import { humanizedISO8601DateTime } from '../util.js'; |
|
|
|
export const router = express.Router(); |
|
|
|
router.post('/all', (request, response) => { |
|
const groups = []; |
|
|
|
if (!fs.existsSync(request.user.directories.groups)) { |
|
fs.mkdirSync(request.user.directories.groups); |
|
} |
|
|
|
const files = fs.readdirSync(request.user.directories.groups).filter(x => path.extname(x) === '.json'); |
|
const chats = fs.readdirSync(request.user.directories.groupChats).filter(x => path.extname(x) === '.jsonl'); |
|
|
|
files.forEach(function (file) { |
|
try { |
|
const filePath = path.join(request.user.directories.groups, file); |
|
const fileContents = fs.readFileSync(filePath, 'utf8'); |
|
const group = JSON.parse(fileContents); |
|
const groupStat = fs.statSync(filePath); |
|
group['date_added'] = groupStat.birthtimeMs; |
|
group['create_date'] = humanizedISO8601DateTime(groupStat.birthtimeMs); |
|
|
|
let chat_size = 0; |
|
let date_last_chat = 0; |
|
|
|
if (Array.isArray(group.chats) && Array.isArray(chats)) { |
|
for (const chat of chats) { |
|
if (group.chats.includes(path.parse(chat).name)) { |
|
const chatStat = fs.statSync(path.join(request.user.directories.groupChats, chat)); |
|
chat_size += chatStat.size; |
|
date_last_chat = Math.max(date_last_chat, chatStat.mtimeMs); |
|
} |
|
} |
|
} |
|
|
|
group['date_last_chat'] = date_last_chat; |
|
group['chat_size'] = chat_size; |
|
groups.push(group); |
|
} |
|
catch (error) { |
|
console.error(error); |
|
} |
|
}); |
|
|
|
return response.send(groups); |
|
}); |
|
|
|
router.post('/create', (request, response) => { |
|
if (!request.body) { |
|
return response.sendStatus(400); |
|
} |
|
|
|
const id = String(Date.now()); |
|
const groupMetadata = { |
|
id: id, |
|
name: request.body.name ?? 'New Group', |
|
members: request.body.members ?? [], |
|
avatar_url: request.body.avatar_url, |
|
allow_self_responses: !!request.body.allow_self_responses, |
|
activation_strategy: request.body.activation_strategy ?? 0, |
|
generation_mode: request.body.generation_mode ?? 0, |
|
disabled_members: request.body.disabled_members ?? [], |
|
chat_metadata: request.body.chat_metadata ?? {}, |
|
fav: request.body.fav, |
|
chat_id: request.body.chat_id ?? id, |
|
chats: request.body.chats ?? [id], |
|
auto_mode_delay: request.body.auto_mode_delay ?? 5, |
|
generation_mode_join_prefix: request.body.generation_mode_join_prefix ?? '', |
|
generation_mode_join_suffix: request.body.generation_mode_join_suffix ?? '', |
|
}; |
|
const pathToFile = path.join(request.user.directories.groups, `${id}.json`); |
|
const fileData = JSON.stringify(groupMetadata, null, 4); |
|
|
|
if (!fs.existsSync(request.user.directories.groups)) { |
|
fs.mkdirSync(request.user.directories.groups); |
|
} |
|
|
|
writeFileAtomicSync(pathToFile, fileData); |
|
return response.send(groupMetadata); |
|
}); |
|
|
|
router.post('/edit', (request, response) => { |
|
if (!request.body || !request.body.id) { |
|
return response.sendStatus(400); |
|
} |
|
const id = request.body.id; |
|
const pathToFile = path.join(request.user.directories.groups, `${id}.json`); |
|
const fileData = JSON.stringify(request.body, null, 4); |
|
|
|
writeFileAtomicSync(pathToFile, fileData); |
|
return response.send({ ok: true }); |
|
}); |
|
|
|
router.post('/delete', async (request, response) => { |
|
if (!request.body || !request.body.id) { |
|
return response.sendStatus(400); |
|
} |
|
|
|
const id = request.body.id; |
|
const pathToGroup = path.join(request.user.directories.groups, sanitize(`${id}.json`)); |
|
|
|
try { |
|
|
|
const group = JSON.parse(fs.readFileSync(pathToGroup, 'utf8')); |
|
|
|
if (group && Array.isArray(group.chats)) { |
|
for (const chat of group.chats) { |
|
console.info('Deleting group chat', chat); |
|
const pathToFile = path.join(request.user.directories.groupChats, `${id}.jsonl`); |
|
|
|
if (fs.existsSync(pathToFile)) { |
|
fs.unlinkSync(pathToFile); |
|
} |
|
} |
|
} |
|
} catch (error) { |
|
console.error('Could not delete group chats. Clean them up manually.', error); |
|
} |
|
|
|
if (fs.existsSync(pathToGroup)) { |
|
fs.unlinkSync(pathToGroup); |
|
} |
|
|
|
return response.send({ ok: true }); |
|
}); |
|
|