tag.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package store
  2. import (
  3. "context"
  4. "database/sql"
  5. "strings"
  6. )
  7. type Tag struct {
  8. Name string
  9. CreatorID int32
  10. }
  11. type FindTag struct {
  12. CreatorID int32
  13. }
  14. type DeleteTag struct {
  15. Name string
  16. CreatorID int32
  17. }
  18. func (s *Store) UpsertTag(ctx context.Context, upsert *Tag) (*Tag, error) {
  19. stmt := `
  20. INSERT INTO tag (
  21. name, creator_id
  22. )
  23. VALUES (?, ?)
  24. ON CONFLICT(name, creator_id) DO UPDATE
  25. SET
  26. name = EXCLUDED.name
  27. `
  28. if _, err := s.db.ExecContext(ctx, stmt, upsert.Name, upsert.CreatorID); err != nil {
  29. return nil, err
  30. }
  31. tag := upsert
  32. return tag, nil
  33. }
  34. func (s *Store) ListTags(ctx context.Context, find *FindTag) ([]*Tag, error) {
  35. where, args := []string{"creator_id = ?"}, []any{find.CreatorID}
  36. query := `
  37. SELECT
  38. name,
  39. creator_id
  40. FROM tag
  41. WHERE ` + strings.Join(where, " AND ") + `
  42. ORDER BY name ASC
  43. `
  44. rows, err := s.db.QueryContext(ctx, query, args...)
  45. if err != nil {
  46. return nil, err
  47. }
  48. defer rows.Close()
  49. list := []*Tag{}
  50. for rows.Next() {
  51. tag := &Tag{}
  52. if err := rows.Scan(
  53. &tag.Name,
  54. &tag.CreatorID,
  55. ); err != nil {
  56. return nil, err
  57. }
  58. list = append(list, tag)
  59. }
  60. if err := rows.Err(); err != nil {
  61. return nil, err
  62. }
  63. return list, nil
  64. }
  65. func (s *Store) DeleteTag(ctx context.Context, delete *DeleteTag) error {
  66. where, args := []string{"name = ?", "creator_id = ?"}, []any{delete.Name, delete.CreatorID}
  67. stmt := `DELETE FROM tag WHERE ` + strings.Join(where, " AND ")
  68. result, err := s.db.ExecContext(ctx, stmt, args...)
  69. if err != nil {
  70. return err
  71. }
  72. if _, err = result.RowsAffected(); err != nil {
  73. return err
  74. }
  75. return nil
  76. }
  77. func vacuumTag(ctx context.Context, tx *sql.Tx) error {
  78. stmt := `
  79. DELETE FROM
  80. tag
  81. WHERE
  82. creator_id NOT IN (
  83. SELECT
  84. id
  85. FROM
  86. user
  87. )`
  88. _, err := tx.ExecContext(ctx, stmt)
  89. if err != nil {
  90. return err
  91. }
  92. return nil
  93. }