Files
tesseract/internal/template/http_handlers.go

221 lines
5.0 KiB
Go
Raw Normal View History

2024-11-12 00:31:10 +00:00
package template
import (
"database/sql"
"encoding/json"
"errors"
"github.com/labstack/echo/v4"
"io"
"net/http"
"tesseract/internal/service"
)
type createTemplateRequestBody struct {
Description string `json:"description"`
Content string `json:"content"`
Documentation string `json:"documentation"`
}
2024-11-29 23:52:19 +00:00
type postTemplateRequestBody struct {
2024-11-12 00:31:10 +00:00
Description *string `json:"description"`
Files []templateFile `json:"files"`
ImageTag *string `json:"imageTag"`
BuildArgs map[string]*string `json:"buildArgs"`
}
func fetchAllTemplates(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
templates, err := mgr.findAllTemplates(c.Request().Context())
2024-11-12 00:31:10 +00:00
if err != nil {
return err
}
return c.JSON(http.StatusOK, templates)
}
func fetchTemplate(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
template, err := mgr.findTemplate(c.Request().Context(), c.Param("templateName"))
2024-11-12 00:31:10 +00:00
if err != nil {
2024-11-29 23:52:19 +00:00
if errors.Is(err, errTemplateNotFound) {
2024-11-12 00:31:10 +00:00
return echo.NewHTTPError(http.StatusNotFound)
}
return err
}
2024-11-29 23:52:19 +00:00
return c.JSON(http.StatusOK, template)
2024-11-12 00:31:10 +00:00
}
func createOrUpdateTemplate(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
exists, err := mgr.hasTemplate(c.Request().Context(), c.Param("templateName"))
if err != nil {
return err
}
if !exists {
return createTemplate(c)
2024-11-12 00:31:10 +00:00
}
2024-11-29 23:52:19 +00:00
var body postTemplateRequestBody
err = json.NewDecoder(c.Request().Body).Decode(&body)
2024-11-12 00:31:10 +00:00
if err != nil {
return err
}
2024-11-29 23:52:19 +00:00
if body.ImageTag != nil || body.BuildArgs != nil {
return buildTemplate(c, body)
2024-11-12 00:31:10 +00:00
}
2024-11-29 23:52:19 +00:00
return updateTemplate(c, body)
2024-11-12 00:31:10 +00:00
}
func createTemplate(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
2024-11-12 00:31:10 +00:00
name := c.Param("templateName")
var body createTemplateRequestBody
err := json.NewDecoder(c.Request().Body).Decode(&body)
if err != nil {
return err
}
2024-11-29 23:52:19 +00:00
createdTemplate, err := mgr.createTemplate(c.Request().Context(), createTemplateOptions{
2024-11-12 00:31:10 +00:00
name: name,
description: body.Description,
})
if err != nil {
return err
}
return c.JSON(http.StatusOK, createdTemplate)
}
2024-11-29 23:52:19 +00:00
func updateTemplate(c echo.Context, body postTemplateRequestBody) error {
2024-11-12 00:31:10 +00:00
name := c.Param("templateName")
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
ctx := c.Request().Context()
2024-11-12 00:31:10 +00:00
2024-11-29 23:52:19 +00:00
updatedTemplate, err := mgr.updateTemplate(ctx, name, updateTemplateOptions{
description: *body.Description,
})
2024-11-12 00:31:10 +00:00
if err != nil {
2024-11-29 23:52:19 +00:00
if errors.Is(err, errTemplateNotFound) {
return echo.NewHTTPError(http.StatusNotFound)
}
2024-11-12 00:31:10 +00:00
return err
}
2024-11-29 23:52:19 +00:00
return c.JSON(http.StatusOK, &updatedTemplate)
}
2024-11-12 00:31:10 +00:00
2024-11-29 23:52:19 +00:00
func buildTemplate(c echo.Context, body postTemplateRequestBody) error {
mgr := templateManagerFrom(c)
name := c.Param("templateName")
ctx := c.Request().Context()
2024-11-12 00:31:10 +00:00
2024-11-29 23:52:19 +00:00
template, err := mgr.findTemplate(ctx, name)
2024-11-12 00:31:10 +00:00
if err != nil {
2024-11-29 23:52:19 +00:00
if errors.Is(err, errTemplateNotFound) {
2024-11-12 00:31:10 +00:00
return echo.NewHTTPError(http.StatusNotFound)
}
return err
}
2024-11-29 23:52:19 +00:00
outputChan, err := mgr.buildTemplate(ctx, template, buildTemplateOptions{
imageTag: *body.ImageTag,
buildArgs: body.BuildArgs,
})
if err != nil {
return err
2024-11-12 00:31:10 +00:00
}
2024-11-29 23:52:19 +00:00
w := c.Response()
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
2024-11-12 00:31:10 +00:00
2024-11-29 23:52:19 +00:00
for o := range outputChan {
switch o := o.(type) {
case error:
2024-11-12 00:31:10 +00:00
return err
2024-11-29 23:52:19 +00:00
case string:
if _, err = w.Write([]byte(o)); err != nil {
2024-11-12 00:31:10 +00:00
return err
}
2024-11-29 23:52:19 +00:00
w.Flush()
2024-11-12 00:31:10 +00:00
}
}
2024-11-29 23:52:19 +00:00
return nil
2024-11-12 00:31:10 +00:00
}
func deleteTemplate(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
name := c.Param("templateName")
2024-11-12 00:31:10 +00:00
2024-11-29 23:52:19 +00:00
err := mgr.deleteTemplate(c.Request().Context(), name)
2024-11-12 00:31:10 +00:00
if err != nil {
2024-11-29 23:52:19 +00:00
if errors.Is(err, errTemplateNotFound) {
2024-11-12 00:31:10 +00:00
return echo.NewHTTPError(http.StatusNotFound)
}
return err
}
return c.NoContent(http.StatusOK)
}
func fetchTemplateFile(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
2024-11-12 00:31:10 +00:00
templateName := c.Param("templateName")
filePath := c.Param("filePath")
2024-11-29 23:52:19 +00:00
file, err := mgr.findTemplateFile(c.Request().Context(), templateName, filePath)
2024-11-12 00:31:10 +00:00
if err != nil {
2024-11-29 23:52:19 +00:00
if errors.Is(err, errTemplateNotFound) || errors.Is(err, errTemplateFileNotFound) {
2024-11-12 00:31:10 +00:00
return echo.NewHTTPError(http.StatusNotFound)
}
return err
}
return c.Blob(http.StatusOK, "application/octet-stream", file.Content)
}
func updateTemplateFile(c echo.Context) error {
2024-11-29 23:52:19 +00:00
mgr := templateManagerFrom(c)
2024-11-12 00:31:10 +00:00
templateName := c.Param("templateName")
filePath := c.Param("filePath")
newContent, err := io.ReadAll(c.Request().Body)
if err != nil {
return err
}
2024-11-29 23:52:19 +00:00
err = mgr.updateTemplateFile(c.Request().Context(), templateName, filePath, newContent)
2024-11-12 00:31:10 +00:00
if err != nil {
2024-11-29 23:52:19 +00:00
if errors.Is(err, errTemplateNotFound) || errors.Is(err, errTemplateFileNotFound) {
2024-11-12 00:31:10 +00:00
return echo.NewHTTPError(http.StatusNotFound)
}
return err
}
return c.NoContent(http.StatusOK)
}
func fetchAllTemplateImages(c echo.Context) error {
db := service.Database(c)
2024-11-29 23:52:19 +00:00
var images []Image
2024-11-12 00:31:10 +00:00
err := db.NewSelect().Model(&images).Scan(c.Request().Context())
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
2024-11-29 23:52:19 +00:00
return c.JSON(http.StatusOK, make([]Image, 0))
2024-11-12 00:31:10 +00:00
}
return err
}
if len(images) == 0 {
2024-11-29 23:52:19 +00:00
return c.JSON(http.StatusOK, make([]Image, 0))
2024-11-12 00:31:10 +00:00
}
return c.JSON(http.StatusOK, images)
}