enclosure.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package storage // import "miniflux.app/storage"
  5. import (
  6. "database/sql"
  7. "fmt"
  8. "miniflux.app/model"
  9. )
  10. // GetEnclosures returns all attachments for the given entry.
  11. func (s *Storage) GetEnclosures(entryID int64) (model.EnclosureList, error) {
  12. query := `
  13. SELECT
  14. id,
  15. user_id,
  16. entry_id,
  17. url,
  18. size,
  19. mime_type
  20. FROM
  21. enclosures
  22. WHERE
  23. entry_id = $1
  24. ORDER BY id ASC
  25. `
  26. rows, err := s.db.Query(query, entryID)
  27. if err != nil {
  28. return nil, fmt.Errorf(`store: unable to fetch enclosures: %v`, err)
  29. }
  30. defer rows.Close()
  31. enclosures := make(model.EnclosureList, 0)
  32. for rows.Next() {
  33. var enclosure model.Enclosure
  34. err := rows.Scan(
  35. &enclosure.ID,
  36. &enclosure.UserID,
  37. &enclosure.EntryID,
  38. &enclosure.URL,
  39. &enclosure.Size,
  40. &enclosure.MimeType,
  41. )
  42. if err != nil {
  43. return nil, fmt.Errorf(`store: unable to fetch enclosure row: %v`, err)
  44. }
  45. enclosures = append(enclosures, &enclosure)
  46. }
  47. return enclosures, nil
  48. }
  49. func (s *Storage) createEnclosure(tx *sql.Tx, enclosure *model.Enclosure) error {
  50. if enclosure.URL == "" {
  51. return nil
  52. }
  53. query := `
  54. INSERT INTO enclosures
  55. (url, size, mime_type, entry_id, user_id)
  56. VALUES
  57. ($1, $2, $3, $4, $5)
  58. RETURNING
  59. id
  60. `
  61. err := tx.QueryRow(
  62. query,
  63. enclosure.URL,
  64. enclosure.Size,
  65. enclosure.MimeType,
  66. enclosure.EntryID,
  67. enclosure.UserID,
  68. ).Scan(&enclosure.ID)
  69. if err != nil {
  70. return fmt.Errorf(`store: unable to create enclosure %q: %v`, enclosure.URL, err)
  71. }
  72. return nil
  73. }
  74. func (s *Storage) updateEnclosures(tx *sql.Tx, userID, entryID int64, enclosures model.EnclosureList) error {
  75. // We delete all attachments in the transaction to keep only the ones visible in the feeds.
  76. if _, err := tx.Exec(`DELETE FROM enclosures WHERE user_id=$1 AND entry_id=$2`, userID, entryID); err != nil {
  77. return err
  78. }
  79. for _, enclosure := range enclosures {
  80. if err := s.createEnclosure(tx, enclosure); err != nil {
  81. return err
  82. }
  83. }
  84. return nil
  85. }