feat(backend): persist tasks and generated message history

- add EntityTask domain and CRUD API backed by PostgreSQL

- relate generated messages directly to tasks and delete on task removal

- move preview generation to backend Llama endpoint

- migrate frontend task APIs from localStorage to backend endpoints

- update tests and CLAUDE rules for backend-owned LLM/persistence
This commit is contained in:
2026-03-27 02:46:56 -03:00
parent f2a16b5cf6
commit ebcea643c4
20 changed files with 1181 additions and 244 deletions

View File

@@ -0,0 +1,48 @@
package com.condado.newsletter.dto
import com.condado.newsletter.model.EntityTask
import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
import java.time.LocalDateTime
import java.util.UUID
data class EntityTaskCreateDto(
@field:NotNull val entityId: UUID,
@field:NotBlank val name: String,
@field:NotBlank val prompt: String,
@field:NotBlank val scheduleCron: String,
@field:NotBlank val emailLookback: String
)
data class EntityTaskUpdateDto(
@field:NotNull val entityId: UUID,
@field:NotBlank val name: String,
@field:NotBlank val prompt: String,
@field:NotBlank val scheduleCron: String,
@field:NotBlank val emailLookback: String
)
data class EntityTaskResponseDto(
val id: UUID,
val entityId: UUID,
val name: String,
val prompt: String,
val scheduleCron: String,
val emailLookback: String,
val active: Boolean,
val createdAt: LocalDateTime?
) {
companion object {
fun from(task: EntityTask): EntityTaskResponseDto =
EntityTaskResponseDto(
id = task.id!!,
entityId = task.virtualEntity.id!!,
name = task.name,
prompt = task.prompt,
scheduleCron = task.scheduleCron,
emailLookback = task.emailLookback,
active = task.active,
createdAt = task.createdAt
)
}
}