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  }