40160-vm/backend/src/db/seeders/20231127130745-sample-data.js
2026-05-29 13:57:20 +00:00

2485 lines
47 KiB
JavaScript

const db = require('../models');
const Users = db.users;
const Conversations = db.conversations;
const Messages = db.messages;
const Projects = db.projects;
const AppTemplates = db.app_templates;
const FeatureRequests = db.feature_requests;
const AuditEvents = db.audit_events;
const ConversationsData = [
{
"title": "App Preview Kickoff",
// type code here for "relation_one" field
"channel": "mobile",
"status": "open",
"started_at": new Date('2026-05-20T10:00:00Z'),
"last_message_at": new Date('2026-05-20T10:12:00Z'),
"message_count": 4,
"language": "zh-CN",
},
{
"title": "Template Setup Questions",
// type code here for "relation_one" field
"channel": "mobile",
"status": "archived",
"started_at": new Date('2026-05-21T16:00:00Z'),
"last_message_at": new Date('2026-05-21T16:25:00Z'),
"message_count": 5,
"language": "en",
},
{
"title": "RBAC and Audit Logging",
// type code here for "relation_one" field
"channel": "web",
"status": "archived",
"started_at": new Date('2026-05-22T09:30:00Z'),
"last_message_at": new Date('2026-05-22T09:50:00Z'),
"message_count": 3,
"language": "en",
},
{
"title": "Seed Data Expectations",
// type code here for "relation_one" field
"channel": "mobile",
"status": "archived",
"started_at": new Date('2026-05-18T11:00:00Z'),
"last_message_at": new Date('2026-05-18T11:30:00Z'),
"message_count": 6,
"language": "en",
},
];
const MessagesData = [
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"sender_type": "assistant",
"content": "Conversation initiated",
"sent_at": new Date('2026-05-20T10:00:05Z'),
"content_format": "html",
"is_edited": true,
// type code here for "files" field
// type code here for "relation_one" field
},
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"sender_type": "system",
"content": "你是什么模型?",
"sent_at": new Date('2026-05-20T10:01:10Z'),
"content_format": "html",
"is_edited": false,
// type code here for "files" field
// type code here for "relation_one" field
},
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"sender_type": "system",
"content": "I am AI Engineer. I can help you build a CRUD app with auth, roles, permissions, admin UI, and React plus Node templates.",
"sent_at": new Date('2026-05-20T10:02:00Z'),
"content_format": "markdown",
"is_edited": true,
// type code here for "files" field
// type code here for "relation_one" field
},
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"sender_type": "assistant",
"content": "Please confirm the default stack and design choices for a new project.",
"sent_at": new Date('2026-05-21T16:02:00Z'),
"content_format": "plain_text",
"is_edited": true,
// type code here for "files" field
// type code here for "relation_one" field
},
];
const ProjectsData = [
{
"name": "App Preview Workspace",
"description": "Internal workspace to validate the default CRUD template, RBAC, and seed data generation.",
// type code here for "relation_one" field
"status": "paused",
"start_at": new Date('2026-05-15T09:00:00Z'),
"end_at": new Date('2026-06-15T17:00:00Z'),
// type code here for "relation_many" field
// type code here for "files" field
},
{
"name": "Onboarding Improvements",
"description": "Track improvements to welcome flow, login page illustration, and initial user experience.",
// type code here for "relation_one" field
"status": "completed",
"start_at": new Date('2026-06-01T09:00:00Z'),
"end_at": new Date('2026-06-30T17:00:00Z'),
// type code here for "relation_many" field
// type code here for "files" field
},
{
"name": "Template Catalog Review",
"description": "Review supported frontend and backend templates and ensure metadata is complete.",
// type code here for "relation_one" field
"status": "planning",
"start_at": new Date('2026-05-10T09:00:00Z'),
"end_at": new Date('2026-05-28T17:00:00Z'),
// type code here for "relation_many" field
// type code here for "files" field
},
{
"name": "Security and Compliance",
"description": "Ensure audit logging, permission boundaries, and data retention policies align with internal standards.",
// type code here for "relation_one" field
"status": "completed",
"start_at": new Date('2026-04-01T09:00:00Z'),
"end_at": new Date('2026-07-01T17:00:00Z'),
// type code here for "relation_many" field
// type code here for "files" field
},
];
const AppTemplatesData = [
{
"name": "React Node Starter",
"frontend_stack": "angular",
"backend_stack": "node",
"includes_auth": true,
"includes_admin_ui": true,
"includes_rbac": true,
"notes": "Default starter with CRUD scaffolding and basic RBAC.",
// type code here for "files" field
},
{
"name": "React API Only",
"frontend_stack": "vue",
"backend_stack": "nestjs",
"includes_auth": true,
"includes_admin_ui": false,
"includes_rbac": true,
"notes": "Headless setup focused on APIs and auth.",
// type code here for "files" field
},
{
"name": "Angular Material Starter",
"frontend_stack": "angular",
"backend_stack": "nestjs",
"includes_auth": true,
"includes_admin_ui": true,
"includes_rbac": true,
"notes": "Angular frontend using Material design system.",
// type code here for "files" field
},
{
"name": "Vue Node Starter",
"frontend_stack": "react",
"backend_stack": "node",
"includes_auth": true,
"includes_admin_ui": true,
"includes_rbac": true,
"notes": "Vue starter with admin UI and roles permissions.",
// type code here for "files" field
},
];
const FeatureRequestsData = [
{
"title": "Add welcome website page",
"details": "Provide a simple public landing page with short description and sign in link.",
// type code here for "relation_one" field
// type code here for "relation_one" field
"priority": "high",
"status": "rejected",
"requested_at": new Date('2026-05-19T12:00:00Z'),
"target_at": new Date('2026-06-10T12:00:00Z'),
// type code here for "files" field
},
{
"title": "Kanban view for feature requests",
"details": "Enable Kanban board using status column with drag and drop updates.",
// type code here for "relation_one" field
// type code here for "relation_one" field
"priority": "medium",
"status": "rejected",
"requested_at": new Date('2026-05-20T15:00:00Z'),
"target_at": new Date('2026-05-30T12:00:00Z'),
// type code here for "files" field
},
{
"title": "Export audit events to CSV",
"details": "Allow exporting filtered audit events for compliance reviews.",
// type code here for "relation_one" field
// type code here for "relation_one" field
"priority": "medium",
"status": "new",
"requested_at": new Date('2026-05-22T10:00:00Z'),
"target_at": new Date('2026-06-20T12:00:00Z'),
// type code here for "files" field
},
{
"title": "Improve message editor",
"details": "Support Markdown preview and better formatting controls for multiline message content.",
// type code here for "relation_one" field
// type code here for "relation_one" field
"priority": "low",
"status": "done",
"requested_at": new Date('2026-05-23T09:00:00Z'),
"target_at": new Date('2026-06-05T12:00:00Z'),
// type code here for "files" field
},
];
const AuditEventsData = [
{
// type code here for "relation_one" field
"action": "update",
"entity_type": "messages",
"entity_key": "taylor.chen@acmecorp.com",
"occurred_at": new Date('2026-05-21T09:15:00Z'),
"ip_address": "203.0.113.10",
"user_agent": "Chrome 124 on macOS",
"summary": "User login successful",
},
{
// type code here for "relation_one" field
"action": "permission_change",
"entity_type": "app_templates",
"entity_key": "Add welcome website page",
"occurred_at": new Date('2026-05-19T12:00:05Z'),
"ip_address": "203.0.113.22",
"user_agent": "Chrome 124 on Windows",
"summary": "Created feature request for landing page",
},
{
// type code here for "relation_one" field
"action": "permission_change",
"entity_type": "users",
"entity_key": "Kanban view for feature requests",
"occurred_at": new Date('2026-05-20T16:10:00Z'),
"ip_address": "203.0.113.10",
"user_agent": "Chrome 124 on macOS",
"summary": "Updated status to in progress",
},
{
// type code here for "relation_one" field
"action": "update",
"entity_type": "conversations",
"entity_key": "casey.nguyen@acmecorp.com",
"occurred_at": new Date('2026-05-18T08:00:00Z'),
"ip_address": "203.0.113.55",
"user_agent": "Firefox 126 on macOS",
"summary": "Adjusted user role and permissions",
},
];
// Similar logic for "relation_many"
async function associateConversationWithOwner() {
const relatedOwner0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Conversation0 = await Conversations.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Conversation0?.setOwner)
{
await
Conversation0.
setOwner(relatedOwner0);
}
const relatedOwner1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Conversation1 = await Conversations.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Conversation1?.setOwner)
{
await
Conversation1.
setOwner(relatedOwner1);
}
const relatedOwner2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Conversation2 = await Conversations.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Conversation2?.setOwner)
{
await
Conversation2.
setOwner(relatedOwner2);
}
const relatedOwner3 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Conversation3 = await Conversations.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (Conversation3?.setOwner)
{
await
Conversation3.
setOwner(relatedOwner3);
}
}
async function associateMessageWithConversation() {
const relatedConversation0 = await Conversations.findOne({
offset: Math.floor(Math.random() * (await Conversations.count())),
});
const Message0 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Message0?.setConversation)
{
await
Message0.
setConversation(relatedConversation0);
}
const relatedConversation1 = await Conversations.findOne({
offset: Math.floor(Math.random() * (await Conversations.count())),
});
const Message1 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Message1?.setConversation)
{
await
Message1.
setConversation(relatedConversation1);
}
const relatedConversation2 = await Conversations.findOne({
offset: Math.floor(Math.random() * (await Conversations.count())),
});
const Message2 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Message2?.setConversation)
{
await
Message2.
setConversation(relatedConversation2);
}
const relatedConversation3 = await Conversations.findOne({
offset: Math.floor(Math.random() * (await Conversations.count())),
});
const Message3 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (Message3?.setConversation)
{
await
Message3.
setConversation(relatedConversation3);
}
}
async function associateMessageWithSender() {
const relatedSender0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Message0 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Message0?.setSender)
{
await
Message0.
setSender(relatedSender0);
}
const relatedSender1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Message1 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Message1?.setSender)
{
await
Message1.
setSender(relatedSender1);
}
const relatedSender2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Message2 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Message2?.setSender)
{
await
Message2.
setSender(relatedSender2);
}
const relatedSender3 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Message3 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (Message3?.setSender)
{
await
Message3.
setSender(relatedSender3);
}
}
async function associateMessageWithParent_message() {
const relatedParent_message0 = await Messages.findOne({
offset: Math.floor(Math.random() * (await Messages.count())),
});
const Message0 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Message0?.setParent_message)
{
await
Message0.
setParent_message(relatedParent_message0);
}
const relatedParent_message1 = await Messages.findOne({
offset: Math.floor(Math.random() * (await Messages.count())),
});
const Message1 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Message1?.setParent_message)
{
await
Message1.
setParent_message(relatedParent_message1);
}
const relatedParent_message2 = await Messages.findOne({
offset: Math.floor(Math.random() * (await Messages.count())),
});
const Message2 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Message2?.setParent_message)
{
await
Message2.
setParent_message(relatedParent_message2);
}
const relatedParent_message3 = await Messages.findOne({
offset: Math.floor(Math.random() * (await Messages.count())),
});
const Message3 = await Messages.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (Message3?.setParent_message)
{
await
Message3.
setParent_message(relatedParent_message3);
}
}
async function associateProjectWithOwner() {
const relatedOwner0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Project0 = await Projects.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Project0?.setOwner)
{
await
Project0.
setOwner(relatedOwner0);
}
const relatedOwner1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Project1 = await Projects.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Project1?.setOwner)
{
await
Project1.
setOwner(relatedOwner1);
}
const relatedOwner2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Project2 = await Projects.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Project2?.setOwner)
{
await
Project2.
setOwner(relatedOwner2);
}
const relatedOwner3 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const Project3 = await Projects.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (Project3?.setOwner)
{
await
Project3.
setOwner(relatedOwner3);
}
}
// Similar logic for "relation_many"
async function associateFeatureRequestWithRequested_by() {
const relatedRequested_by0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const FeatureRequest0 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (FeatureRequest0?.setRequested_by)
{
await
FeatureRequest0.
setRequested_by(relatedRequested_by0);
}
const relatedRequested_by1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const FeatureRequest1 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (FeatureRequest1?.setRequested_by)
{
await
FeatureRequest1.
setRequested_by(relatedRequested_by1);
}
const relatedRequested_by2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const FeatureRequest2 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (FeatureRequest2?.setRequested_by)
{
await
FeatureRequest2.
setRequested_by(relatedRequested_by2);
}
const relatedRequested_by3 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const FeatureRequest3 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (FeatureRequest3?.setRequested_by)
{
await
FeatureRequest3.
setRequested_by(relatedRequested_by3);
}
}
async function associateFeatureRequestWithProject() {
const relatedProject0 = await Projects.findOne({
offset: Math.floor(Math.random() * (await Projects.count())),
});
const FeatureRequest0 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (FeatureRequest0?.setProject)
{
await
FeatureRequest0.
setProject(relatedProject0);
}
const relatedProject1 = await Projects.findOne({
offset: Math.floor(Math.random() * (await Projects.count())),
});
const FeatureRequest1 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (FeatureRequest1?.setProject)
{
await
FeatureRequest1.
setProject(relatedProject1);
}
const relatedProject2 = await Projects.findOne({
offset: Math.floor(Math.random() * (await Projects.count())),
});
const FeatureRequest2 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (FeatureRequest2?.setProject)
{
await
FeatureRequest2.
setProject(relatedProject2);
}
const relatedProject3 = await Projects.findOne({
offset: Math.floor(Math.random() * (await Projects.count())),
});
const FeatureRequest3 = await FeatureRequests.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (FeatureRequest3?.setProject)
{
await
FeatureRequest3.
setProject(relatedProject3);
}
}
async function associateAuditEventWithActor() {
const relatedActor0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const AuditEvent0 = await AuditEvents.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (AuditEvent0?.setActor)
{
await
AuditEvent0.
setActor(relatedActor0);
}
const relatedActor1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const AuditEvent1 = await AuditEvents.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (AuditEvent1?.setActor)
{
await
AuditEvent1.
setActor(relatedActor1);
}
const relatedActor2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const AuditEvent2 = await AuditEvents.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (AuditEvent2?.setActor)
{
await
AuditEvent2.
setActor(relatedActor2);
}
const relatedActor3 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const AuditEvent3 = await AuditEvents.findOne({
order: [['id', 'ASC']],
offset: 3
});
if (AuditEvent3?.setActor)
{
await
AuditEvent3.
setActor(relatedActor3);
}
}
module.exports = {
up: async (queryInterface, Sequelize) => {
await Conversations.bulkCreate(ConversationsData);
await Messages.bulkCreate(MessagesData);
await Projects.bulkCreate(ProjectsData);
await AppTemplates.bulkCreate(AppTemplatesData);
await FeatureRequests.bulkCreate(FeatureRequestsData);
await AuditEvents.bulkCreate(AuditEventsData);
await Promise.all([
// Similar logic for "relation_many"
await associateConversationWithOwner(),
await associateMessageWithConversation(),
await associateMessageWithSender(),
await associateMessageWithParent_message(),
await associateProjectWithOwner(),
// Similar logic for "relation_many"
await associateFeatureRequestWithRequested_by(),
await associateFeatureRequestWithProject(),
await associateAuditEventWithActor(),
]);
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('conversations', null, {});
await queryInterface.bulkDelete('messages', null, {});
await queryInterface.bulkDelete('projects', null, {});
await queryInterface.bulkDelete('app_templates', null, {});
await queryInterface.bulkDelete('feature_requests', null, {});
await queryInterface.bulkDelete('audit_events', null, {});
},
};