UNPKG

@backstageai/common

Version:

Common code for Backstage AI services

192 lines (185 loc) 4.25 kB
const mongoose = require("mongoose"); const parentRequestSchema = new mongoose.Schema( { userId: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true, index: true, }, // You can store the overall prompt or other metadata here prompt: { type: String, default: "", }, artistName: { type: String, }, // Store the input data for the requestPayload: { type: mongoose.Schema.Types.Mixed, // Store JSON for flexible input data required: true, }, status: { type: String, enum: ["pending", "queued", "processing", "completed", "failed"], default: "pending", }, // Soft delete or any other fields you like deleted: { type: Boolean, default: false, index: true, }, isAlbum: { type: Boolean, default: false, }, songTitle: { type: String, }, themeImage: { type: String, }, themeId: { type: mongoose.Schema.Types.ObjectId, required: false, index: true, }, }, { timestamps: true, // manages createdAt/updatedAt } ); // Exclude soft-deleted records by default parentRequestSchema.pre(/^find/, function (next) { this.where({ deleted: false }); next(); }); const ParentRequest = mongoose.models.ParentRequest || mongoose.model("ParentRequest", parentRequestSchema, "parentRequests"); const aiRequestSchema = new mongoose.Schema( { parentRequestId: { type: mongoose.Schema.Types.ObjectId, ref: "ParentRequest", // or ref: "AIRequest" if you prefer default: null, index: true, }, generationId: { type: String, index: true, required: true, default: "pending", }, outputUrl: { type: String, }, thumbnailUrl: { type: String, }, userId: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true, index: true, }, themeId: { type: mongoose.Schema.Types.ObjectId, required: false, index: true, }, taskType: { type: String, enum: ["image", "video"], required: true, index: true, }, generationType: { type: String, enum: ["image", "logo", "video", "avatar", "background-removal"], required: true, index: true, default: "image", }, aiService: { type: String, enum: ["falAi", "replicateAi", "lumalabs", "comfyDeploy"], required: true, }, requestPayload: { type: mongoose.Schema.Types.Mixed, // Can store JSON for flexible input data required: true, }, artistName: { type: String, }, response: { type: mongoose.Schema.Types.Mixed, // To store the AI service response default: null, }, webhookResponse: { type: mongoose.Schema.Types.Mixed, // To store webhook responses, if applicable default: null, }, status: { type: String, enum: ["pending", "queued", "processing", "completed", "failed"], default: "pending", }, errorMessage: { type: String, // To store any error messages in case of failure default: null, }, deleted: { type: Boolean, default: false, // Soft delete flag index: true, }, notificationShown: { type: Boolean, default: false, }, webhookCallReceived: { type: Boolean, default: false, }, isAlbum: { type: Boolean, default: false, }, songTitle: { type: String, }, progress: { type: Number, }, avatarId: { type: mongoose.Schema.Types.ObjectId, ref: "Avatar", }, themeImage: { type: String, }, excludeMyRequests: { type: Boolean, default: false, }, }, { timestamps: true, // Automatically manage `createdAt` and `updatedAt` } ); // Ensure queries exclude soft-deleted records by default aiRequestSchema.pre(/^find/, function (next) { this.where({ deleted: false }); next(); }); const AIRequest = mongoose.models.AIRequest || mongoose.model("AIRequest", aiRequestSchema, "aiRequests"); module.exports = { AIRequest, ParentRequest, };