Files
NewSmoop/server/internal/dto/task.go

58 lines
1.8 KiB
Go

package dto
import (
"smoop-api/internal/models"
"time"
)
type TaskDto struct {
ID uint `json:"id"`
DeviceGUID string `json:"deviceGuid"`
Type models.DeviceTaskType `json:"type"`
Payload string `json:"payload"` // raw JSON string
Status models.TaskStatus `json:"status"`
ErrorMsg string `json:"error,omitempty"`
Result string `json:"result,omitempty"`
CreatedAt time.Time `json:"createdAt"`
StartedAt *time.Time `json:"startedAt,omitempty"`
FinishedAt *time.Time `json:"finishedAt,omitempty"`
}
func MapTask(t models.DEviceTask) TaskDto {
return TaskDto{
ID: t.ID,
DeviceGUID: t.DeviceGUID,
Type: t.Type,
Payload: t.Payload,
Status: t.Status,
ErrorMsg: t.ErrorMsg,
Result: t.Result,
CreatedAt: t.CreatedAt,
StartedAt: t.StartedAt,
FinishedAt: t.FinishedAt,
}
}
// Create a new task (server/user -> device)
type CreateTaskDto struct {
Type models.DeviceTaskType `json:"type" binding:"required,oneof=start_stream stop_stream start_recording stop_recording update_config set_deep_sleep"`
// Pass raw JSON string as payload (e.g. {"sleepTimeout":5,"jitterMs":50,"recordingDurationSec":60})
// Keep it string to let device/server evolve freely.
Payload string `json:"payload"`
}
// Device polls: single next task
type NextTaskResponseDto struct {
HasTask bool `json:"hasTask"`
Task *TaskDto `json:"task,omitempty"`
}
// Device posts result
type TaskResultDto struct {
TaskID uint `json:"taskId" binding:"required"`
// success=true => Finished, success=false => Error
Success bool `json:"success"`
Result string `json:"result"` // raw JSON result from device
ErrorMsg string `json:"error"` // device-side reason if !Success
}