GraphQL API and utilities for the rpdata project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.1 KiB

  1. package postgres
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "git.aiterp.net/rpdata/api/database/postgres/psqlcore"
  7. "git.aiterp.net/rpdata/api/models"
  8. )
  9. type tagRepository struct {
  10. db *sql.DB
  11. }
  12. func (r *tagRepository) Find(ctx context.Context, kind models.TagKind, name string) (*models.Tag, error) {
  13. tag, err := psqlcore.New(r.db).SelectTagsByTag(ctx, fmt.Sprintf("%s:%s", kind, nmae))
  14. if err != nil {
  15. return nil, err
  16. }
  17. return &models.Tag{Kind: models.TagKind(tag.Kind), Name: tag.Name}, nil
  18. }
  19. func (r *tagRepository) List(ctx context.Context, filter models.TagFilter) ([]*models.Tag, error) {
  20. var tags []string
  21. var err error
  22. if filter.Kind != nil {
  23. tags, err = psqlcore.New(r.db).SelectDistinctTagsByKind(ctx, string(*filter.Kind))
  24. } else {
  25. tags, err = psqlcore.New(r.db).SelectDistinctTags(ctx)
  26. }
  27. if err != nil {
  28. return nil, err
  29. }
  30. return models.DecodeTagArray(tags)
  31. }
  32. func modelsTagsFromDataTags(tags []psqlcore.CommonTag) []*models.Tag {
  33. results := make([]*models.Tag, len(tags))
  34. for i, tag := range tags {
  35. results[i] = &models.Tag{Kind: models.TagKind(tag.Kind), Name: tag.Name}
  36. }
  37. return results
  38. }