diff --git a/dist/index.d.ts b/dist/index.d.ts index e046bb6..1d80255 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,16 +1,9 @@ -import type { Connection } from "mariadb"; declare global { - var DSQL_DB_CONN: Connection | undefined; - var DSQL_READ_ONLY_DB_CONN: Connection | undefined; - var DSQL_FULL_ACCESS_DB_CONN: Connection | undefined; - var DSQL_USE_LOCAL: boolean | undefined; var ERROR_CALLBACK: ErrorCallback | undefined; } import get from "./package-shared/actions/get"; import post from "./package-shared/actions/post"; import getSchema from "./package-shared/actions/get-schema"; -import createUser from "./package-shared/actions/users/add-user"; -import updateUser from "./package-shared/actions/users/update-user"; import sqlGenerator from "./package-shared/functions/dsql/sql/sql-generator"; import sqlInsertGenerator from "./package-shared/functions/dsql/sql/sql-insert-generator"; import sqlDeleteGenerator from "./package-shared/functions/dsql/sql/sql-delete-generator"; @@ -27,6 +20,7 @@ import { ErrorCallback } from "./package-shared/types"; import parseEnv from "./package-shared/utils/parse-env"; import dbHandler from "./package-shared/functions/backend/dbHandler"; import httpsRequest from "./package-shared/functions/backend/httpsRequest"; +import handleNodemailer from "./package-shared/functions/backend/handleNodemailer"; /** * Main Export */ @@ -51,9 +45,9 @@ declare const datasquirel: { auth: { login: typeof import("./package-shared/actions/users/login-user").default; get: typeof import("./package-shared/actions/users/get-user").default; - signup: typeof createUser; + signup: typeof import("./package-shared/actions/users/add-user").default; sendEmailCode: typeof import("./package-shared/actions/users/send-email-code").default; - update: typeof updateUser; + update: typeof import("./package-shared/actions/users/update-user").default; resetPassword: typeof import("./package-shared/actions/users/reset-password").default; googleLogin: typeof import("./package-shared/actions/users/social/google-auth").default; logout: typeof import("./package-shared/actions/users/logout-user").default; @@ -155,5 +149,11 @@ declare const datasquirel: { * General Database Handler */ dbHandler: typeof dbHandler; + /** + * Handle Mail + */ + mail: { + mailer: typeof handleNodemailer; + }; }; export default datasquirel; diff --git a/dist/index.js b/dist/index.js index 672ece9..033df38 100644 --- a/dist/index.js +++ b/dist/index.js @@ -26,27 +26,7 @@ const local_user_1 = __importDefault(require("./package-shared/api/user/local-us const media_1 = __importDefault(require("./package-shared/api/media")); const dbHandler_1 = __importDefault(require("./package-shared/functions/backend/dbHandler")); const httpsRequest_1 = __importDefault(require("./package-shared/functions/backend/httpsRequest")); -/** - * User Functions Object - */ -// const user = { -// createUser: createUser, -// deleteUser, -// loginUser: loginUser, -// sendEmailCode: sendEmailCode, -// logoutUser: logoutUser, -// userAuth: userAuth, -// reAuthUser: reAuthUser, -// updateUser: updateUser, -// getUser: getUser, -// getToken: getToken, -// validateToken: validateToken, -// validateTempEmailCode, -// social: { -// loginWithGoogle: loginWithGoogle, -// loginWithGithub: loginWithGithub, -// }, -// }; +const handleNodemailer_1 = __importDefault(require("./package-shared/functions/backend/handleNodemailer")); /** * API Functions Object */ @@ -111,5 +91,11 @@ const datasquirel = { * General Database Handler */ dbHandler: dbHandler_1.default, + /** + * Handle Mail + */ + mail: { + mailer: handleNodemailer_1.default, + }, }; exports.default = datasquirel; diff --git a/dist/package-shared/data/data-types.d.ts b/dist/package-shared/data/data-types.d.ts index 46e53c3..d91f28c 100644 --- a/dist/package-shared/data/data-types.d.ts +++ b/dist/package-shared/data/data-types.d.ts @@ -56,6 +56,14 @@ declare const DataTypes: readonly [{ readonly name: "LONGTEXT"; readonly value: "0-255"; readonly description: "LONGTEXT is just text with max length 4,294,967,295"; +}, { + readonly title: "OPTIONS"; + readonly name: "ENUM"; + readonly description: "String options to be selected from"; +}, { + readonly title: "BOOLEAN"; + readonly name: "BOOLEAN"; + readonly description: "True or False. Represented in the database as 0 or 1"; }, { readonly title: "DECIMAL"; readonly name: "DECIMAL"; diff --git a/dist/package-shared/data/data-types.js b/dist/package-shared/data/data-types.js index 0537852..333af98 100644 --- a/dist/package-shared/data/data-types.js +++ b/dist/package-shared/data/data-types.js @@ -69,6 +69,16 @@ const DataTypes = [ value: "0-255", description: "LONGTEXT is just text with max length 4,294,967,295", }, + { + title: "OPTIONS", + name: "ENUM", + description: "String options to be selected from", + }, + { + title: "BOOLEAN", + name: "BOOLEAN", + description: "True or False. Represented in the database as 0 or 1", + }, { title: "DECIMAL", name: "DECIMAL", diff --git a/dist/package-shared/data/data-types.ts b/dist/package-shared/data/data-types.ts index bad6714..71bdfc3 100644 --- a/dist/package-shared/data/data-types.ts +++ b/dist/package-shared/data/data-types.ts @@ -68,6 +68,16 @@ const DataTypes = [ value: "0-255", description: "LONGTEXT is just text with max length 4,294,967,295", }, + { + title: "OPTIONS", + name: "ENUM", + description: "String options to be selected from", + }, + { + title: "BOOLEAN", + name: "BOOLEAN", + description: "True or False. Represented in the database as 0 or 1", + }, { title: "DECIMAL", name: "DECIMAL", diff --git a/dist/package-shared/dict/app-names.d.ts b/dist/package-shared/dict/app-names.d.ts index 289f260..13823a5 100644 --- a/dist/package-shared/dict/app-names.d.ts +++ b/dist/package-shared/dict/app-names.d.ts @@ -8,4 +8,5 @@ export declare const AppNames: { readonly WebsocketPathname: "dsql-websocket"; readonly ReverseProxyForwardURLHeaderName: "x-original-uri"; readonly PrivateAPIAuthHeaderName: "x-api-auth-key"; + readonly StaticProxyForwardURLHeaderName: "x-media-path"; }; diff --git a/dist/package-shared/dict/app-names.js b/dist/package-shared/dict/app-names.js index 79eb28e..dfad8af 100644 --- a/dist/package-shared/dict/app-names.js +++ b/dist/package-shared/dict/app-names.js @@ -11,4 +11,5 @@ exports.AppNames = { WebsocketPathname: "dsql-websocket", ReverseProxyForwardURLHeaderName: "x-original-uri", PrivateAPIAuthHeaderName: "x-api-auth-key", + StaticProxyForwardURLHeaderName: "x-media-path", }; diff --git a/dist/package-shared/dict/local-storage-dict.d.ts b/dist/package-shared/dict/local-storage-dict.d.ts index 6283419..2f634ac 100644 --- a/dist/package-shared/dict/local-storage-dict.d.ts +++ b/dist/package-shared/dict/local-storage-dict.d.ts @@ -4,4 +4,6 @@ export declare const LocalStorageDict: { CSRF: string; CurrentQueue: string; DiskUsage: string; + MarkdownEditorDefaultSideBySide: string; + MarkdownEditorDefaultPreview: string; }; diff --git a/dist/package-shared/dict/local-storage-dict.js b/dist/package-shared/dict/local-storage-dict.js index 2929496..1dd3a64 100644 --- a/dist/package-shared/dict/local-storage-dict.js +++ b/dist/package-shared/dict/local-storage-dict.js @@ -11,4 +11,6 @@ exports.LocalStorageDict = { CSRF: (0, get_csrf_header_name_1.default)(), CurrentQueue: "current_queue", DiskUsage: "disk_usage", + MarkdownEditorDefaultSideBySide: "markdown_editor_default_side_by_side", + MarkdownEditorDefaultPreview: "markdown_editor_default_preview", }; diff --git a/dist/package-shared/functions/api/social-login/handleSocialDb.js b/dist/package-shared/functions/api/social-login/handleSocialDb.js index 365be0c..fabe3bc 100644 --- a/dist/package-shared/functions/api/social-login/handleSocialDb.js +++ b/dist/package-shared/functions/api/social-login/handleSocialDb.js @@ -27,6 +27,7 @@ function handleSocialDb(_a) { var _b; try { const finalDbName = database; + const MAX_IMAGE_STRING_LENGTH = 350; const existingSocialUserQUery = `SELECT * FROM users WHERE email = ? AND social_login='1' AND social_platform = ? `; const existingSocialUserValues = [email, social_platform]; if (debug) { @@ -103,6 +104,12 @@ function handleSocialDb(_a) { password: socialHashedPassword, }; Object.keys(payload).forEach((key) => { + if (key.match(/image/)) { + const imageString = payload[key]; + if (!imageString || + imageString.length > MAX_IMAGE_STRING_LENGTH) + return; + } data[key] = payload[key]; }); const newUser = yield (0, addDbEntry_1.default)({ diff --git a/dist/package-shared/functions/backend/parseDbResults.d.ts b/dist/package-shared/functions/backend/parseDbResults.d.ts index 51a7845..82fc627 100644 --- a/dist/package-shared/functions/backend/parseDbResults.d.ts +++ b/dist/package-shared/functions/backend/parseDbResults.d.ts @@ -1,6 +1,7 @@ +import { DSQL_TableSchemaType } from "../../types"; type Param = { unparsedResults: any[]; - tableSchema?: import("../../types").DSQL_TableSchemaType; + tableSchema?: DSQL_TableSchemaType; }; /** * Parse Database results @@ -9,5 +10,5 @@ type Param = { * function, decrypts encrypted fields, and returns an updated array with no encrypted * fields */ -export default function parseDbResults({ unparsedResults, tableSchema, }: Param): Promise; +export default function parseDbResults({ unparsedResults, tableSchema, }: Param): any[] | null; export {}; diff --git a/dist/package-shared/functions/backend/parseDbResults.js b/dist/package-shared/functions/backend/parseDbResults.js index 480afb8..341431d 100644 --- a/dist/package-shared/functions/backend/parseDbResults.js +++ b/dist/package-shared/functions/backend/parseDbResults.js @@ -1,14 +1,4 @@ "use strict"; -// @ts-check -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; @@ -23,54 +13,35 @@ const default_fields_regexp_1 = __importDefault(require("../dsql/default-fields- * function, decrypts encrypted fields, and returns an updated array with no encrypted * fields */ -function parseDbResults(_a) { - return __awaiter(this, arguments, void 0, function* ({ unparsedResults, tableSchema, }) { - /** - * Declare variables - * - * @description Declare "results" variable - */ - let parsedResults = []; - try { - /** - * Declare variables - * - * @description Declare "results" variable - */ - for (let pr = 0; pr < unparsedResults.length; pr++) { - let result = unparsedResults[pr]; - let resultFieldNames = Object.keys(result); - for (let i = 0; i < resultFieldNames.length; i++) { - const resultFieldName = resultFieldNames[i]; - let resultFieldSchema = tableSchema === null || tableSchema === void 0 ? void 0 : tableSchema.fields[i]; - if (resultFieldName === null || resultFieldName === void 0 ? void 0 : resultFieldName.match(default_fields_regexp_1.default)) { - continue; - } - let value = result[resultFieldName]; - if (typeof value !== "number" && !value) { - // parsedResults.push(result); - continue; - } - if (resultFieldSchema === null || resultFieldSchema === void 0 ? void 0 : resultFieldSchema.encrypted) { - if (value === null || value === void 0 ? void 0 : value.match(/./)) { - result[resultFieldName] = (0, decrypt_1.default)({ - encryptedString: value, - }); - } +function parseDbResults({ unparsedResults, tableSchema, }) { + let parsedResults = []; + try { + for (let pr = 0; pr < unparsedResults.length; pr++) { + let result = unparsedResults[pr]; + let resultFieldNames = Object.keys(result); + for (let i = 0; i < resultFieldNames.length; i++) { + const resultFieldName = resultFieldNames[i]; + let resultFieldSchema = tableSchema === null || tableSchema === void 0 ? void 0 : tableSchema.fields.find((fld) => fld.fieldName == resultFieldName); + if (resultFieldName === null || resultFieldName === void 0 ? void 0 : resultFieldName.match(default_fields_regexp_1.default)) { + continue; + } + let value = result[resultFieldName]; + if (typeof value !== "number" && !value) { + continue; + } + if (resultFieldSchema === null || resultFieldSchema === void 0 ? void 0 : resultFieldSchema.encrypted) { + if (value === null || value === void 0 ? void 0 : value.match(/./)) { + result[resultFieldName] = (0, decrypt_1.default)({ + encryptedString: value, + }); } } - parsedResults.push(result); } - /** - * Declare variables - * - * @description Declare "results" variable - */ - return parsedResults; + parsedResults.push(result); } - catch ( /** @type {any} */error) { - console.log("ERROR in parseDbResults Function =>", error.message); - return unparsedResults; - } - }); + return parsedResults; + } + catch (error) { + return unparsedResults; + } } diff --git a/dist/package-shared/functions/web-app/db/grab-user-resource/index.d.ts b/dist/package-shared/functions/web-app/db/grab-user-resource/index.d.ts index 8417f1f..d9c9e30 100644 --- a/dist/package-shared/functions/web-app/db/grab-user-resource/index.d.ts +++ b/dist/package-shared/functions/web-app/db/grab-user-resource/index.d.ts @@ -12,5 +12,5 @@ export default function dbGrabUserResource; diff --git a/dist/package-shared/functions/web-app/db/grab-user-resource/index.js b/dist/package-shared/functions/web-app/db/grab-user-resource/index.js index 9d603b5..2a20d8f 100644 --- a/dist/package-shared/functions/web-app/db/grab-user-resource/index.js +++ b/dist/package-shared/functions/web-app/db/grab-user-resource/index.js @@ -34,7 +34,7 @@ function dbGrabUserResource(params) { error: result === null || result === void 0 ? void 0 : result.error, msg: result === null || result === void 0 ? void 0 : result.msg, }, - count: typeof (result === null || result === void 0 ? void 0 : result.count) == "number" ? result.count : undefined, + count: typeof (result === null || result === void 0 ? void 0 : result.count) == "number" ? result.count : null, }; }); } diff --git a/dist/package-shared/shell/utils/generateColumnDescription.js b/dist/package-shared/shell/utils/generateColumnDescription.js index 1efbd4c..91bfe0e 100644 --- a/dist/package-shared/shell/utils/generateColumnDescription.js +++ b/dist/package-shared/shell/utils/generateColumnDescription.js @@ -10,11 +10,18 @@ const data_type_parser_1 = __importDefault(require("../../utils/db/schema/data-t * # Generate Table Column Description */ function generateColumnDescription({ columnData, primaryKeySet, }) { - const { fieldName, dataType, nullValue, primaryKey, autoIncrement, defaultValue, defaultValueLiteral, onUpdateLiteral, notNullValue, unique, } = columnData; + const { fieldName, dataType, nullValue, primaryKey, autoIncrement, defaultValue, defaultValueLiteral, onUpdateLiteral, notNullValue, unique, options, } = columnData; let fieldEntryText = ""; const finalDataTypeObject = (0, data_type_parser_1.default)(dataType); const finalDataType = (0, data_type_constructor_1.default)(finalDataTypeObject.type, finalDataTypeObject.limit, finalDataTypeObject.decimal); - fieldEntryText += `\`${fieldName}\` ${finalDataType}`; + if (finalDataType.match(/enum/i) && (options === null || options === void 0 ? void 0 : options[0])) { + fieldEntryText += `\`${fieldName}\` ${finalDataType}(${options + .map((opt) => `'${opt}'`) + .join(",")})`; + } + else { + fieldEntryText += `\`${fieldName}\` ${finalDataType}`; + } if (nullValue) { fieldEntryText += " DEFAULT NULL"; } diff --git a/dist/package-shared/types/dsql.d.ts b/dist/package-shared/types/dsql.d.ts index 0c4ae7a..89120be 100644 --- a/dist/package-shared/types/dsql.d.ts +++ b/dist/package-shared/types/dsql.d.ts @@ -91,6 +91,7 @@ export type DSQL_DATASQUIREL_USER_DATABASES = { db_full_name?: string; db_image?: string; db_description?: string; + db_long_description?: string; remote_connected?: number; remote_connection_type?: string; remote_db_full_name?: string; @@ -118,6 +119,7 @@ export type DSQL_DATASQUIREL_USER_DATABASE_TABLES = { table_name?: string; table_slug?: string; table_description?: string; + table_long_description?: string; child_table?: number; child_table_parent_database_schema_id?: number; child_table_parent_table_schema_id?: number; diff --git a/dist/package-shared/types/index.d.ts b/dist/package-shared/types/index.d.ts index 896a0b0..ca315b5 100644 --- a/dist/package-shared/types/index.d.ts +++ b/dist/package-shared/types/index.d.ts @@ -65,6 +65,9 @@ export declare const TextFieldTypesArray: readonly [{ }, { readonly title: "Rich Text"; readonly value: "richText"; +}, { + readonly title: "Markdown"; + readonly value: "markdown"; }, { readonly title: "JSON"; readonly value: "json"; @@ -90,6 +93,7 @@ export declare const TextFieldTypesArray: readonly [{ export type DSQL_FieldSchemaType = { id?: number | string; fieldName?: string; + fieldDescription?: string; originName?: string; updatedField?: boolean; dataType?: string; @@ -1259,6 +1263,7 @@ export type DsqlCrudParam void; export interface MariaDBUser { @@ -1707,6 +1712,17 @@ export type SiteConfigMain = { sharp_image_quality?: SiteConfigMainValue; max_backups?: SiteConfigMainValue; max_disk_usage?: SiteConfigMainValue; + api_keys?: SiteConfigMainAPIKeysObject; + target_ai?: AIOptionsObject; +}; +export type SiteConfigMainAPIKeysObject = { + [k: string]: SiteConfigMainAPIKeysObjectInfo; +}; +export type SiteConfigMainAPIKeysObjectInfo = { + key?: string; + id?: string; + model?: string; + custom_model?: string; }; export type SiteConfigMainValue = { value: number | null; @@ -2051,8 +2067,22 @@ export interface GiteaTreeResTree { sha: string; url: string; } -export declare const OpsActions: readonly ["exit", "test", "restart-web-app", "restart-db", "restart-all", "clear"]; +export declare const OpsActions: readonly ["exit", "test", "restart-web-app", "restart-web-app-container", "restart-db", "restart-all", "clear"]; export type OpsObject = { action: (typeof OpsActions)[number]; }; +export declare const AIOptions: AIOptionsObject[]; +export type AIOptionsObject = { + name?: string; + title?: string; + models?: string[]; + targetModel?: string; + customModel?: string; + apiKey?: string; + baseUrl?: string; +}; +export type AIComponentProps = { + targetAI: AIOptionsObject; + context: any[]; +}; export {}; diff --git a/dist/package-shared/types/index.js b/dist/package-shared/types/index.js index dc91d57..95c44c2 100644 --- a/dist/package-shared/types/index.js +++ b/dist/package-shared/types/index.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.OpsActions = exports.TimeParadigms = exports.UserAPIAuthActions = exports.UserAPIParadigms = exports.TargetMediaParadigms = exports.EnvKeys = exports.AppVersions = exports.APIParadigms = exports.UserSQLPermissions = exports.SQLPermissions = exports.InvitedUserSelectFields = exports.DelegatedUserSelectFields = exports.UserSelectFields = exports.IndexTypes = exports.DefaultSQLValuesLiteral = exports.CurrentlyEditedFieldActions = exports.VideoMimeTypes = exports.FileMimeTypes = exports.ImageMimeTypes = exports.MediaTypes = exports.DockerComposeServices = exports.DatasquirelWindowEvents = exports.WebSocketEvents = exports.QueueJobTypes = exports.SignUpParadigms = exports.UserTypes = exports.QueryFields = exports.DsqlCrudActions = exports.DataCrudRequestMethodsLowerCase = exports.DataCrudRequestMethods = exports.ServerQueryEqualities = exports.ServerQueryOperators = exports.TextFieldTypesArray = exports.UsersOmitedFields = void 0; +exports.AIOptions = exports.OpsActions = exports.TimeParadigms = exports.UserAPIAuthActions = exports.UserAPIParadigms = exports.TargetMediaParadigms = exports.EnvKeys = exports.AppVersions = exports.APIParadigms = exports.UserSQLPermissions = exports.SQLPermissions = exports.InvitedUserSelectFields = exports.DelegatedUserSelectFields = exports.UserSelectFields = exports.IndexTypes = exports.DefaultSQLValuesLiteral = exports.CurrentlyEditedFieldActions = exports.VideoMimeTypes = exports.FileMimeTypes = exports.ImageMimeTypes = exports.MediaTypes = exports.DockerComposeServices = exports.DatasquirelWindowEvents = exports.WebSocketEvents = exports.QueueJobTypes = exports.SignUpParadigms = exports.UserTypes = exports.QueryFields = exports.DsqlCrudActions = exports.DataCrudRequestMethodsLowerCase = exports.DataCrudRequestMethods = exports.ServerQueryEqualities = exports.ServerQueryOperators = exports.TextFieldTypesArray = exports.UsersOmitedFields = void 0; exports.UsersOmitedFields = [ "password", "social_id", @@ -15,6 +15,7 @@ exports.UsersOmitedFields = [ exports.TextFieldTypesArray = [ { title: "Plain Text", value: "plain" }, { title: "Rich Text", value: "richText" }, + { title: "Markdown", value: "markdown" }, { title: "JSON", value: "json" }, { title: "YAML", value: "yaml" }, { title: "HTML", value: "html" }, @@ -447,7 +448,59 @@ exports.OpsActions = [ "exit", "test", "restart-web-app", + "restart-web-app-container", "restart-db", "restart-all", "clear", ]; +exports.AIOptions = [ + { + name: "openai", + title: "Open AI", + models: [ + "gpt-4.1", + "gpt-4o", + "gpt-4o-audio", + "04-mini", + "o3", + "o3-pro", + "o3-mini", + "o1", + "o1-mini", + "o1-pro", + ], + }, + { + name: "xai", + title: "X-AI", + baseUrl: "https://api.x.ai/v1", + models: [ + "grok-4-0709", + "grok-3", + "grok-3-mini", + "grok-3-fast", + "grok-3-mini-fast", + ], + }, + { + name: "anthropic", + models: [ + "claude-opus-4-0", + "claude-sonnet-4-0", + "claude-3-7-sonnet-latest", + "claude-3-5-sonnet-latest", + "claude-3-5-haiku-latest", + ], + }, + { + name: "gemini", + models: [ + "gemini-2.5-pro", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gemini-2.5-flash-preview-tts", + "gemini-2.5-pro-preview-tts", + "gemini-2.0-flash", + ], + }, +]; diff --git a/dist/package-shared/utils/check-array-depth.d.ts b/dist/package-shared/utils/check-array-depth.d.ts new file mode 100644 index 0000000..f1ff570 --- /dev/null +++ b/dist/package-shared/utils/check-array-depth.d.ts @@ -0,0 +1 @@ +export default function checkArrayDepth(arr: any[] | any[][] | any[][][] | any, depth: number): boolean; diff --git a/dist/package-shared/utils/check-array-depth.js b/dist/package-shared/utils/check-array-depth.js new file mode 100644 index 0000000..85c4175 --- /dev/null +++ b/dist/package-shared/utils/check-array-depth.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = checkArrayDepth; +function checkArrayDepth(arr, depth) { + if (!Array.isArray(arr)) + return false; + if (depth === 1) + return true; + return arr.every((item) => checkArrayDepth(item, depth - 1)); +} diff --git a/dist/package-shared/utils/data-fetching/crud-get.d.ts b/dist/package-shared/utils/data-fetching/crud-get.d.ts index 5224f5d..a2cb5c0 100644 --- a/dist/package-shared/utils/data-fetching/crud-get.d.ts +++ b/dist/package-shared/utils/data-fetching/crud-get.d.ts @@ -3,4 +3,4 @@ export default function ({ table, query, count, countOnly, dbFullName, }: Omit, "action" | "data" | "sanitize">): Promise; +}>({ table, query, count, countOnly, dbFullName, tableSchema, }: Omit, "action" | "data" | "sanitize">): Promise; diff --git a/dist/package-shared/utils/data-fetching/crud-get.js b/dist/package-shared/utils/data-fetching/crud-get.js index a6f86b6..2a44a98 100644 --- a/dist/package-shared/utils/data-fetching/crud-get.js +++ b/dist/package-shared/utils/data-fetching/crud-get.js @@ -15,8 +15,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = default_1; const sql_generator_1 = __importDefault(require("../../functions/dsql/sql/sql-generator")); const conn_db_handler_1 = __importDefault(require("../db/conn-db-handler")); +const check_array_depth_1 = __importDefault(require("../check-array-depth")); +const parseDbResults_1 = __importDefault(require("../../functions/backend/parseDbResults")); function default_1(_a) { - return __awaiter(this, arguments, void 0, function* ({ table, query, count, countOnly, dbFullName, }) { + return __awaiter(this, arguments, void 0, function* ({ table, query, count, countOnly, dbFullName, tableSchema, }) { var _b, _c, _d, _e; let queryObject; queryObject = (0, sql_generator_1.default)({ @@ -53,12 +55,24 @@ function default_1(_a) { ]; } const res = yield (0, conn_db_handler_1.default)(undefined, connQueries); + const parsedRes = (0, check_array_depth_1.default)(res, 2) + ? (0, parseDbResults_1.default)({ unparsedResults: res[0], tableSchema }) + : res[0]; + const parsedBatchRes = (0, check_array_depth_1.default)(res, 3) + ? res.map((_r) => { + return (0, parseDbResults_1.default)({ unparsedResults: _r[0], tableSchema }); + }) + : res; const isSuccess = Array.isArray(res) && Array.isArray(res[0]); return { success: isSuccess, - payload: isSuccess ? (countOnly ? null : res[0]) : null, - batchPayload: isSuccess ? (countOnly ? null : res) : null, - error: isSuccess ? undefined : res === null || res === void 0 ? void 0 : res.error, + payload: isSuccess ? (countOnly ? null : parsedRes) : null, + batchPayload: isSuccess ? (countOnly ? null : parsedBatchRes) : null, + error: isSuccess + ? undefined + : typeof res == "object" && !Array.isArray(res) + ? res === null || res === void 0 ? void 0 : res.error + : undefined, errors: res === null || res === void 0 ? void 0 : res.errors, queryObject: { sql: queryObject === null || queryObject === void 0 ? void 0 : queryObject.string, diff --git a/dist/package-shared/utils/data-fetching/crud.js b/dist/package-shared/utils/data-fetching/crud.js index 53b1ece..3af2b28 100644 --- a/dist/package-shared/utils/data-fetching/crud.js +++ b/dist/package-shared/utils/data-fetching/crud.js @@ -20,7 +20,7 @@ const addDbEntry_1 = __importDefault(require("../../functions/backend/db/addDbEn const updateDbEntry_1 = __importDefault(require("../../functions/backend/db/updateDbEntry")); function dsqlCrud(params) { return __awaiter(this, void 0, void 0, function* () { - const { action, data, table, targetValue, sanitize, targetField, targetId, dbFullName, deleteData, batchData, deleteKeyValues, debug, } = params; + const { action, data, table, targetValue, sanitize, targetField, targetId, dbFullName, deleteData, batchData, deleteKeyValues, debug, tableSchema, } = params; const finalData = (sanitize ? sanitize({ data }) : data); const finalBatchData = (sanitize ? sanitize({ batchData }) : batchData); switch (action) { @@ -35,6 +35,7 @@ function dsqlCrud(params) { tableName: table, dbFullName, debug, + tableSchema, }); return INSERT_RESULT; case "update": @@ -46,6 +47,7 @@ function dsqlCrud(params) { identifierColumnName: (targetField || "id"), identifierValue: String(targetValue || targetId), debug, + tableSchema, }); return UPDATE_RESULT; case "delete": diff --git a/dist/package-shared/utils/db/schema/grab-text-field-type.js b/dist/package-shared/utils/db/schema/grab-text-field-type.js index 4a2d24e..09b018e 100644 --- a/dist/package-shared/utils/db/schema/grab-text-field-type.js +++ b/dist/package-shared/utils/db/schema/grab-text-field-type.js @@ -16,6 +16,8 @@ function grabTextFieldType(field, nullReturn) { return "javascript"; if (field.shell) return "shell"; + if (field.markdown) + return "markdown"; if (nullReturn) return undefined; return "plain"; diff --git a/dist/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.js b/dist/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.js index d9f2019..566e1bd 100644 --- a/dist/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.js +++ b/dist/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.js @@ -68,13 +68,14 @@ function default_1({ currentDbSchema, currentTableSchema, currentTableSchemaInde /** * Handle scenario where this table is a child of another */ - if (currentTableSchema.childTable && - currentTableSchema.childTableDbId && - currentTableSchema.childTableDbId) { - const targetParentDatabase = (0, grab_required_database_schemas_1.grabPrimaryRequiredDbSchema)({ - dbId: currentTableSchema.childTableDbId, - userId, - }); + if (currentTableSchema.childTable && currentTableSchema.childTableDbId) { + const isParentDbCurrentDb = currentTableSchema.childTableDbId == newCurrentDbSchema.id; + const targetParentDatabase = isParentDbCurrentDb + ? newCurrentDbSchema + : (0, grab_required_database_schemas_1.grabPrimaryRequiredDbSchema)({ + dbId: currentTableSchema.childTableDbId, + userId, + }); const targetParentDatabaseTableIndex = targetParentDatabase === null || targetParentDatabase === void 0 ? void 0 : targetParentDatabase.tables.findIndex((tbl) => tbl.id == currentTableSchema.childTableId); const targetParentDatabaseTable = typeof targetParentDatabaseTableIndex == "number" ? targetParentDatabaseTableIndex < 0 diff --git a/dist/package-shared/utils/db/schema/set-text-field-type.js b/dist/package-shared/utils/db/schema/set-text-field-type.js index 0a230af..e05f004 100644 --- a/dist/package-shared/utils/db/schema/set-text-field-type.js +++ b/dist/package-shared/utils/db/schema/set-text-field-type.js @@ -32,5 +32,7 @@ function setTextFieldType(field, type) { return Object.assign(Object.assign({}, newField), { javascript: true }); if (type == "code") return Object.assign(Object.assign({}, newField), { code: true }); + if (type == "markdown") + return Object.assign(Object.assign({}, newField), { markdown: true }); return Object.assign({}, newField); } diff --git a/dist/package-shared/utils/grab-docker-resource-ip-numbers.d.ts b/dist/package-shared/utils/grab-docker-resource-ip-numbers.d.ts index 9989110..eb160a8 100644 --- a/dist/package-shared/utils/grab-docker-resource-ip-numbers.d.ts +++ b/dist/package-shared/utils/grab-docker-resource-ip-numbers.d.ts @@ -10,4 +10,5 @@ export default function grabDockerResourceIPNumbers(): { readonly replica_1: 37; readonly replica_2: 38; readonly web_app_post_db_setup: 71; + readonly static: 77; }; diff --git a/dist/package-shared/utils/grab-docker-resource-ip-numbers.js b/dist/package-shared/utils/grab-docker-resource-ip-numbers.js index 2d5254a..fdbb22f 100644 --- a/dist/package-shared/utils/grab-docker-resource-ip-numbers.js +++ b/dist/package-shared/utils/grab-docker-resource-ip-numbers.js @@ -14,5 +14,6 @@ function grabDockerResourceIPNumbers() { replica_1: 37, replica_2: 38, web_app_post_db_setup: 71, + static: 77, }; } diff --git a/dist/package-shared/utils/grab-user-ai-info.d.ts b/dist/package-shared/utils/grab-user-ai-info.d.ts new file mode 100644 index 0000000..7433794 --- /dev/null +++ b/dist/package-shared/utils/grab-user-ai-info.d.ts @@ -0,0 +1,7 @@ +import { AIOptionsObject, SiteConfig } from "../types"; +type Params = { + userConfig?: SiteConfig | null; +}; +export type GrabUserAIConfigReturn = {}; +export default function grabUserAIInfo({ userConfig: passedConfig, }: Params): AIOptionsObject | undefined; +export {}; diff --git a/dist/package-shared/utils/grab-user-ai-info.js b/dist/package-shared/utils/grab-user-ai-info.js new file mode 100644 index 0000000..746901f --- /dev/null +++ b/dist/package-shared/utils/grab-user-ai-info.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = grabUserAIInfo; +const types_1 = require("../types"); +function grabUserAIInfo({ userConfig: passedConfig, }) { + const userConfig = passedConfig + ? passedConfig + : undefined; + if (!userConfig) + return undefined; + const targetAI = userConfig === null || userConfig === void 0 ? void 0 : userConfig.main.target_ai; + if (!(targetAI === null || targetAI === void 0 ? void 0 : targetAI.name) || !(userConfig === null || userConfig === void 0 ? void 0 : userConfig.main.api_keys)) + return undefined; + const targetAIAPIKey = userConfig.main.api_keys[targetAI.name].key; + if (!targetAIAPIKey) + return undefined; + const targetAIOption = types_1.AIOptions.find((aiOpt) => aiOpt.name == targetAI.name); + targetAI.apiKey = targetAIAPIKey; + if (targetAIOption === null || targetAIOption === void 0 ? void 0 : targetAIOption.baseUrl) { + targetAI.baseUrl = targetAIOption.baseUrl; + } + return targetAI; +} diff --git a/index.ts b/index.ts index 82de02b..ee37e50 100644 --- a/index.ts +++ b/index.ts @@ -1,10 +1,4 @@ -import type { Connection } from "mariadb"; - declare global { - var DSQL_DB_CONN: Connection | undefined; - var DSQL_READ_ONLY_DB_CONN: Connection | undefined; - var DSQL_FULL_ACCESS_DB_CONN: Connection | undefined; - var DSQL_USE_LOCAL: boolean | undefined; var ERROR_CALLBACK: ErrorCallback | undefined; } @@ -12,9 +6,6 @@ import get from "./package-shared/actions/get"; import post from "./package-shared/actions/post"; import getSchema from "./package-shared/actions/get-schema"; -import createUser from "./package-shared/actions/users/add-user"; -import updateUser from "./package-shared/actions/users/update-user"; - import datasquirelClient from "./client"; import sqlGenerator from "./package-shared/functions/dsql/sql/sql-generator"; import sqlInsertGenerator from "./package-shared/functions/dsql/sql/sql-insert-generator"; @@ -36,28 +27,7 @@ import localUser from "./package-shared/api/user/local-user"; import media from "./package-shared/api/media"; import dbHandler from "./package-shared/functions/backend/dbHandler"; import httpsRequest from "./package-shared/functions/backend/httpsRequest"; - -/** - * User Functions Object - */ -// const user = { -// createUser: createUser, -// deleteUser, -// loginUser: loginUser, -// sendEmailCode: sendEmailCode, -// logoutUser: logoutUser, -// userAuth: userAuth, -// reAuthUser: reAuthUser, -// updateUser: updateUser, -// getUser: getUser, -// getToken: getToken, -// validateToken: validateToken, -// validateTempEmailCode, -// social: { -// loginWithGoogle: loginWithGoogle, -// loginWithGithub: loginWithGithub, -// }, -// }; +import handleNodemailer from "./package-shared/functions/backend/handleNodemailer"; /** * API Functions Object @@ -125,6 +95,12 @@ const datasquirel = { * General Database Handler */ dbHandler, + /** + * Handle Mail + */ + mail: { + mailer: handleNodemailer, + }, }; export default datasquirel; diff --git a/package-shared/data/data-types.ts b/package-shared/data/data-types.ts index bad6714..71bdfc3 100644 --- a/package-shared/data/data-types.ts +++ b/package-shared/data/data-types.ts @@ -68,6 +68,16 @@ const DataTypes = [ value: "0-255", description: "LONGTEXT is just text with max length 4,294,967,295", }, + { + title: "OPTIONS", + name: "ENUM", + description: "String options to be selected from", + }, + { + title: "BOOLEAN", + name: "BOOLEAN", + description: "True or False. Represented in the database as 0 or 1", + }, { title: "DECIMAL", name: "DECIMAL", diff --git a/package-shared/dict/app-names.ts b/package-shared/dict/app-names.ts index 1770d7f..940bc8b 100644 --- a/package-shared/dict/app-names.ts +++ b/package-shared/dict/app-names.ts @@ -8,4 +8,5 @@ export const AppNames = { WebsocketPathname: "dsql-websocket", ReverseProxyForwardURLHeaderName: "x-original-uri", PrivateAPIAuthHeaderName: "x-api-auth-key", + StaticProxyForwardURLHeaderName: "x-media-path", } as const; diff --git a/package-shared/dict/local-storage-dict.ts b/package-shared/dict/local-storage-dict.ts index ea2cdff..4764f16 100644 --- a/package-shared/dict/local-storage-dict.ts +++ b/package-shared/dict/local-storage-dict.ts @@ -6,4 +6,6 @@ export const LocalStorageDict = { CSRF: getCsrfHeaderName(), CurrentQueue: "current_queue", DiskUsage: "disk_usage", + MarkdownEditorDefaultSideBySide: "markdown_editor_default_side_by_side", + MarkdownEditorDefaultPreview: "markdown_editor_default_preview", }; diff --git a/package-shared/functions/api/social-login/handleSocialDb.ts b/package-shared/functions/api/social-login/handleSocialDb.ts index c0dc2cb..3c96e06 100644 --- a/package-shared/functions/api/social-login/handleSocialDb.ts +++ b/package-shared/functions/api/social-login/handleSocialDb.ts @@ -26,6 +26,7 @@ export default async function handleSocialDb({ }: HandleSocialDbFunctionParams): Promise { try { const finalDbName = database; + const MAX_IMAGE_STRING_LENGTH = 350; const existingSocialUserQUery = `SELECT * FROM users WHERE email = ? AND social_login='1' AND social_platform = ? `; const existingSocialUserValues = [email, social_platform]; @@ -127,6 +128,14 @@ export default async function handleSocialDb({ }; Object.keys(payload).forEach((key) => { + if (key.match(/image/)) { + const imageString = payload[key] as string | undefined; + if ( + !imageString || + imageString.length > MAX_IMAGE_STRING_LENGTH + ) + return; + } data[key] = payload[key]; }); diff --git a/package-shared/functions/backend/parseDbResults.ts b/package-shared/functions/backend/parseDbResults.ts index 5800f01..557f488 100644 --- a/package-shared/functions/backend/parseDbResults.ts +++ b/package-shared/functions/backend/parseDbResults.ts @@ -1,11 +1,10 @@ -// @ts-check - +import { DSQL_TableSchemaType } from "../../types"; import decrypt from "../dsql/decrypt"; import defaultFieldsRegexp from "../dsql/default-fields-regexp"; type Param = { unparsedResults: any[]; - tableSchema?: import("../../types").DSQL_TableSchemaType; + tableSchema?: DSQL_TableSchemaType; }; /** @@ -15,23 +14,13 @@ type Param = { * function, decrypts encrypted fields, and returns an updated array with no encrypted * fields */ -export default async function parseDbResults({ +export default function parseDbResults({ unparsedResults, tableSchema, -}: Param): Promise { - /** - * Declare variables - * - * @description Declare "results" variable - */ +}: Param): any[] | null { let parsedResults = []; try { - /** - * Declare variables - * - * @description Declare "results" variable - */ for (let pr = 0; pr < unparsedResults.length; pr++) { let result = unparsedResults[pr]; @@ -39,7 +28,9 @@ export default async function parseDbResults({ for (let i = 0; i < resultFieldNames.length; i++) { const resultFieldName = resultFieldNames[i]; - let resultFieldSchema = tableSchema?.fields[i]; + let resultFieldSchema = tableSchema?.fields.find( + (fld) => fld.fieldName == resultFieldName + ); if (resultFieldName?.match(defaultFieldsRegexp)) { continue; @@ -48,7 +39,6 @@ export default async function parseDbResults({ let value = result[resultFieldName]; if (typeof value !== "number" && !value) { - // parsedResults.push(result); continue; } @@ -64,14 +54,8 @@ export default async function parseDbResults({ parsedResults.push(result); } - /** - * Declare variables - * - * @description Declare "results" variable - */ return parsedResults; - } catch (/** @type {any} */ error: any) { - console.log("ERROR in parseDbResults Function =>", error.message); + } catch (error: any) { return unparsedResults; } } diff --git a/package-shared/functions/web-app/db/grab-user-resource/index.ts b/package-shared/functions/web-app/db/grab-user-resource/index.ts index 74ea8c4..0648fd0 100644 --- a/package-shared/functions/web-app/db/grab-user-resource/index.ts +++ b/package-shared/functions/web-app/db/grab-user-resource/index.ts @@ -27,6 +27,6 @@ export default async function dbGrabUserResource< error: result?.error, msg: result?.msg, }, - count: typeof result?.count == "number" ? result.count : undefined, + count: typeof result?.count == "number" ? result.count : null, }; } diff --git a/package-shared/shell/utils/generateColumnDescription.ts b/package-shared/shell/utils/generateColumnDescription.ts index af7e804..c352981 100644 --- a/package-shared/shell/utils/generateColumnDescription.ts +++ b/package-shared/shell/utils/generateColumnDescription.ts @@ -30,6 +30,7 @@ export default function generateColumnDescription({ onUpdateLiteral, notNullValue, unique, + options, } = columnData; let fieldEntryText = ""; @@ -41,7 +42,13 @@ export default function generateColumnDescription({ finalDataTypeObject.decimal ); - fieldEntryText += `\`${fieldName}\` ${finalDataType}`; + if (finalDataType.match(/enum/i) && options?.[0]) { + fieldEntryText += `\`${fieldName}\` ${finalDataType}(${options + .map((opt) => `'${opt}'`) + .join(",")})`; + } else { + fieldEntryText += `\`${fieldName}\` ${finalDataType}`; + } if (nullValue) { fieldEntryText += " DEFAULT NULL"; diff --git a/package-shared/types/dsql.ts b/package-shared/types/dsql.ts index 95ee4d2..3203950 100644 --- a/package-shared/types/dsql.ts +++ b/package-shared/types/dsql.ts @@ -118,6 +118,7 @@ export type DSQL_DATASQUIREL_USER_DATABASES = { db_full_name?: string; db_image?: string; db_description?: string; + db_long_description?: string; remote_connected?: number; remote_connection_type?: string; remote_db_full_name?: string; @@ -146,6 +147,7 @@ export type DSQL_DATASQUIREL_USER_DATABASE_TABLES = { table_name?: string; table_slug?: string; table_description?: string; + table_long_description?: string; child_table?: number; child_table_parent_database_schema_id?: number; child_table_parent_table_schema_id?: number; diff --git a/package-shared/types/index.ts b/package-shared/types/index.ts index 3052264..d186d38 100644 --- a/package-shared/types/index.ts +++ b/package-shared/types/index.ts @@ -107,6 +107,7 @@ export interface DSQL_ChildrenTablesType { export const TextFieldTypesArray = [ { title: "Plain Text", value: "plain" }, { title: "Rich Text", value: "richText" }, + { title: "Markdown", value: "markdown" }, { title: "JSON", value: "json" }, { title: "YAML", value: "yaml" }, { title: "HTML", value: "html" }, @@ -119,6 +120,7 @@ export const TextFieldTypesArray = [ export type DSQL_FieldSchemaType = { id?: number | string; fieldName?: string; + fieldDescription?: string; originName?: string; updatedField?: boolean; dataType?: string; @@ -1471,6 +1473,7 @@ export type DsqlCrudParam< countOnly?: boolean; dbFullName?: string; dbName?: string; + tableSchema?: DSQL_TableSchemaType; }; export type ErrorCallback = (title: string, error: Error, data?: any) => void; @@ -2137,6 +2140,19 @@ export type SiteConfigMain = { sharp_image_quality?: SiteConfigMainValue; max_backups?: SiteConfigMainValue; max_disk_usage?: SiteConfigMainValue; + api_keys?: SiteConfigMainAPIKeysObject; + target_ai?: AIOptionsObject; +}; + +export type SiteConfigMainAPIKeysObject = { + [k: string]: SiteConfigMainAPIKeysObjectInfo; +}; + +export type SiteConfigMainAPIKeysObjectInfo = { + key?: string; + id?: string; + model?: string; + custom_model?: string; }; export type SiteConfigMainValue = { @@ -2629,6 +2645,7 @@ export const OpsActions = [ "exit", "test", "restart-web-app", + "restart-web-app-container", "restart-db", "restart-all", "clear", @@ -2637,3 +2654,70 @@ export const OpsActions = [ export type OpsObject = { action: (typeof OpsActions)[number]; }; + +export const AIOptions: AIOptionsObject[] = [ + { + name: "openai", + title: "Open AI", + models: [ + "gpt-4.1", + "gpt-4o", + "gpt-4o-audio", + "04-mini", + "o3", + "o3-pro", + "o3-mini", + "o1", + "o1-mini", + "o1-pro", + ], + }, + { + name: "xai", + title: "X-AI", + baseUrl: "https://api.x.ai/v1", + models: [ + "grok-4-0709", + "grok-3", + "grok-3-mini", + "grok-3-fast", + "grok-3-mini-fast", + ], + }, + { + name: "anthropic", + models: [ + "claude-opus-4-0", + "claude-sonnet-4-0", + "claude-3-7-sonnet-latest", + "claude-3-5-sonnet-latest", + "claude-3-5-haiku-latest", + ], + }, + { + name: "gemini", + models: [ + "gemini-2.5-pro", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gemini-2.5-flash-preview-tts", + "gemini-2.5-pro-preview-tts", + "gemini-2.0-flash", + ], + }, +] as const; + +export type AIOptionsObject = { + name?: string; + title?: string; + models?: string[]; + targetModel?: string; + customModel?: string; + apiKey?: string; + baseUrl?: string; +}; + +export type AIComponentProps = { + targetAI: AIOptionsObject; + context: any[]; +}; diff --git a/package-shared/utils/check-array-depth.ts b/package-shared/utils/check-array-depth.ts new file mode 100644 index 0000000..84d5285 --- /dev/null +++ b/package-shared/utils/check-array-depth.ts @@ -0,0 +1,8 @@ +export default function checkArrayDepth( + arr: any[] | any[][] | any[][][] | any, + depth: number +): boolean { + if (!Array.isArray(arr)) return false; + if (depth === 1) return true; + return arr.every((item) => checkArrayDepth(item, depth - 1)); +} diff --git a/package-shared/utils/data-fetching/crud-get.ts b/package-shared/utils/data-fetching/crud-get.ts index 5f78572..7d83603 100644 --- a/package-shared/utils/data-fetching/crud-get.ts +++ b/package-shared/utils/data-fetching/crud-get.ts @@ -1,6 +1,8 @@ import sqlGenerator from "../../functions/dsql/sql/sql-generator"; import { APIResponseObject, DsqlCrudParam } from "../../types"; import connDbHandler, { ConnDBHandlerQueryObject } from "../db/conn-db-handler"; +import checkArrayDepth from "../check-array-depth"; +import parseDbResults from "../../functions/backend/parseDbResults"; export default async function < T extends { [key: string]: any } = { [key: string]: any } @@ -10,6 +12,7 @@ export default async function < count, countOnly, dbFullName, + tableSchema, }: Omit< DsqlCrudParam, "action" | "data" | "sanitize" @@ -55,13 +58,26 @@ export default async function < const res = await connDbHandler(undefined, connQueries); + const parsedRes = checkArrayDepth(res, 2) + ? parseDbResults({ unparsedResults: res[0], tableSchema }) + : res[0]; + const parsedBatchRes = checkArrayDepth(res, 3) + ? res.map((_r: any[][]) => { + return parseDbResults({ unparsedResults: _r[0], tableSchema }); + }) + : res; + const isSuccess = Array.isArray(res) && Array.isArray(res[0]); return { success: isSuccess, - payload: isSuccess ? (countOnly ? null : res[0]) : null, - batchPayload: isSuccess ? (countOnly ? null : res) : null, - error: isSuccess ? undefined : res?.error, + payload: isSuccess ? (countOnly ? null : parsedRes) : null, + batchPayload: isSuccess ? (countOnly ? null : parsedBatchRes) : null, + error: isSuccess + ? undefined + : typeof res == "object" && !Array.isArray(res) + ? res?.error + : undefined, errors: res?.errors, queryObject: { sql: queryObject?.string, diff --git a/package-shared/utils/data-fetching/crud.ts b/package-shared/utils/data-fetching/crud.ts index ee943b6..8589146 100644 --- a/package-shared/utils/data-fetching/crud.ts +++ b/package-shared/utils/data-fetching/crud.ts @@ -26,6 +26,7 @@ export default async function dsqlCrud< batchData, deleteKeyValues, debug, + tableSchema, } = params; const finalData = (sanitize ? sanitize({ data }) : data) as T; @@ -47,6 +48,7 @@ export default async function dsqlCrud< tableName: table, dbFullName, debug, + tableSchema, }); return INSERT_RESULT; @@ -60,6 +62,7 @@ export default async function dsqlCrud< identifierColumnName: (targetField || "id") as string, identifierValue: String(targetValue || targetId), debug, + tableSchema, }); return UPDATE_RESULT; diff --git a/package-shared/utils/db/schema/grab-text-field-type.ts b/package-shared/utils/db/schema/grab-text-field-type.ts index b66f122..d9996ac 100644 --- a/package-shared/utils/db/schema/grab-text-field-type.ts +++ b/package-shared/utils/db/schema/grab-text-field-type.ts @@ -11,6 +11,7 @@ export default function grabTextFieldType( if (field.css) return "css"; if (field.javascript) return "javascript"; if (field.shell) return "shell"; + if (field.markdown) return "markdown"; if (nullReturn) return undefined; return "plain"; } diff --git a/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.ts b/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.ts index 4a6c4e0..3425871 100644 --- a/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.ts +++ b/package-shared/utils/db/schema/resolve-schema-children-handle-children-tables.ts @@ -122,15 +122,16 @@ export default function ({ /** * Handle scenario where this table is a child of another */ - if ( - currentTableSchema.childTable && - currentTableSchema.childTableDbId && - currentTableSchema.childTableDbId - ) { - const targetParentDatabase = grabPrimaryRequiredDbSchema({ - dbId: currentTableSchema.childTableDbId, - userId, - }); + if (currentTableSchema.childTable && currentTableSchema.childTableDbId) { + const isParentDbCurrentDb = + currentTableSchema.childTableDbId == newCurrentDbSchema.id; + + const targetParentDatabase = isParentDbCurrentDb + ? newCurrentDbSchema + : grabPrimaryRequiredDbSchema({ + dbId: currentTableSchema.childTableDbId, + userId, + }); const targetParentDatabaseTableIndex = targetParentDatabase?.tables.findIndex( diff --git a/package-shared/utils/db/schema/set-text-field-type.ts b/package-shared/utils/db/schema/set-text-field-type.ts index 59410d3..f7e00b5 100644 --- a/package-shared/utils/db/schema/set-text-field-type.ts +++ b/package-shared/utils/db/schema/set-text-field-type.ts @@ -26,6 +26,7 @@ export default function setTextFieldType( if (type == "yaml") return { ...newField, yaml: true }; if (type == "javascript") return { ...newField, javascript: true }; if (type == "code") return { ...newField, code: true }; + if (type == "markdown") return { ...newField, markdown: true }; return { ...newField }; } diff --git a/package-shared/utils/grab-docker-resource-ip-numbers.ts b/package-shared/utils/grab-docker-resource-ip-numbers.ts index 0840da7..808a77f 100644 --- a/package-shared/utils/grab-docker-resource-ip-numbers.ts +++ b/package-shared/utils/grab-docker-resource-ip-numbers.ts @@ -11,5 +11,6 @@ export default function grabDockerResourceIPNumbers() { replica_1: 37, replica_2: 38, web_app_post_db_setup: 71, + static: 77, } as const; } diff --git a/package-shared/utils/grab-user-ai-info.ts b/package-shared/utils/grab-user-ai-info.ts new file mode 100644 index 0000000..d72fc87 --- /dev/null +++ b/package-shared/utils/grab-user-ai-info.ts @@ -0,0 +1,37 @@ +import { AIOptions, AIOptionsObject, SiteConfig } from "../types"; + +type Params = { + userConfig?: SiteConfig | null; +}; + +export type GrabUserAIConfigReturn = {}; + +export default function grabUserAIInfo({ + userConfig: passedConfig, +}: Params): AIOptionsObject | undefined { + const userConfig: SiteConfig | undefined = passedConfig + ? passedConfig + : undefined; + + if (!userConfig) return undefined; + + const targetAI = userConfig?.main.target_ai; + + if (!targetAI?.name || !userConfig?.main.api_keys) return undefined; + + const targetAIAPIKey = userConfig.main.api_keys[targetAI.name].key; + + if (!targetAIAPIKey) return undefined; + + const targetAIOption = AIOptions.find( + (aiOpt) => aiOpt.name == targetAI.name + ); + + targetAI.apiKey = targetAIAPIKey; + + if (targetAIOption?.baseUrl) { + targetAI.baseUrl = targetAIOption.baseUrl; + } + + return targetAI; +} diff --git a/package.json b/package.json index 6261628..615121b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/datasquirel", - "version": "5.1.0", + "version": "5.1.1", "description": "Cloud-based SQL data management tool", "main": "dist/index.js", "bin": {