@trycompai/db 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +39 -0
- package/dist/index.mjs +14 -0
- package/dist/prisma/functionDefinition.sql +18 -0
- package/dist/prisma/migrations/20250403163138_init/migration.sql +611 -0
- package/dist/prisma/migrations/20250403165218_archived_on_its_own/migration.sql +29 -0
- package/dist/prisma/migrations/20250403194504_risk_assignee/migration.sql +18 -0
- package/dist/prisma/migrations/20250403201319_tasks_use_asignee/migration.sql +16 -0
- package/dist/prisma/migrations/20250403205655_vendor_assignee/migration.sql +22 -0
- package/dist/prisma/migrations/20250403205840_oops_optional/migration.sql +2 -0
- package/dist/prisma/migrations/20250403210049_task_assignee_optional_too/migration.sql +8 -0
- package/dist/prisma/migrations/20250404004853_stripecustomerid/migration.sql +2 -0
- package/dist/prisma/migrations/20250406004306_added_common_comment_table/migration.sql +20 -0
- package/dist/prisma/migrations/20250410193847_add_unique_constraint_to_artifact_t_table/migration.sql +30 -0
- package/dist/prisma/migrations/20250410193857_remove_published_field_from_evidence/migration.sql +12 -0
- package/dist/prisma/migrations/20250414191353_onboarding_experience/migration.sql +25 -0
- package/dist/prisma/migrations/20250414203443_added_evidence_to_onboarding/migration.sql +2 -0
- package/dist/prisma/migrations/20250417205622_add_global_vendors/migration.sql +26 -0
- package/dist/prisma/migrations/20250417205625_update_task_table_and_comments_and_attachments/migration.sql +86 -0
- package/dist/prisma/migrations/20250417205627_remove_evidence_table/migration.sql +109 -0
- package/dist/prisma/migrations/20250417205629_frequency_task_is_optional/migration.sql +2 -0
- package/dist/prisma/migrations/20250418151856_add_comment_relationship_to_attachment_and_vice_versa/migration.sql +8 -0
- package/dist/prisma/migrations/20250423154259_make_role_string/migration.sql +9 -0
- package/dist/prisma/migrations/20250424165055_update_onboarding_to_use_tasks/migration.sql +9 -0
- package/dist/prisma/migrations/20250424170518_remove_evidence_artifact_type/migration.sql +14 -0
- package/dist/prisma/migrations/20250428202144_add_website_to_organization/migration.sql +2 -0
- package/dist/prisma/migrations/20250429155419_add_company_details_to_onboarding/migration.sql +2 -0
- package/dist/prisma/migrations/20250509160401_added_framework_editor/migration.sql +8 -0
- package/dist/prisma/migrations/20250509162708_init_framework_editor_tables/migration.sql +122 -0
- package/dist/prisma/migrations/20250509172401_drop_slug/migration.sql +11 -0
- package/dist/prisma/migrations/20250509232122_trust_portal/migration.sql +24 -0
- package/dist/prisma/migrations/20250511040043_add_custom_domain_to_trust_portal/migration.sql +2 -0
- package/dist/prisma/migrations/20250511042943_trust_portal_domain_verified/migration.sql +2 -0
- package/dist/prisma/migrations/20250512004633_added_identifier/migration.sql +5 -0
- package/dist/prisma/migrations/20250512115717_added_framework_status/migration.sql +7 -0
- package/dist/prisma/migrations/20250512163351_add_contact_details_trust_portal/migration.sql +2 -0
- package/dist/prisma/migrations/20250514143147_remove_unique_constraint_on_integration_name/migration.sql +2 -0
- package/dist/prisma/migrations/20250514144228_add_vercel_check/migration.sql +2 -0
- package/dist/prisma/migrations/20250514150021_add_vercel_verification/migration.sql +2 -0
- package/dist/prisma/migrations/20250514161440_add_dates_to_framework_editor_tables/migration.sql +23 -0
- package/dist/prisma/migrations/20250515123635_trust_portal_friendly_url/migration.sql +21 -0
- package/dist/prisma/migrations/20250515124040_fix_trust_constraints/migration.sql +11 -0
- package/dist/prisma/migrations/20250516125758_patch_framework_id_in_editor/migration.sql +6 -0
- package/dist/prisma/migrations/20250516132431_add_many_to_many_support_to_tasks/migration.sql +69 -0
- package/dist/prisma/migrations/20250516142234_make_entity_optional/migration.sql +3 -0
- package/dist/prisma/migrations/20250516145149_drop_entity_and_entity_type/migration.sql +16 -0
- package/dist/prisma/migrations/20250516150558_drop_task_type/migration.sql +2 -0
- package/dist/prisma/migrations/20250516160714_insert_hardcoded_framework_to_db/migration.sql +37 -0
- package/dist/prisma/migrations/20250516161852_cast_framework_id_and_requirement_id_to_string/migration.sql +5 -0
- package/dist/prisma/migrations/20250516162324_convert_ids_to_new_format/migration.sql +31 -0
- package/dist/prisma/migrations/20250516162730_convert_framework_id/migration.sql +5 -0
- package/dist/prisma/migrations/20250516163156_added_relation_to_framework_and_requirement_maps/migration.sql +5 -0
- package/dist/prisma/migrations/20250516164307_drop_enums/migration.sql +5 -0
- package/dist/prisma/migrations/20250516194123_add_cal_option/migration.sql +2 -0
- package/dist/prisma/migrations/20250518133218_add_booking_details/migration.sql +2 -0
- package/dist/prisma/migrations/20250519141733_change_framework_id_to_string/migration.sql +3 -0
- package/dist/prisma/migrations/20250519141735_drop_enum_on_requirements_map/migration.sql +2 -0
- package/dist/prisma/migrations/20250519142913_add_template_references_to_instances/migration.sql +17 -0
- package/dist/prisma/migrations/20250519172353_drop_artifacts/migration.sql +56 -0
- package/dist/prisma/migrations/20250519204449_drop_relation_between_controls_and_framewrok_instance/migration.sql +14 -0
- package/dist/prisma/migrations/20250519212347_add_visibility_toggle_to_framework_editor/migration.sql +2 -0
- package/dist/prisma/migrations/20250520152548_add_approver_to_policy/migration.sql +5 -0
- package/dist/prisma/migrations/20250520175109_add_description_to_audit_log_for_convenience/migration.sql +2 -0
- package/dist/prisma/migrations/20250520175523_add_member_id_to_log_table/migration.sql +8 -0
- package/dist/prisma/migrations/20250521140239_add_entity_type_and_id_for_audit_logs_for_easy_filtering/migration.sql +9 -0
- package/dist/prisma/migrations/20250603135046_add_v2_onboarding_requirements/migration.sql +36 -0
- package/dist/prisma/migrations/20250604155610_add_job_id_column_to_onboarding/migration.sql +2 -0
- package/dist/prisma/migrations/20250605151521_make_framework_visibility_false/migration.sql +2 -0
- package/dist/prisma/migrations/20250605184738_add_cascade_to_entities_owned_by_org/migration.sql +29 -0
- package/dist/prisma/migrations/20250605184740_add_device_agent_details_to_org/migration.sql +18 -0
- package/dist/prisma/migrations/20250609130129_add_not_relevant/migration.sql +2 -0
- package/dist/prisma/migrations/20250610215328_add_fleet_label_to_employees/migration.sql +2 -0
- package/dist/prisma/migrations/20250611144654_add_is_fleet_setup_flag/migration.sql +2 -0
- package/dist/prisma/migrations/20250612160731_remove_unused_cols/migration.sql +10 -0
- package/dist/prisma/migrations/20250618001304_add_default_slug/migration.sql +3 -0
- package/dist/prisma/migrations/20250623184529_add_subscription_type/migration.sql +12 -0
- package/dist/prisma/migrations/20250626021946_add_starter_subscription_type/migration.sql +27 -0
- package/dist/prisma/migrations/20250626030206_added_new_subscription_type/migration.sql +2 -0
- package/dist/prisma/migrations/20250627180331_add_onboaridng_field/migration.sql +5 -0
- package/dist/prisma/migrations/20250627180828_rename_completed_col/migration.sql +15 -0
- package/dist/prisma/migrations/20250708152414_add_had_call_col/migration.sql +2 -0
- package/dist/prisma/migrations/20250711201749_update_retool_role_to_edit_had_call_column_in_organization_table/migration.sql +7 -0
- package/dist/prisma/migrations/20250711204234_add_read_permission_for_where_clause_on_retool_role/migration.sql +8 -0
- package/dist/prisma/migrations/20250714153009_remove_stripe_and_add_has_access/migration.sql +31 -0
- package/dist/prisma/migrations/20250715200054_add_perms_for_has_access_for_retool/migration.sql +7 -0
- package/dist/prisma/migrations/migration_lock.toml +3 -0
- package/dist/prisma/randomSecret.sql +12 -0
- package/dist/prisma/schema/attachments.prisma +35 -0
- package/dist/prisma/schema/auth.prisma +122 -0
- package/dist/prisma/schema/comment.prisma +27 -0
- package/dist/prisma/schema/context.prisma +18 -0
- package/dist/prisma/schema/control.prisma +21 -0
- package/dist/prisma/schema/framework-editor.prisma +96 -0
- package/dist/prisma/schema/framework.prisma +14 -0
- package/dist/prisma/schema/integration.prisma +32 -0
- package/dist/prisma/schema/onboarding.prisma +18 -0
- package/dist/prisma/schema/organization.prisma +34 -0
- package/dist/prisma/schema/policy.prisma +32 -0
- package/dist/prisma/schema/requirement.prisma +15 -0
- package/dist/prisma/schema/risk.prisma +57 -0
- package/dist/prisma/schema/shared.prisma +104 -0
- package/dist/prisma/schema/task.prisma +41 -0
- package/dist/prisma/schema/trust.prisma +37 -0
- package/dist/prisma/schema/vendor.prisma +56 -0
- package/dist/prisma/schema.prisma +12 -0
- package/dist/prisma/seed/frameworkEditorSchemas.js +136 -0
- package/dist/prisma/seed/frameworkEditorSchemas.ts +178 -0
- package/dist/prisma/seed/primitives/FrameworkEditorControlTemplate.json +296 -0
- package/dist/prisma/seed/primitives/FrameworkEditorFramework.json +101 -0
- package/dist/prisma/seed/primitives/FrameworkEditorPolicyTemplate.json +6057 -0
- package/dist/prisma/seed/primitives/FrameworkEditorRequirement.json +7841 -0
- package/dist/prisma/seed/primitives/FrameworkEditorTaskTemplate.json +308 -0
- package/dist/prisma/seed/primitives/FrameworkEditorVideo.json +47 -0
- package/dist/prisma/seed/relations/_FrameworkEditorControlTemplateToFrameworkEditorPolicyTemplate.json +178 -0
- package/dist/prisma/seed/relations/_FrameworkEditorControlTemplateToFrameworkEditorRequirement.json +470 -0
- package/dist/prisma/seed/relations/_FrameworkEditorControlTemplateToFrameworkEditorTaskTemplate.json +142 -0
- package/dist/prisma/seed/seed.js +160 -0
- package/dist/prisma/seed/seed.ts +192 -0
- package/dist/types.d.mts +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +24 -0
- package/dist/types.mjs +2 -0
- package/package.json +75 -0
- package/prisma/functionDefinition.sql +18 -0
- package/prisma/migrations/20250403163138_init/migration.sql +611 -0
- package/prisma/migrations/20250403165218_archived_on_its_own/migration.sql +29 -0
- package/prisma/migrations/20250403194504_risk_assignee/migration.sql +18 -0
- package/prisma/migrations/20250403201319_tasks_use_asignee/migration.sql +16 -0
- package/prisma/migrations/20250403205655_vendor_assignee/migration.sql +22 -0
- package/prisma/migrations/20250403205840_oops_optional/migration.sql +2 -0
- package/prisma/migrations/20250403210049_task_assignee_optional_too/migration.sql +8 -0
- package/prisma/migrations/20250404004853_stripecustomerid/migration.sql +2 -0
- package/prisma/migrations/20250406004306_added_common_comment_table/migration.sql +20 -0
- package/prisma/migrations/20250410193847_add_unique_constraint_to_artifact_t_table/migration.sql +30 -0
- package/prisma/migrations/20250410193857_remove_published_field_from_evidence/migration.sql +12 -0
- package/prisma/migrations/20250414191353_onboarding_experience/migration.sql +25 -0
- package/prisma/migrations/20250414203443_added_evidence_to_onboarding/migration.sql +2 -0
- package/prisma/migrations/20250417205622_add_global_vendors/migration.sql +26 -0
- package/prisma/migrations/20250417205625_update_task_table_and_comments_and_attachments/migration.sql +86 -0
- package/prisma/migrations/20250417205627_remove_evidence_table/migration.sql +109 -0
- package/prisma/migrations/20250417205629_frequency_task_is_optional/migration.sql +2 -0
- package/prisma/migrations/20250418151856_add_comment_relationship_to_attachment_and_vice_versa/migration.sql +8 -0
- package/prisma/migrations/20250423154259_make_role_string/migration.sql +9 -0
- package/prisma/migrations/20250424165055_update_onboarding_to_use_tasks/migration.sql +9 -0
- package/prisma/migrations/20250424170518_remove_evidence_artifact_type/migration.sql +14 -0
- package/prisma/migrations/20250428202144_add_website_to_organization/migration.sql +2 -0
- package/prisma/migrations/20250429155419_add_company_details_to_onboarding/migration.sql +2 -0
- package/prisma/migrations/20250509160401_added_framework_editor/migration.sql +8 -0
- package/prisma/migrations/20250509162708_init_framework_editor_tables/migration.sql +122 -0
- package/prisma/migrations/20250509172401_drop_slug/migration.sql +11 -0
- package/prisma/migrations/20250509232122_trust_portal/migration.sql +24 -0
- package/prisma/migrations/20250511040043_add_custom_domain_to_trust_portal/migration.sql +2 -0
- package/prisma/migrations/20250511042943_trust_portal_domain_verified/migration.sql +2 -0
- package/prisma/migrations/20250512004633_added_identifier/migration.sql +5 -0
- package/prisma/migrations/20250512115717_added_framework_status/migration.sql +7 -0
- package/prisma/migrations/20250512163351_add_contact_details_trust_portal/migration.sql +2 -0
- package/prisma/migrations/20250514143147_remove_unique_constraint_on_integration_name/migration.sql +2 -0
- package/prisma/migrations/20250514144228_add_vercel_check/migration.sql +2 -0
- package/prisma/migrations/20250514150021_add_vercel_verification/migration.sql +2 -0
- package/prisma/migrations/20250514161440_add_dates_to_framework_editor_tables/migration.sql +23 -0
- package/prisma/migrations/20250515123635_trust_portal_friendly_url/migration.sql +21 -0
- package/prisma/migrations/20250515124040_fix_trust_constraints/migration.sql +11 -0
- package/prisma/migrations/20250516125758_patch_framework_id_in_editor/migration.sql +6 -0
- package/prisma/migrations/20250516132431_add_many_to_many_support_to_tasks/migration.sql +69 -0
- package/prisma/migrations/20250516142234_make_entity_optional/migration.sql +3 -0
- package/prisma/migrations/20250516145149_drop_entity_and_entity_type/migration.sql +16 -0
- package/prisma/migrations/20250516150558_drop_task_type/migration.sql +2 -0
- package/prisma/migrations/20250516160714_insert_hardcoded_framework_to_db/migration.sql +37 -0
- package/prisma/migrations/20250516161852_cast_framework_id_and_requirement_id_to_string/migration.sql +5 -0
- package/prisma/migrations/20250516162324_convert_ids_to_new_format/migration.sql +31 -0
- package/prisma/migrations/20250516162730_convert_framework_id/migration.sql +5 -0
- package/prisma/migrations/20250516163156_added_relation_to_framework_and_requirement_maps/migration.sql +5 -0
- package/prisma/migrations/20250516164307_drop_enums/migration.sql +5 -0
- package/prisma/migrations/20250516194123_add_cal_option/migration.sql +2 -0
- package/prisma/migrations/20250518133218_add_booking_details/migration.sql +2 -0
- package/prisma/migrations/20250519141733_change_framework_id_to_string/migration.sql +3 -0
- package/prisma/migrations/20250519141735_drop_enum_on_requirements_map/migration.sql +2 -0
- package/prisma/migrations/20250519142913_add_template_references_to_instances/migration.sql +17 -0
- package/prisma/migrations/20250519172353_drop_artifacts/migration.sql +56 -0
- package/prisma/migrations/20250519204449_drop_relation_between_controls_and_framewrok_instance/migration.sql +14 -0
- package/prisma/migrations/20250519212347_add_visibility_toggle_to_framework_editor/migration.sql +2 -0
- package/prisma/migrations/20250520152548_add_approver_to_policy/migration.sql +5 -0
- package/prisma/migrations/20250520175109_add_description_to_audit_log_for_convenience/migration.sql +2 -0
- package/prisma/migrations/20250520175523_add_member_id_to_log_table/migration.sql +8 -0
- package/prisma/migrations/20250521140239_add_entity_type_and_id_for_audit_logs_for_easy_filtering/migration.sql +9 -0
- package/prisma/migrations/20250603135046_add_v2_onboarding_requirements/migration.sql +36 -0
- package/prisma/migrations/20250604155610_add_job_id_column_to_onboarding/migration.sql +2 -0
- package/prisma/migrations/20250605151521_make_framework_visibility_false/migration.sql +2 -0
- package/prisma/migrations/20250605184738_add_cascade_to_entities_owned_by_org/migration.sql +29 -0
- package/prisma/migrations/20250605184740_add_device_agent_details_to_org/migration.sql +18 -0
- package/prisma/migrations/20250609130129_add_not_relevant/migration.sql +2 -0
- package/prisma/migrations/20250610215328_add_fleet_label_to_employees/migration.sql +2 -0
- package/prisma/migrations/20250611144654_add_is_fleet_setup_flag/migration.sql +2 -0
- package/prisma/migrations/20250612160731_remove_unused_cols/migration.sql +10 -0
- package/prisma/migrations/20250618001304_add_default_slug/migration.sql +3 -0
- package/prisma/migrations/20250623184529_add_subscription_type/migration.sql +12 -0
- package/prisma/migrations/20250626021946_add_starter_subscription_type/migration.sql +27 -0
- package/prisma/migrations/20250626030206_added_new_subscription_type/migration.sql +2 -0
- package/prisma/migrations/20250627180331_add_onboaridng_field/migration.sql +5 -0
- package/prisma/migrations/20250627180828_rename_completed_col/migration.sql +15 -0
- package/prisma/migrations/20250708152414_add_had_call_col/migration.sql +2 -0
- package/prisma/migrations/20250711201749_update_retool_role_to_edit_had_call_column_in_organization_table/migration.sql +7 -0
- package/prisma/migrations/20250711204234_add_read_permission_for_where_clause_on_retool_role/migration.sql +8 -0
- package/prisma/migrations/20250714153009_remove_stripe_and_add_has_access/migration.sql +31 -0
- package/prisma/migrations/20250715200054_add_perms_for_has_access_for_retool/migration.sql +7 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/randomSecret.sql +12 -0
- package/prisma/schema/attachments.prisma +35 -0
- package/prisma/schema/auth.prisma +122 -0
- package/prisma/schema/comment.prisma +27 -0
- package/prisma/schema/context.prisma +18 -0
- package/prisma/schema/control.prisma +21 -0
- package/prisma/schema/framework-editor.prisma +96 -0
- package/prisma/schema/framework.prisma +14 -0
- package/prisma/schema/integration.prisma +32 -0
- package/prisma/schema/onboarding.prisma +18 -0
- package/prisma/schema/organization.prisma +34 -0
- package/prisma/schema/policy.prisma +32 -0
- package/prisma/schema/requirement.prisma +15 -0
- package/prisma/schema/risk.prisma +57 -0
- package/prisma/schema/shared.prisma +104 -0
- package/prisma/schema/task.prisma +41 -0
- package/prisma/schema/trust.prisma +37 -0
- package/prisma/schema/vendor.prisma +56 -0
- package/prisma/schema.prisma +12 -0
- package/prisma/seed/frameworkEditorSchemas.js +136 -0
- package/prisma/seed/frameworkEditorSchemas.ts +178 -0
- package/prisma/seed/primitives/FrameworkEditorControlTemplate.json +296 -0
- package/prisma/seed/primitives/FrameworkEditorFramework.json +101 -0
- package/prisma/seed/primitives/FrameworkEditorPolicyTemplate.json +6057 -0
- package/prisma/seed/primitives/FrameworkEditorRequirement.json +7841 -0
- package/prisma/seed/primitives/FrameworkEditorTaskTemplate.json +308 -0
- package/prisma/seed/primitives/FrameworkEditorVideo.json +47 -0
- package/prisma/seed/relations/_FrameworkEditorControlTemplateToFrameworkEditorPolicyTemplate.json +178 -0
- package/prisma/seed/relations/_FrameworkEditorControlTemplateToFrameworkEditorRequirement.json +470 -0
- package/prisma/seed/relations/_FrameworkEditorControlTemplateToFrameworkEditorTaskTemplate.json +142 -0
- package/prisma/seed/seed.js +160 -0
- package/prisma/seed/seed.ts +192 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const client_1 = require("@prisma/client");
|
|
7
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const frameworkEditorSchemas_1 = require("./frameworkEditorSchemas");
|
|
10
|
+
const prisma = new client_1.PrismaClient();
|
|
11
|
+
async function seedJsonFiles(subDirectory) {
|
|
12
|
+
const directoryPath = node_path_1.default.join(__dirname, subDirectory);
|
|
13
|
+
console.log(`Starting to seed files from: ${directoryPath}`);
|
|
14
|
+
const files = await promises_1.default.readdir(directoryPath);
|
|
15
|
+
const jsonFiles = files.filter((file) => file.endsWith('.json'));
|
|
16
|
+
for (const jsonFile of jsonFiles) {
|
|
17
|
+
try {
|
|
18
|
+
const filePath = node_path_1.default.join(directoryPath, jsonFile);
|
|
19
|
+
const jsonContent = await promises_1.default.readFile(filePath, 'utf-8');
|
|
20
|
+
const jsonData = JSON.parse(jsonContent);
|
|
21
|
+
if (!Array.isArray(jsonData) || jsonData.length === 0) {
|
|
22
|
+
console.log(`Skipping empty or invalid JSON file: ${jsonFile}`);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (subDirectory === 'primitives') {
|
|
26
|
+
const modelNameForPrisma = jsonFile.replace('.json', '');
|
|
27
|
+
const prismaModelKey = modelNameForPrisma.charAt(0).toLowerCase() + modelNameForPrisma.slice(1);
|
|
28
|
+
const zodModelKey = modelNameForPrisma;
|
|
29
|
+
const prismaAny = prisma;
|
|
30
|
+
if (!prismaAny[prismaModelKey] ||
|
|
31
|
+
typeof prismaAny[prismaModelKey].createMany !== 'function') {
|
|
32
|
+
console.warn(`Model ${prismaModelKey} not found on Prisma client or does not support createMany. Skipping ${jsonFile}.`);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const zodSchema = frameworkEditorSchemas_1.frameworkEditorModelSchemas[zodModelKey];
|
|
36
|
+
if (!zodSchema) {
|
|
37
|
+
console.warn(`Zod schema not found for model ${String(zodModelKey)}. Skipping validation for ${jsonFile}.`);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log(`Validating ${jsonData.length} records from ${jsonFile} against ${String(zodModelKey)} schema...`);
|
|
41
|
+
for (const item of jsonData) {
|
|
42
|
+
try {
|
|
43
|
+
zodSchema.parse(item);
|
|
44
|
+
}
|
|
45
|
+
catch (validationError) {
|
|
46
|
+
console.error(`Validation failed for an item in ${jsonFile} for model ${String(zodModelKey)}:`, item);
|
|
47
|
+
console.error('Validation errors:', validationError);
|
|
48
|
+
throw new Error(`Data validation failed for ${jsonFile}.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log(`Validation successful for ${jsonFile}.`);
|
|
52
|
+
}
|
|
53
|
+
const processedData = jsonData.map((item) => {
|
|
54
|
+
const newItem = { ...item };
|
|
55
|
+
if (newItem.createdAt && typeof newItem.createdAt === 'string') {
|
|
56
|
+
newItem.createdAt = new Date(newItem.createdAt);
|
|
57
|
+
}
|
|
58
|
+
if (newItem.updatedAt && typeof newItem.updatedAt === 'string') {
|
|
59
|
+
newItem.updatedAt = new Date(newItem.updatedAt);
|
|
60
|
+
}
|
|
61
|
+
return newItem;
|
|
62
|
+
});
|
|
63
|
+
console.log(`Seeding ${processedData.length} records from ${jsonFile} into ${prismaModelKey}...`);
|
|
64
|
+
// Use upsert to update existing records instead of skipping them
|
|
65
|
+
for (const record of processedData) {
|
|
66
|
+
await prismaAny[prismaModelKey].upsert({
|
|
67
|
+
where: { id: record.id },
|
|
68
|
+
create: record,
|
|
69
|
+
update: record,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
console.log(`Finished seeding ${jsonFile} from primitives.`);
|
|
73
|
+
}
|
|
74
|
+
else if (subDirectory === 'relations') {
|
|
75
|
+
// Expected filename format: _ModelAToModelB.json
|
|
76
|
+
if (!jsonFile.startsWith('_') || !jsonFile.includes('To')) {
|
|
77
|
+
console.warn(`Skipping relation file with unexpected format: ${jsonFile}`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const modelNamesPart = jsonFile.substring(1, jsonFile.indexOf('.json'));
|
|
81
|
+
const [modelANamePascal, modelBNamePascal] = modelNamesPart.split('To');
|
|
82
|
+
if (!modelANamePascal || !modelBNamePascal) {
|
|
83
|
+
console.warn(`Could not parse model names from relation file: ${jsonFile}`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const prismaModelAName = modelANamePascal.charAt(0).toLowerCase() + modelANamePascal.slice(1);
|
|
87
|
+
// Infer relation field name on ModelA: pluralized, camelCased ModelB name
|
|
88
|
+
// e.g., if ModelB is FrameworkEditorPolicyTemplate, relation field is frameworkEditorPolicyTemplates
|
|
89
|
+
// This is a common convention, but might need adjustment based on actual schema
|
|
90
|
+
let relationFieldNameOnModelA = modelBNamePascal.charAt(0).toLowerCase() + modelBNamePascal.slice(1);
|
|
91
|
+
if (!relationFieldNameOnModelA.endsWith('s')) {
|
|
92
|
+
// basic pluralization
|
|
93
|
+
relationFieldNameOnModelA += 's';
|
|
94
|
+
}
|
|
95
|
+
// Special handling for 'Requirement' -> 'requirements' (already plural)
|
|
96
|
+
// and other specific cases if 's' isn't the right pluralization.
|
|
97
|
+
// For now, using a direct map for known cases from the user's file names.
|
|
98
|
+
if (modelBNamePascal === 'FrameworkEditorPolicyTemplate') {
|
|
99
|
+
relationFieldNameOnModelA = 'policyTemplates';
|
|
100
|
+
}
|
|
101
|
+
else if (modelBNamePascal === 'FrameworkEditorRequirement') {
|
|
102
|
+
relationFieldNameOnModelA = 'requirements';
|
|
103
|
+
}
|
|
104
|
+
else if (modelBNamePascal === 'FrameworkEditorTaskTemplate') {
|
|
105
|
+
relationFieldNameOnModelA = 'taskTemplates';
|
|
106
|
+
}
|
|
107
|
+
const prismaAny = prisma;
|
|
108
|
+
if (!prismaAny[prismaModelAName] ||
|
|
109
|
+
typeof prismaAny[prismaModelAName].update !== 'function') {
|
|
110
|
+
console.warn(`Model ${prismaModelAName} not found on Prisma client or does not support update. Skipping ${jsonFile}.`);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
console.log(`Processing relations from ${jsonFile} for ${prismaModelAName} to connect via ${relationFieldNameOnModelA}...`);
|
|
114
|
+
let connectionsMade = 0;
|
|
115
|
+
for (const relationItem of jsonData) {
|
|
116
|
+
if (!relationItem.A || !relationItem.B) {
|
|
117
|
+
console.warn(`Skipping invalid relation item in ${jsonFile}:`, relationItem);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const idA = relationItem.A;
|
|
121
|
+
const idB = relationItem.B;
|
|
122
|
+
try {
|
|
123
|
+
await prismaAny[prismaModelAName].update({
|
|
124
|
+
where: { id: idA },
|
|
125
|
+
data: {
|
|
126
|
+
[relationFieldNameOnModelA]: {
|
|
127
|
+
connect: { id: idB },
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
connectionsMade++;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error(`Failed to connect ${prismaModelAName} (${idA}) with ${modelBNamePascal} (${idB}) from ${jsonFile}:`, error);
|
|
135
|
+
// Decide if one error should stop the whole process for this file or continue
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
console.log(`Finished processing ${jsonFile}. Made ${connectionsMade} connections.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error(`Error processing ${jsonFile}:`, error);
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function main() {
|
|
148
|
+
try {
|
|
149
|
+
await seedJsonFiles('primitives');
|
|
150
|
+
await seedJsonFiles('relations');
|
|
151
|
+
await prisma.$disconnect();
|
|
152
|
+
console.log('Seeding completed successfully for primitives and relations.');
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('Seeding failed:', error);
|
|
156
|
+
await prisma.$disconnect();
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
main();
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { PrismaClient } from '@prisma/client';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { frameworkEditorModelSchemas } from './frameworkEditorSchemas';
|
|
5
|
+
|
|
6
|
+
const prisma = new PrismaClient();
|
|
7
|
+
|
|
8
|
+
async function seedJsonFiles(subDirectory: string) {
|
|
9
|
+
const directoryPath = path.join(__dirname, subDirectory);
|
|
10
|
+
console.log(`Starting to seed files from: ${directoryPath}`);
|
|
11
|
+
const files = await fs.readdir(directoryPath);
|
|
12
|
+
const jsonFiles = files.filter((file) => file.endsWith('.json'));
|
|
13
|
+
|
|
14
|
+
for (const jsonFile of jsonFiles) {
|
|
15
|
+
try {
|
|
16
|
+
const filePath = path.join(directoryPath, jsonFile);
|
|
17
|
+
const jsonContent = await fs.readFile(filePath, 'utf-8');
|
|
18
|
+
const jsonData = JSON.parse(jsonContent);
|
|
19
|
+
|
|
20
|
+
if (!Array.isArray(jsonData) || jsonData.length === 0) {
|
|
21
|
+
console.log(`Skipping empty or invalid JSON file: ${jsonFile}`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (subDirectory === 'primitives') {
|
|
26
|
+
const modelNameForPrisma = jsonFile.replace('.json', '');
|
|
27
|
+
const prismaModelKey =
|
|
28
|
+
modelNameForPrisma.charAt(0).toLowerCase() + modelNameForPrisma.slice(1);
|
|
29
|
+
const zodModelKey = modelNameForPrisma as keyof typeof frameworkEditorModelSchemas;
|
|
30
|
+
|
|
31
|
+
const prismaAny = prisma as any;
|
|
32
|
+
if (
|
|
33
|
+
!prismaAny[prismaModelKey] ||
|
|
34
|
+
typeof prismaAny[prismaModelKey].createMany !== 'function'
|
|
35
|
+
) {
|
|
36
|
+
console.warn(
|
|
37
|
+
`Model ${prismaModelKey} not found on Prisma client or does not support createMany. Skipping ${jsonFile}.`,
|
|
38
|
+
);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const zodSchema = frameworkEditorModelSchemas[zodModelKey];
|
|
43
|
+
if (!zodSchema) {
|
|
44
|
+
console.warn(
|
|
45
|
+
`Zod schema not found for model ${String(zodModelKey)}. Skipping validation for ${jsonFile}.`,
|
|
46
|
+
);
|
|
47
|
+
} else {
|
|
48
|
+
console.log(
|
|
49
|
+
`Validating ${jsonData.length} records from ${jsonFile} against ${String(zodModelKey)} schema...`,
|
|
50
|
+
);
|
|
51
|
+
for (const item of jsonData) {
|
|
52
|
+
try {
|
|
53
|
+
zodSchema.parse(item);
|
|
54
|
+
} catch (validationError) {
|
|
55
|
+
console.error(
|
|
56
|
+
`Validation failed for an item in ${jsonFile} for model ${String(zodModelKey)}:`,
|
|
57
|
+
item,
|
|
58
|
+
);
|
|
59
|
+
console.error('Validation errors:', validationError);
|
|
60
|
+
throw new Error(`Data validation failed for ${jsonFile}.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
console.log(`Validation successful for ${jsonFile}.`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const processedData = jsonData.map((item) => {
|
|
67
|
+
const newItem = { ...item };
|
|
68
|
+
if (newItem.createdAt && typeof newItem.createdAt === 'string') {
|
|
69
|
+
newItem.createdAt = new Date(newItem.createdAt);
|
|
70
|
+
}
|
|
71
|
+
if (newItem.updatedAt && typeof newItem.updatedAt === 'string') {
|
|
72
|
+
newItem.updatedAt = new Date(newItem.updatedAt);
|
|
73
|
+
}
|
|
74
|
+
return newItem;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
console.log(
|
|
78
|
+
`Seeding ${processedData.length} records from ${jsonFile} into ${prismaModelKey}...`,
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// Use upsert to update existing records instead of skipping them
|
|
82
|
+
for (const record of processedData) {
|
|
83
|
+
await prismaAny[prismaModelKey].upsert({
|
|
84
|
+
where: { id: record.id },
|
|
85
|
+
create: record,
|
|
86
|
+
update: record,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
console.log(`Finished seeding ${jsonFile} from primitives.`);
|
|
91
|
+
} else if (subDirectory === 'relations') {
|
|
92
|
+
// Expected filename format: _ModelAToModelB.json
|
|
93
|
+
if (!jsonFile.startsWith('_') || !jsonFile.includes('To')) {
|
|
94
|
+
console.warn(`Skipping relation file with unexpected format: ${jsonFile}`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const modelNamesPart = jsonFile.substring(1, jsonFile.indexOf('.json'));
|
|
99
|
+
const [modelANamePascal, modelBNamePascal] = modelNamesPart.split('To');
|
|
100
|
+
|
|
101
|
+
if (!modelANamePascal || !modelBNamePascal) {
|
|
102
|
+
console.warn(`Could not parse model names from relation file: ${jsonFile}`);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const prismaModelAName =
|
|
107
|
+
modelANamePascal.charAt(0).toLowerCase() + modelANamePascal.slice(1);
|
|
108
|
+
// Infer relation field name on ModelA: pluralized, camelCased ModelB name
|
|
109
|
+
// e.g., if ModelB is FrameworkEditorPolicyTemplate, relation field is frameworkEditorPolicyTemplates
|
|
110
|
+
// This is a common convention, but might need adjustment based on actual schema
|
|
111
|
+
let relationFieldNameOnModelA =
|
|
112
|
+
modelBNamePascal.charAt(0).toLowerCase() + modelBNamePascal.slice(1);
|
|
113
|
+
if (!relationFieldNameOnModelA.endsWith('s')) {
|
|
114
|
+
// basic pluralization
|
|
115
|
+
relationFieldNameOnModelA += 's';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Special handling for 'Requirement' -> 'requirements' (already plural)
|
|
119
|
+
// and other specific cases if 's' isn't the right pluralization.
|
|
120
|
+
// For now, using a direct map for known cases from the user's file names.
|
|
121
|
+
if (modelBNamePascal === 'FrameworkEditorPolicyTemplate') {
|
|
122
|
+
relationFieldNameOnModelA = 'policyTemplates';
|
|
123
|
+
} else if (modelBNamePascal === 'FrameworkEditorRequirement') {
|
|
124
|
+
relationFieldNameOnModelA = 'requirements';
|
|
125
|
+
} else if (modelBNamePascal === 'FrameworkEditorTaskTemplate') {
|
|
126
|
+
relationFieldNameOnModelA = 'taskTemplates';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const prismaAny = prisma as any;
|
|
130
|
+
if (
|
|
131
|
+
!prismaAny[prismaModelAName] ||
|
|
132
|
+
typeof prismaAny[prismaModelAName].update !== 'function'
|
|
133
|
+
) {
|
|
134
|
+
console.warn(
|
|
135
|
+
`Model ${prismaModelAName} not found on Prisma client or does not support update. Skipping ${jsonFile}.`,
|
|
136
|
+
);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
console.log(
|
|
141
|
+
`Processing relations from ${jsonFile} for ${prismaModelAName} to connect via ${relationFieldNameOnModelA}...`,
|
|
142
|
+
);
|
|
143
|
+
let connectionsMade = 0;
|
|
144
|
+
for (const relationItem of jsonData) {
|
|
145
|
+
if (!relationItem.A || !relationItem.B) {
|
|
146
|
+
console.warn(`Skipping invalid relation item in ${jsonFile}:`, relationItem);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const idA = relationItem.A;
|
|
150
|
+
const idB = relationItem.B;
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
await prismaAny[prismaModelAName].update({
|
|
154
|
+
where: { id: idA },
|
|
155
|
+
data: {
|
|
156
|
+
[relationFieldNameOnModelA]: {
|
|
157
|
+
connect: { id: idB },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
connectionsMade++;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.error(
|
|
164
|
+
`Failed to connect ${prismaModelAName} (${idA}) with ${modelBNamePascal} (${idB}) from ${jsonFile}:`,
|
|
165
|
+
error,
|
|
166
|
+
);
|
|
167
|
+
// Decide if one error should stop the whole process for this file or continue
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
console.log(`Finished processing ${jsonFile}. Made ${connectionsMade} connections.`);
|
|
171
|
+
}
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error(`Error processing ${jsonFile}:`, error);
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function main() {
|
|
180
|
+
try {
|
|
181
|
+
await seedJsonFiles('primitives');
|
|
182
|
+
await seedJsonFiles('relations');
|
|
183
|
+
await prisma.$disconnect();
|
|
184
|
+
console.log('Seeding completed successfully for primitives and relations.');
|
|
185
|
+
} catch (error: unknown) {
|
|
186
|
+
console.error('Seeding failed:', error);
|
|
187
|
+
await prisma.$disconnect();
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
main();
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '@prisma/client';
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '@prisma/client';
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
15
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
16
|
+
|
|
17
|
+
// src/types.ts
|
|
18
|
+
var types_exports = {};
|
|
19
|
+
module.exports = __toCommonJS(types_exports);
|
|
20
|
+
__reExport(types_exports, require("@prisma/client"), module.exports);
|
|
21
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
22
|
+
0 && (module.exports = {
|
|
23
|
+
...require("@prisma/client")
|
|
24
|
+
});
|
package/dist/types.mjs
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@trycompai/db",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Database package with Prisma client and schema for Comp AI",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist/**",
|
|
10
|
+
"prisma/**",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.mjs",
|
|
17
|
+
"require": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./types": {
|
|
20
|
+
"types": "./dist/types.d.ts",
|
|
21
|
+
"import": "./dist/types.mjs",
|
|
22
|
+
"require": "./dist/types.js"
|
|
23
|
+
},
|
|
24
|
+
"./client": {
|
|
25
|
+
"types": "./dist/client.d.ts",
|
|
26
|
+
"import": "./dist/client.mjs",
|
|
27
|
+
"require": "./dist/client.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup src/index.ts src/types.ts --format cjs,esm --dts && bun run db:generate",
|
|
32
|
+
"clean": "rm -rf .turbo node_modules dist",
|
|
33
|
+
"db:generate": "bunx prisma generate",
|
|
34
|
+
"db:migrate": "bunx prisma migrate dev",
|
|
35
|
+
"db:push": "bunx prisma db push",
|
|
36
|
+
"db:seed": "bunx prisma db seed",
|
|
37
|
+
"db:studio": "bunx prisma studio",
|
|
38
|
+
"dev": "tsup src/index.ts src/types.ts --format cjs,esm --watch --dts",
|
|
39
|
+
"docker:clean": "docker-compose down -v",
|
|
40
|
+
"docker:down": "docker-compose down",
|
|
41
|
+
"docker:up": "docker-compose up -d",
|
|
42
|
+
"lint": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json}' 'prisma/**/*.prisma' && tsc --noEmit",
|
|
43
|
+
"postbuild": "cp -r prisma dist/ || echo 'No prisma directory to copy'",
|
|
44
|
+
"typecheck": "tsc --noEmit"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@prisma/client": "6.9.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@comp/tsconfig": "workspace:*",
|
|
51
|
+
"prisma": "^6.9.0",
|
|
52
|
+
"ts-node": "^10.9.2",
|
|
53
|
+
"tsup": "^8.5.0",
|
|
54
|
+
"typescript": "^5.8.3"
|
|
55
|
+
},
|
|
56
|
+
"prisma": {
|
|
57
|
+
"schema": "prisma",
|
|
58
|
+
"seed": "ts-node prisma/seed/seed.ts"
|
|
59
|
+
},
|
|
60
|
+
"keywords": [
|
|
61
|
+
"prisma",
|
|
62
|
+
"database",
|
|
63
|
+
"postgresql",
|
|
64
|
+
"comp-ai"
|
|
65
|
+
],
|
|
66
|
+
"repository": {
|
|
67
|
+
"type": "git",
|
|
68
|
+
"url": "git+https://github.com/comp-ai/comp.git",
|
|
69
|
+
"directory": "packages/db"
|
|
70
|
+
},
|
|
71
|
+
"license": "MIT",
|
|
72
|
+
"publishConfig": {
|
|
73
|
+
"access": "public"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- Create function to generate prefixed CUID with sortable timestamp (compact)
|
|
2
|
+
CREATE OR REPLACE FUNCTION generate_prefixed_cuid(prefix text)
|
|
3
|
+
RETURNS text AS $$
|
|
4
|
+
DECLARE
|
|
5
|
+
timestamp_hex text;
|
|
6
|
+
random_hex text;
|
|
7
|
+
BEGIN
|
|
8
|
+
-- Generate timestamp component (seconds since epoch) as hex
|
|
9
|
+
timestamp_hex = LOWER(TO_HEX(EXTRACT(EPOCH FROM NOW())::BIGINT));
|
|
10
|
+
|
|
11
|
+
-- Generate 8 random bytes and encode as hex (16 characters)
|
|
12
|
+
-- Ensure we call the function from the correct schema if pgcrypto is installed elsewhere
|
|
13
|
+
random_hex = encode(gen_random_bytes(8), 'hex');
|
|
14
|
+
|
|
15
|
+
-- Combine prefix, timestamp, and random hex string
|
|
16
|
+
RETURN prefix || '_' || timestamp_hex || random_hex;
|
|
17
|
+
END;
|
|
18
|
+
$$ LANGUAGE plpgsql;
|