package api import ( "fmt" "net/http" "slices" "strconv" "strings" "gitea.konchin.com/go2025/backend/middlewares" "gitea.konchin.com/go2025/backend/tracing" "github.com/uptrace/bunrouter" "go.uber.org/zap" ) type getImagesOutputImage struct { Id int64 `json:"id"` Extension string `json:"extension"` Uploader string `json:"uploadedUserId"` UploadTS int64 `json:"uploadedAt"` AliasesIds []int64 `json:"aliasesIds"` } // GetImages // // @param images query []int64 false "Image Ids" attribute(optional) // @param aliases query []int64 false "Alias Ids" attribute(optional) // @success 200 {object} []getImagesOutputImage // @failure 400 // @failure 401 // @router /api/images [get] func (self *Handlers) GetImages( w http.ResponseWriter, req bunrouter.Request, ) error { ctx := req.Context() rmf := func(s string) bool { return len(s) == 0 } rawReqImages := strings.Split(req.URL.Query().Get("images"), ",") rawReqImages = slices.DeleteFunc(rawReqImages, rmf) rawReqAliases := strings.Split(req.URL.Query().Get("aliases"), ",") rawReqAliases = slices.DeleteFunc(rawReqAliases, rmf) if (len(rawReqImages) == 0 && len(rawReqAliases) == 0) || (len(rawReqImages) > 0 && len(rawReqAliases) > 0) { tracing.Logger.Ctx(ctx). Debug("rawReq", zap.String("rawReqImages", fmt.Sprintf("%+v", rawReqImages)), zap.String("rawReqAlias", fmt.Sprintf("%+v", rawReqAliases))) return middlewares.HTTPError{ StatusCode: http.StatusBadRequest, Message: "images and aliases should exist exactly one", } } var reqImages, reqAliases []int64 for _, img := range rawReqImages { imgId, err := strconv.ParseInt(img, 10, 64) if err != nil { return middlewares.HTTPError{ StatusCode: http.StatusBadRequest, Message: "failed to parse image ids", } } reqImages = append(reqImages, imgId) } for _, ali := range rawReqAliases { aliId, err := strconv.ParseInt(ali, 10, 64) if err != nil { return middlewares.HTTPError{ StatusCode: http.StatusBadRequest, Message: "failed to parse alias ids", } } reqAliases = append(reqAliases, aliId) } images, err := self.db.GetImages(ctx, reqImages, reqAliases) if err != nil { return middlewares.HTTPError{ StatusCode: http.StatusInternalServerError, Message: "failed to get images", OriginError: err, } } var output []getImagesOutputImage for _, img := range images { var aliases []int64 for _, alias := range img.Aliases { aliases = append(aliases, alias.Id) } output = append(output, getImagesOutputImage{ Id: img.Id, Extension: img.Extension, Uploader: img.Uploader, UploadTS: img.UploadTS.Unix(), AliasesIds: aliases, }) } return bunrouter.JSON(w, output) }