First Commit. Duplicate bunext-sqlite preset

This commit is contained in:
2026-10-18 16:47:11 +01:00
commit 81e4a8aecc
718 changed files with 41695 additions and 0 deletions
@@ -0,0 +1,55 @@
import type { BUN_SQLITE_BSQLITE_MEDIA_JOIN } from "@/src/types/sql-joins";
import type { APIResponseObject } from "@moduletrace/bun-sqlite";
import _ from "lodash";
import grabUsers from "../users/grab-users";
type Params = {
media_res: APIResponseObject<BUN_SQLITE_BSQLITE_MEDIA_JOIN>;
};
export default async function appendUsersToMedia({
media_res,
}: Params): Promise<APIResponseObject<BUN_SQLITE_BSQLITE_MEDIA_JOIN>> {
try {
let new_media_res = _.cloneDeep(media_res);
const media = new_media_res.payload;
const users_ids = media
?.map((m) => m.user_id)
.filter((n) => !_.isUndefined(n) && _.isNumber(n));
const unique_users_ids = _.uniq(users_ids);
if (users_ids?.[0] && media?.[0]) {
const users_res = await grabUsers({
query: { ids: unique_users_ids },
});
const users = users_res.payload || [];
for (let i = 0; i < media.length; i++) {
const single_media = media[i];
const target_user = users.find(
(u) => u.id == single_media?.user_id,
);
if (!target_user || !single_media?.user_id) {
continue;
}
new_media_res.payload![i]!.user = target_user;
if (i == 0) {
new_media_res.singleRes = target_user;
}
}
}
return new_media_res;
} catch (error: any) {
console.log("Append users to media ERROR =>", error.message);
return media_res;
}
}
@@ -0,0 +1,113 @@
import _ from "lodash";
import type { BUN_SQLITE_BSQLITE_MEDIA } from "@/db/types/db";
import grabMediaFromParadigm from "@/src/functions/backend/db/media/grab-media-from-paraidigm";
import type { MediaParadigmType, TableType, User } from "@/src/types";
import grabDirNames from "@/src/utils/grab-dir-names";
import BunSQLite from "@moduletrace/bun-sqlite";
import { rmSync } from "fs";
import path from "path";
type Params = {
id?: string | number;
ids?: (string | number)[];
media_paradigm?: MediaParadigmType;
/**
* ID of the user to be assigned to this media.
* Different from logged in user id
*/
user_id?: string | number | null;
can_delete_all_media?: boolean;
};
export default async function deleteMedia(params: Params) {
const { id, ids, media_paradigm, user_id, can_delete_all_media } = params;
const { DATA_DIR } = grabDirNames();
let media_to_delete = new Set<number>();
if (media_paradigm && user_id) {
const media_res = (
await grabMediaFromParadigm({ media_paradigm, user_id })
).payload;
if (media_res) {
for (let i = 0; i < media_res.length; i++) {
const media = media_res[i];
if (!media?.id) continue;
media_to_delete.add(media.id);
}
}
}
let media_ids_to_del: (number | string)[] = [];
if (id) {
media_ids_to_del.push(id);
}
if (ids) {
media_ids_to_del.push(...ids);
}
if (media_ids_to_del[0]) {
for (let i = 0; i < media_ids_to_del.length; i++) {
const media_id_to_delete = media_ids_to_del[i];
const target_media = (
await BunSQLite.select<BUN_SQLITE_BSQLITE_MEDIA>({
table: "media",
targetId: media_id_to_delete,
})
).singleRes;
if (target_media?.id) {
if (target_media.user_id !== user_id && !can_delete_all_media) {
throw new Error(`Can't delete this media!`);
}
media_to_delete.add(target_media.id);
}
}
}
const media_to_delete_array = Array.from(media_to_delete);
for (let i = 0; i < media_to_delete_array.length; i++) {
const media_id = media_to_delete_array[i];
const target_media = (
await BunSQLite.select<BUN_SQLITE_BSQLITE_MEDIA>({
table: "media",
targetId: media_id,
})
).singleRes;
if (!target_media?.id) {
continue;
}
if (target_media.media_write_path) {
rmSync(
path.join(DATA_DIR, target_media.media_write_path),
{ force: true },
);
}
if (target_media.media_thumbnail_write_path) {
rmSync(
path.join(DATA_DIR, target_media.media_thumbnail_write_path),
{ force: true },
);
}
await BunSQLite.delete<BUN_SQLITE_BSQLITE_MEDIA, TableType>({
table: "media",
targetId: target_media.id,
});
}
return {
success: true,
};
}
@@ -0,0 +1,80 @@
import type { BUN_SQLITE_BSQLITE_MEDIA_PARADIGMS } from "@/db/types/db";
import type { MediaParadigmType, TableType } from "@/src/types";
import type { BUN_SQLITE_BSQLITE_MEDIA_PARADIGMS_JOIN } from "@/src/types/sql-joins";
import BunSQLite from "@moduletrace/bun-sqlite";
import type { APIResponseObject } from "@moduletrace/bunext/types";
import _ from "lodash";
type Params = {
media_paradigm: MediaParadigmType;
user_id?: string | number;
};
export default async function grabMediaFromParadigm({
media_paradigm,
user_id,
}: Params): Promise<APIResponseObject<BUN_SQLITE_BSQLITE_MEDIA_PARADIGMS_JOIN>> {
try {
const media_paradigms_res = await BunSQLite.select<
BUN_SQLITE_BSQLITE_MEDIA_PARADIGMS,
TableType
>({
table: "media_paradigms",
query: {
query: {
media_paradigm: {
value: media_paradigm,
},
},
join: [
{
joinType: "INNER JOIN",
tableName: "media",
match: [
{
source: "media_id",
target: "id",
},
],
selectFields: ["user_id"],
},
{
joinType: "INNER JOIN",
tableName: "users",
match: [
{
source: {
fieldName: "user_id",
tableName: "media",
},
target: "id",
},
...(user_id
? [
{
source: {
fieldName: "id",
tableName: "users",
},
targetLiteral: user_id,
},
]
: []),
],
selectFields: ["first_name", "last_name"],
},
],
},
});
return {
...media_paradigms_res,
singleRes: media_paradigms_res.singleRes,
};
} catch (error: any) {
return {
success: false,
msg: error.message,
};
}
}
@@ -0,0 +1,134 @@
import type { BUN_SQLITE_BSQLITE_MEDIA } from "@/db/types/db";
import { AppData } from "@/src/data/app-data";
import type { ApiReqParams, User } from "@/src/types";
import type { BUN_SQLITE_BSQLITE_MEDIA_JOIN } from "@/src/types/sql-joins";
import BunSQLite, { type APIResponseObject } from "@moduletrace/bun-sqlite";
import type { SQLInsertGenValueType } from "@moduletrace/bun-sqlite";
import _ from "lodash";
import appendUsersToMedia from "./append-users-to-media";
type Params = {
query?: ApiReqParams;
user?: User;
};
export default async function grabMedia(
params?: Params,
): Promise<APIResponseObject<BUN_SQLITE_BSQLITE_MEDIA_JOIN>> {
const { query, user } = params || {};
try {
const LIMIT = AppData["DefaultQueryLimit"];
const values: SQLInsertGenValueType[] = [];
const hasParadigms = Boolean(query?.media_paradigms?.length);
let sql = `SELECT\n`;
sql += ` m.*,\n`;
sql += ` GROUP_CONCAT(DISTINCT mp.media_paradigm) AS media_paradigms\n`;
sql += `FROM media m\n`;
sql += `LEFT JOIN media_paradigms mp ON m.id = mp.media_id\n`;
sql += `WHERE COALESCE(m.archived, 0) <> 1\n`;
if (hasParadigms && query?.media_paradigms) {
const placeholders = query.media_paradigms.map(() => "?").join(",");
sql += ` AND m.id IN (\n`;
sql += ` SELECT sub_mp.media_id\n`;
sql += ` FROM media_paradigms sub_mp\n`;
sql += ` WHERE sub_mp.media_paradigm IN (${placeholders})\n`;
sql += ` GROUP BY sub_mp.media_id\n`;
sql += ` HAVING COUNT(DISTINCT sub_mp.media_paradigm) = ?\n`;
sql += ` )\n`;
values.push(...query.media_paradigms, query.media_paradigms.length);
}
if (query?.is_media_private) {
sql += ` AND m.is_private = 1\n`;
if (!user?.id) {
throw new Error(`Private media requires authenticated user`);
} else {
sql += ` AND m.user_id = ?\n`;
values.push(user.id);
}
} else {
sql += ` AND COALESCE(m.is_private, 0) <> 1\n`;
}
if (query?.id) {
sql += ` AND m.id = ?\n`;
values.push(query.id);
}
if (query?.is_media_primary) {
sql += ` AND m.is_primary = ?\n`;
values.push(1);
}
if (query?.user_id) {
sql += ` AND m.user_id = ?\n`;
values.push(query.user_id);
}
// 4. Parameterized Search Terms
if (query?.search_terms?.length) {
const fields_to_search: (keyof BUN_SQLITE_BSQLITE_MEDIA)[] = [
"title",
"description",
"summary",
"text_content",
];
const searchConditions: string[] = [];
for (const search_term of query.search_terms) {
const termConditions: string[] = [];
for (const field of fields_to_search) {
termConditions.push(`m.${field} LIKE ?`);
values.push(`%${search_term}%`);
}
searchConditions.push(`(${termConditions.join(" OR ")})`);
}
sql += ` AND (${searchConditions.join(" OR ")})\n`;
}
sql += `GROUP BY m.id\n`;
sql += `ORDER BY m.id DESC\n`;
let sql_limit = `LIMIT ?`;
const limitValues: SQLInsertGenValueType[] = [LIMIT];
if (query?.page && query.page > 1) {
const offset = LIMIT * (query.page - 1);
sql_limit += ` OFFSET ?`;
limitValues.push(offset);
}
const final_sql = `${sql}\n${sql_limit}`;
const final_values = [...values, ...limitValues];
const res = await BunSQLite.sql<BUN_SQLITE_BSQLITE_MEDIA_JOIN>({
sql: final_sql,
values: final_values,
});
// Count Query
if (query?.count) {
const count_sql = `SELECT COUNT(*) AS count FROM (${sql}) AS subquery_count`;
const count_res = await BunSQLite.sql<{ count: number }>({
sql: count_sql,
values,
});
res.count = count_res.singleRes?.count ?? 0;
}
return await appendUsersToMedia({ media_res: res });
} catch (error: any) {
return {
success: false,
msg: error.message,
};
}
}