Files
wechat-radar/lib/groups.ts
T
2026-05-24 13:42:56 +08:00

96 lines
2.8 KiB
TypeScript

import { db } from './db';
export interface GroupRow {
id: number;
name: string;
color: string;
emoji: string | null;
sort_order: number;
created_at: number;
member_count?: number;
message_count?: number;
}
export function listGroups(): GroupRow[] {
return db()
.prepare(
`SELECT g.*,
(SELECT COUNT(*) FROM group_tags t WHERE t.group_id = g.id) AS member_count
FROM groups g
ORDER BY g.sort_order ASC, g.id ASC`,
)
.all() as GroupRow[];
}
export function createGroup(input: { name: string; color: string; emoji?: string }) {
const max = db().prepare('SELECT COALESCE(MAX(sort_order), 0) AS m FROM groups').get() as {
m: number;
};
const stmt = db().prepare(
'INSERT INTO groups (name, color, emoji, sort_order, created_at) VALUES (?, ?, ?, ?, ?)',
);
const info = stmt.run(input.name, input.color, input.emoji ?? null, max.m + 1, Date.now());
return Number(info.lastInsertRowid);
}
export function deleteGroup(id: number) {
db().prepare('DELETE FROM groups WHERE id = ?').run(id);
}
export function tagGroup(chatroomId: string, groupId: number) {
db()
.prepare('INSERT OR IGNORE INTO group_tags (chatroom_id, group_id) VALUES (?, ?)')
.run(chatroomId, groupId);
}
export function untagGroup(chatroomId: string, groupId: number) {
db()
.prepare('DELETE FROM group_tags WHERE chatroom_id = ? AND group_id = ?')
.run(chatroomId, groupId);
}
export function tagsForChatroom(chatroomId: string): number[] {
const rows = db()
.prepare('SELECT group_id FROM group_tags WHERE chatroom_id = ?')
.all(chatroomId) as Array<{ group_id: number }>;
return rows.map((r) => r.group_id);
}
export function chatroomsForGroup(groupId: number): string[] {
const rows = db()
.prepare('SELECT chatroom_id FROM group_tags WHERE group_id = ?')
.all(groupId) as Array<{ chatroom_id: string }>;
return rows.map((r) => r.chatroom_id);
}
export function listAllTags(): Array<{ chatroom_id: string; group_id: number }> {
return db()
.prepare('SELECT chatroom_id, group_id FROM group_tags')
.all() as Array<{ chatroom_id: string; group_id: number }>;
}
export function isFavorite(chatroomId: string): boolean {
const r = db()
.prepare('SELECT 1 AS x FROM favorites WHERE chatroom_id = ?')
.get(chatroomId) as { x: number } | undefined;
return !!r;
}
export function listFavorites(): string[] {
return (
db().prepare('SELECT chatroom_id FROM favorites ORDER BY starred_at DESC').all() as Array<{
chatroom_id: string;
}>
).map((r) => r.chatroom_id);
}
export function setFavorite(chatroomId: string, fav: boolean) {
if (fav) {
db()
.prepare('INSERT OR IGNORE INTO favorites (chatroom_id, starred_at) VALUES (?, ?)')
.run(chatroomId, Date.now());
} else {
db().prepare('DELETE FROM favorites WHERE chatroom_id = ?').run(chatroomId);
}
}