First Commit. Duplicate bunext-sqlite preset
This commit is contained in:
@@ -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,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user