Skip to content

[F3-03] Modelo de datos por usuario: UserSettings, Project, Asset, StorySeed #46

Open

Description

@JCCG-code

Fase: F3 · Tamaño: M · Depende de: #40 (F3-02), #20 (F0-10), #27 (F2-05)
Decisiones: D-05, D-08 y D-09 en #1

Objetivo

Que todos los datos pertenezcan a un usuario, que un usuario pueda tener varios proyectos con la misma ambientación y que el modelo soporte edición, regeneración y caducidad de ficheros.

Contexto

Job tiene prompt_ambience y seed únicos, así que una historia nueva sobrescribe la anterior de esa ambientación y la misma semilla en dos ambientaciones da error E11000.

Alcance

  • apps/server/src/core/db/: conexión, modelos y repositorios.
  • UserSettings: userId (único), locale, theme, defaultModelSelection, limits { maxConcurrentProjects }.
  • Project (sustituye a Job): ownerId, title, ambience, ambienceKey (con el normalize() actual), language, targetDurationSec, modelSelection (copia fija al crear), status, rev, steps (estado por paso), contenido textual por paso (seed, direction, story, package, ttsScript, visualTokens, scenes[] { n, description, imagePrompt, imageAssetId, status, error }), outputs { voiceAssetId, musicAssetId, finalAssetId, posterAssetId }, estimatedCost, usage[], deletedAt, timestamps.
  • Asset: ownerId, projectId, kind (voice | music | image | final | poster), storageKey, contentType, bytes, durationSec, sceneNumber, providerId, model, expiresAt (7 días, D-08), purgedAt.
  • StorySeed: añade ownerId y ambienceKey; índice { ownerId, ambienceKey, is_used, createdAt } (semillas por usuario, D-09).
  • Índices: Project {ownerId, createdAt:-1}, {ownerId, status}; Asset {projectId, kind}, {expiresAt}. Sin índices únicos de ambientación ni semilla.
  • Todos los repositorios exigen ownerId.

Criterios de aceptación

  • Test: un usuario crea dos proyectos con la misma ambientación → ambos existen.
  • Test: el usuario A no puede leer, modificar ni borrar un proyecto del usuario B (404).
  • Test: los repositorios lanzan si se llaman sin ownerId.
  • Test: las semillas del usuario A nunca se entregan al usuario B.
  • Test: un Asset nuevo tiene expiresAt = creación + 7 días.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions