package handlers import ( "fmt" "net/http" "strconv" "git.linuxforward.com/byop/byop-engine/dbstore" "git.linuxforward.com/byop/byop-engine/models" "git.linuxforward.com/byop/byop-engine/services" "github.com/gin-gonic/gin" ) type PreviewHandler struct { previewService services.PreviewService store *dbstore.SQLiteStore } func NewPreviewHandler(previewService services.PreviewService, store *dbstore.SQLiteStore) *PreviewHandler { return &PreviewHandler{ previewService: previewService, store: store, } } // CreatePreview handles the creation of a new preview session. func (h *PreviewHandler) CreatePreview(c *gin.Context) { ctx := c.Request.Context() var requestBody struct { AppId int `json:"app_id" binding:"required"` } if err := c.ShouldBindJSON(&requestBody); err != nil { validationErrors := map[string]string{"request_body": fmt.Sprintf("Invalid request body: %v", err)} appErr := models.NewErrValidation("invalid_preview_request", validationErrors, err) models.RespondWithError(c, appErr) return } preview, err := h.previewService.CreatePreview(ctx, requestBody.AppId) if err != nil { models.RespondWithError(c, err) return } c.JSON(http.StatusOK, gin.H{"preview": preview}) } // GetPreview retrieves details of a specific preview session. func (h *PreviewHandler) GetPreview(c *gin.Context) { ctx := c.Request.Context() previewIdStr := c.Param("preview_id") if previewIdStr == "" { appErr := models.NewErrValidation("missing_preview_id", map[string]string{"preview_id": "Preview ID is required in URL path"}, nil) models.RespondWithError(c, appErr) return } previewIdInt, err := strconv.Atoi(previewIdStr) if err != nil { appErr := models.NewErrValidation("invalid_preview_id_format", map[string]string{"preview_id": "Invalid preview ID format, must be an integer"}, err) models.RespondWithError(c, appErr) return } preview, err := h.store.GetPreviewByID(ctx, previewIdInt) if err != nil { models.RespondWithError(c, err) return } c.JSON(http.StatusOK, gin.H{"preview": preview}) }