From 536a49fe1c094b9c67bed199c0d9bca4c820588c Mon Sep 17 00:00:00 2001 From: John Costa Date: Tue, 11 Mar 2025 22:47:28 +0000 Subject: [PATCH] feat(tags): correctly inserting new tags and adding them to images --- backend/main.go | 20 ++++++++++++--- backend/models/image.go | 54 ++++++++++++++++++++++++++++++++++++----- backend/models/tags.go | 48 ++++++++++++++++++++++++++++++++---- 3 files changed, 108 insertions(+), 14 deletions(-) diff --git a/backend/main.go b/backend/main.go index 56584eb..5f28569 100644 --- a/backend/main.go +++ b/backend/main.go @@ -107,9 +107,23 @@ func main() { log.Println("Finished processing image " + imageId) log.Printf("Image attributes: %+v\n", imageInfo) - models.SaveImageTags(savedImage.ID.String(), imageInfo.Tags) - models.SaveImageLinks(savedImage.ID.String(), imageInfo.Links) - models.SaveImageTexts(savedImage.ID.String(), imageInfo.Text) + _, err = models.SaveImageTags(savedImage.ID.String(), imageInfo.Tags) + if err != nil { + log.Println("1") + log.Println(err) + } + + _, err = models.SaveImageLinks(savedImage.ID.String(), imageInfo.Links) + if err != nil { + log.Println("2") + log.Println(err) + } + + _, err = models.SaveImageTexts(savedImage.ID.String(), imageInfo.Text) + if err != nil { + log.Println("3") + log.Println(err) + } }() } } diff --git a/backend/models/image.go b/backend/models/image.go index b3f0208..d0d5f61 100644 --- a/backend/models/image.go +++ b/backend/models/image.go @@ -42,6 +42,25 @@ func removeImageToProcess(imageId string) error { return err } +func getUserId(imageId uuid.UUID) (uuid.UUID, error) { + stmt := UserImages.SELECT(UserImages.UserID).WHERE(UserImages.ID.EQ(UUID(imageId))) + + fmt.Println(stmt.DebugSql()) + + userIds := make([]string, 0) + + err := stmt.Query(db, &userIds) + if err != nil { + return uuid.Nil, err + } + + if len(userIds) != 1 { + return uuid.Nil, errors.New("expect only one user id per image id") + } + + return uuid.Parse(userIds[0]) +} + func SaveImage(imageId uuid.UUID) (model.UserImages, error) { imageToProcess, err := GetImageToProcess(imageId.String()) if err != nil { @@ -145,16 +164,39 @@ func GetUserImages(userId string) ([]UserImagesWithInfo, error) { func SaveImageTags(imageId string, tags []string) ([]model.ImageTags, error) { id := uuid.MustParse(imageId) - stmt := ImageTags.INSERT(ImageTags.ImageID, ImageTags.Tag) + userId, err := getUserId(id) + if err != nil { + return []model.ImageTags{}, err + } - for _, t := range tags { - stmt = stmt.VALUES(id, t) + err = CreateTags(userId, tags) + if err != nil { + return []model.ImageTags{}, err + } + + userTagsExpression := make([]Expression, 0) + for _, tag := range tags { + userTagsExpression = append(userTagsExpression, String(tag)) + } + + userTags := make([]model.UserTags, 0) + + getTagsStmt := UserTags.SELECT(UserTags.ID, UserTags.Tag).WHERE(UserTags.Tag.IN(userTagsExpression...)) + err = getTagsStmt.Query(db, &userTags) + if err != nil { + return []model.ImageTags{}, err + } + + stmt := ImageTags.INSERT(ImageTags.ImageID, ImageTags.TagID) + + for _, t := range userTags { + stmt = stmt.VALUES(id, t.ID) } stmt.RETURNING(ImageTags.AllColumns) - imageTags := []model.ImageTags{} - err := stmt.Query(db, &imageTags) + imageTags := make([]model.ImageTags, 0) + err = stmt.Query(db, &imageTags) return imageTags, err } @@ -162,7 +204,7 @@ func SaveImageTags(imageId string, tags []string) ([]model.ImageTags, error) { func SaveImageLinks(imageId string, links []string) ([]model.ImageLinks, error) { id := uuid.MustParse(imageId) - stmt := ImageTags.INSERT(ImageLinks.ImageID, ImageLinks.Link) + stmt := ImageLinks.INSERT(ImageLinks.ImageID, ImageLinks.Link) for _, t := range links { stmt = stmt.VALUES(id, t) diff --git a/backend/models/tags.go b/backend/models/tags.go index a511384..e61b977 100644 --- a/backend/models/tags.go +++ b/backend/models/tags.go @@ -1,6 +1,7 @@ package models import ( + "fmt" "screenmark/screenmark/.gen/haystack/haystack/model" . "screenmark/screenmark/.gen/haystack/haystack/table" @@ -20,20 +21,53 @@ import ( // | -- -- // | ---- IQ ---- func getNonExistantTags(userId uuid.UUID, tags []string) ([]string, error) { - stmt, err := db.Prepare(`WITH given_tags - AS (SELECT given_tags.tag FROM (VALUES ('a'), ('b'), ('c')) AS given_tags (tag)) + values := "" + counter := 1 + // big big SQL injection problem here? + for counter = 1; counter <= len(tags); counter++ { + values += fmt.Sprintf("($%d),", counter) + } + values = values[0 : len(values)-1] + + /* + WITH given_tags + AS (SELECT given_tags.tag FROM (VALUES ('c')) AS given_tags (tag)), + this_user_tags as ( + SELECT id, tag + FROM haystack.user_tags + where user_tags.user_id = 'fcc22dbb-7792-4595-be8e-d0439e13990a' + ) + select given_tags.tag from given_tags + LEFT OUTER JOIN this_user_tags ON this_user_tags.tag = given_tags.tag + where this_user_tags.tag is null; + */ + + withStuff := fmt.Sprintf(`WITH given_tags + AS (SELECT given_tags.tag FROM (VALUES `+values+`) AS given_tags (tag)), + this_user_tags AS + (SELECT id, tag FROM haystack.user_tags WHERE user_tags.user_id = $%d) SELECT given_tags.tag FROM given_tags - LEFT OUTER JOIN haystack.user_tags ON haystack.user_tags.tag = a.tag - where user_tags.tag is null;`) + LEFT OUTER JOIN haystack.user_tags ON haystack.user_tags.tag = given_tags.tag + where user_tags.tag is null`, counter) + + stmt, err := db.Prepare(withStuff) + fmt.Println(withStuff) if err != nil { + fmt.Println("failing to prepare stmt") return []string{}, err } defer stmt.Close() - rows, err := stmt.Query() + args := make([]any, counter) + for i, v := range tags { + args[i] = v + } + args[counter-1] = userId.String() + + rows, err := stmt.Query(args...) if err != nil { return []string{}, err } @@ -56,6 +90,10 @@ func CreateTags(userId uuid.UUID, tags []string) error { return err } + if len(tagsToInsert) == 0 { + return nil + } + stmt := UserTags.INSERT(UserTags.UserID, UserTags.Tag) for _, tag := range tagsToInsert {