github.com/litesolutions/justifay-api@v1.0.0-2.0.20220707114139-46f28a909481/model/tag.go (about) 1 package model 2 3 import ( 4 "github.com/go-pg/pg" 5 6 //uuidpkg "github.com/resonatecoop/user-api/pkg/uuid" 7 8 uuid "github.com/google/uuid" 9 10 pbUser "github.com/litesolutions/justifay-api/proto/user" 11 ) 12 13 // Tag provides basic tag structure 14 type Tag struct { 15 ID uuid.UUID `bun:"type:uuid,default:uuid_generate_v4()"` 16 Type string `bun:",notnull"` 17 Name string `bun:",notnull"` 18 } 19 20 // SearchTags find a tag by query string on Name 21 func SearchTags(query string, tagType string, db *pg.DB) ([]*Tag, error) { 22 var tags []*Tag 23 24 err := db.Model(&tags). 25 ColumnExpr("tag.id"). 26 Where("to_tsvector('english'::regconfig, COALESCE(name, '')) @@ (plainto_tsquery('english'::regconfig, ?)) = true", query). 27 Where("type = ?", tagType). 28 Select() 29 if err != nil { 30 return nil, err 31 } 32 return tags, nil 33 } 34 35 // GetTags given tag UUID returns a Tag 36 func GetTags(tagIds []uuid.UUID, db *pg.DB) ([]*pbUser.Tag, error) { 37 tags := make([]*pbUser.Tag, len(tagIds)) 38 if len(tags) > 0 { 39 var t []Tag 40 err := db.Model(&t). 41 Where("id in (?)", pg.In(tagIds)). 42 Select() 43 if err != nil { 44 return nil, err 45 } 46 for i, tag := range t { 47 tags[i] = &pbUser.Tag{Id: tag.ID.String(), Type: tag.Type, Name: tag.Name} 48 } 49 } 50 return tags, nil 51 } 52 53 // GetTagIDs accepts a slice tags 54 func GetTagIDs(t []*pbUser.Tag, db *pg.Tx) ([]uuid.UUID, error) { 55 tags := make([]*Tag, len(t)) 56 tagIDs := make([]uuid.UUID, len(t)) 57 for i, tag := range t { 58 if tag.Id == "" { // new tag to create and add 59 tags[i] = &Tag{Type: tag.Type, Name: tag.Name} 60 _, pgerr := db.Model(tags[i]). 61 Where("type = ?", tags[i].Type). 62 Where("lower(name) = lower(?)", tags[i].Name). 63 Returning("*"). 64 SelectOrInsert() 65 if pgerr != nil { 66 return nil, pgerr 67 } 68 tagIDs[i] = tags[i].ID 69 tag.Id = tags[i].ID.String() 70 } else { 71 tagID, err := uuid.Parse(tag.Id) 72 if err != nil { 73 return nil, err 74 } 75 tagIDs[i] = tagID 76 } 77 } 78 return tagIDs, nil 79 }