package actions import ( "bytes" "errors" "fmt" "io" "log" "regexp" "strconv" "tomatentum.net/svg-templater/internal/database" "tomatentum.net/svg-templater/pkg/svg" ) const FILEFORMAT string = "%s-%d" func AddPage(id string, svgbuf []byte) (svg.TemplatePage, error) { exists, err := database.Exists(id) if err != nil { return svg.TemplatePage{}, err } if !exists { return svg.TemplatePage{}, errors.New("Template does not exist.") } data := svg.TemplatePage{TemplateId: id} populateKeys(&data, svgbuf) page, err := database.InsertSVGPage(&data) data.Page = page if err != nil { return svg.TemplatePage{}, err } _, err = svg.Storage.Create(fmt.Sprintf(FILEFORMAT, id, page), bytes.NewReader(svgbuf)) if err != nil { return svg.TemplatePage{}, err } log.Println("Created SVG Template " + data.TemplateId + " Page " + strconv.Itoa(page)) return data, nil } func GetPage(id string, page int) ([]byte, error) { file, err := svg.Storage.Get(fmt.Sprintf(FILEFORMAT, id, page)) if err != nil { return nil, err } defer file.Close() return io.ReadAll(file) } func DeletePage(id string, page int) (bool, error) { if success, err := database.DeleteSVGPage(id, page); err != nil || !success { return success, err } if err := svg.Storage.Delete(fmt.Sprintf(FILEFORMAT, id, page)); err != nil { return false, err } log.Println("Deleted SVG Template " + id + " page " + strconv.Itoa(page)) return true, nil } func populateKeys(data *svg.TemplatePage, svgblob []byte) { regex := regexp.MustCompile(svg.KeyRegex) result := regex.FindAllSubmatch(svgblob, -1) templateKeys := make([]string, len(result)) for i, matches := range result { varname := matches[1] // first capture group templateKeys[i] = string(varname) } data.TemplateKeys = templateKeys log.Println("Found keys:\n", templateKeys) }