tag.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package repositories
  2. import (
  3. "context"
  4. "database/sql"
  5. sq "github.com/Masterminds/squirrel"
  6. "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
  7. )
  8. const tagTableName = "tag"
  9. type TagRepository struct {
  10. db *sql.DB
  11. }
  12. func InitTagRepository(db *sql.DB) *TagRepository {
  13. return &TagRepository{db: db}
  14. }
  15. func (t TagRepository) GetAllUsed(ctx context.Context) ([]models.Tag, error) {
  16. var res []models.Tag
  17. query := "SELECT t.id, t.url, t.tag " +
  18. "FROM " + articleTagTableName + " at, " + tagTableName + " t " +
  19. "WHERE t.id = at.tag_id AND at.article_id IN " +
  20. "(SELECT id FROM " + articleTableName + " " + "WHERE is_active = true) " +
  21. "GROUP BY t.id"
  22. rows, err := t.db.QueryContext(ctx, query)
  23. if err != nil {
  24. return nil, err
  25. }
  26. defer rows.Close()
  27. for rows.Next() {
  28. row := models.Tag{}
  29. err = rows.Scan(&row.ID, &row.URL, &row.Tag)
  30. if err != nil {
  31. return nil, err
  32. }
  33. res = append(res, row)
  34. }
  35. if err = rows.Err(); err != nil {
  36. return nil, err
  37. }
  38. return res, nil
  39. }
  40. func (t TagRepository) GetByURL(ctx context.Context, url string) (*models.Tag, error) {
  41. query, args, err := sq.Select("id", "url", "tag").
  42. From(tagTableName).
  43. PlaceholderFormat(sq.Dollar).
  44. Where(sq.Eq{"url": url}).
  45. Limit(1).
  46. ToSql()
  47. if err != nil {
  48. return nil, err
  49. }
  50. var res models.Tag
  51. err = t.db.QueryRowContext(ctx, query, args...).
  52. Scan(&res.ID, &res.URL, &res.Tag)
  53. if err != nil {
  54. return nil, err
  55. }
  56. return &res, nil
  57. }
  58. func (t TagRepository) GetByID(ctx context.Context, id int) (*models.Tag, error) {
  59. query, args, err := sq.Select("id", "url", "tag").
  60. From(tagTableName).
  61. PlaceholderFormat(sq.Dollar).
  62. Where(sq.Eq{"id": id}).
  63. Limit(1).
  64. ToSql()
  65. if err != nil {
  66. return nil, err
  67. }
  68. var res models.Tag
  69. err = t.db.QueryRowContext(ctx, query, args...).
  70. Scan(&res.ID, &res.URL, &res.Tag)
  71. if err != nil {
  72. return nil, err
  73. }
  74. return &res, nil
  75. }
  76. func (t TagRepository) GetAll(ctx context.Context) ([]models.Tag, error) {
  77. var res []models.Tag
  78. query, args, err := sq.Select("id", "url", "tag").
  79. From(tagTableName).
  80. ToSql()
  81. if err != nil {
  82. return nil, err
  83. }
  84. rows, err := t.db.QueryContext(ctx, query, args...)
  85. if err != nil {
  86. return nil, err
  87. }
  88. defer rows.Close()
  89. for rows.Next() {
  90. row := models.Tag{}
  91. err = rows.Scan(&row.ID, &row.URL, &row.Tag)
  92. if err != nil {
  93. return nil, err
  94. }
  95. res = append(res, row)
  96. }
  97. if err = rows.Err(); err != nil {
  98. return nil, err
  99. }
  100. return res, nil
  101. }
  102. func (t TagRepository) GetByArticleID(ctx context.Context, id int) ([]models.Tag, error) {
  103. var res []models.Tag
  104. query := "SELECT t.id, t.url, t.tag " +
  105. "FROM " + articleTagTableName + " at, " + tagTableName + " t " +
  106. "WHERE t.id = at.tag_id AND at.article_id = $1"
  107. rows, err := t.db.QueryContext(ctx, query, id)
  108. if err != nil {
  109. return nil, err
  110. }
  111. defer rows.Close()
  112. for rows.Next() {
  113. row := models.Tag{}
  114. err = rows.Scan(&row.ID, &row.URL, &row.Tag)
  115. if err != nil {
  116. return nil, err
  117. }
  118. res = append(res, row)
  119. }
  120. if err = rows.Err(); err != nil {
  121. return nil, err
  122. }
  123. return res, nil
  124. }
  125. func (t TagRepository) IsUsed(ctx context.Context, id int) (bool, error) {
  126. query, args, err := sq.Select("COUNT(tag_id)").
  127. From(articleTagTableName).
  128. PlaceholderFormat(sq.Dollar).
  129. Where(sq.Eq{"tag_id": id}).
  130. ToSql()
  131. if err != nil {
  132. return false, err
  133. }
  134. var count int
  135. err = t.db.QueryRowContext(ctx, query, args...).Scan(&count)
  136. if err != nil {
  137. return false, err
  138. }
  139. return count > 0, nil
  140. }
  141. func (t TagRepository) Add(ctx context.Context, req models.Tag) error {
  142. query, args, err := sq.Insert(tagTableName).
  143. PlaceholderFormat(sq.Dollar).
  144. Columns("tag", "url").
  145. Values(req.Tag, req.URL).
  146. ToSql()
  147. if err != nil {
  148. return err
  149. }
  150. _, err = t.db.ExecContext(ctx, query, args...)
  151. return err
  152. }
  153. func (t TagRepository) Update(ctx context.Context, req models.Tag) error {
  154. query, args, err := sq.Update(tagTableName).
  155. PlaceholderFormat(sq.Dollar).
  156. Set("tag", req.Tag).
  157. Set("url", req.URL).
  158. Where(sq.Eq{"id": req.ID}).
  159. ToSql()
  160. if err != nil {
  161. return err
  162. }
  163. _, err = t.db.ExecContext(ctx, query, args...)
  164. return err
  165. }
  166. func (t TagRepository) Delete(ctx context.Context, id int) error {
  167. query, args, err := sq.Delete(tagTableName).
  168. PlaceholderFormat(sq.Dollar).
  169. Where(sq.Eq{"id": id}).
  170. ToSql()
  171. if err != nil {
  172. return err
  173. }
  174. _, err = t.db.ExecContext(ctx, query, args...)
  175. return err
  176. }