|
4 | 4 | "github.com/Mangatsu/server/internal/config"
|
5 | 5 | "github.com/Mangatsu/server/pkg/model"
|
6 | 6 | "github.com/doug-martin/goqu/v9"
|
| 7 | + "github.com/doug-martin/goqu/v9/exec" |
7 | 8 | log "github.com/sirupsen/logrus"
|
| 9 | + "time" |
8 | 10 | )
|
9 | 11 |
|
10 | 12 | func StorePaths(givenLibraries []config.Library) error {
|
@@ -41,19 +43,101 @@ func GetOnlyLibraries() ([]model.Library, error) {
|
41 | 43 | return libraries, err
|
42 | 44 | }
|
43 | 45 |
|
| 46 | +type LibraryRow struct { |
| 47 | + ID int32 `db:"id"` |
| 48 | + Path string `db:"path"` |
| 49 | + Layout string `db:"layout"` |
| 50 | + UUID string `db:"uuid"` |
| 51 | + LibraryID int32 `db:"library_id"` |
| 52 | + ArchivePath string `db:"archive_path"` |
| 53 | + Title string `db:"title"` |
| 54 | + TitleNative *string `db:"title_native"` |
| 55 | + TitleTranslated *string `db:"title_translated"` |
| 56 | + Category *string `db:"category"` |
| 57 | + Series *string `db:"series"` |
| 58 | + Released *string `db:"released"` |
| 59 | + Language *string `db:"language"` |
| 60 | + Translated *bool `db:"translated"` |
| 61 | + Nsfw bool `db:"nsfw"` |
| 62 | + Hidden bool `db:"hidden"` |
| 63 | + ImageCount *int32 `db:"image_count"` |
| 64 | + ArchiveSize *int32 `db:"archive_size"` |
| 65 | + ArchiveHash *string `db:"archive_hash"` |
| 66 | + Thumbnail *string `db:"thumbnail"` |
| 67 | + CreatedAt time.Time `db:"created_at"` |
| 68 | + UpdatedAt time.Time `db:"updated_at"` |
| 69 | +} |
| 70 | + |
44 | 71 | func GetLibraries() ([]model.CombinedLibrary, error) {
|
45 |
| - var libraries []model.CombinedLibrary |
46 |
| - err := database.QB(). |
| 72 | + scanner, err := database.QB(). |
47 | 73 | From("library").
|
48 |
| - LeftJoin( |
| 74 | + Join( |
49 | 75 | goqu.T("gallery"),
|
50 |
| - goqu.On(goqu.Ex{ |
51 |
| - "gallery.id": goqu.I("library.id"), |
52 |
| - }), |
| 76 | + goqu.On(goqu.I("gallery.library_id").Eq(goqu.I("library.id"))), |
53 | 77 | ).
|
54 |
| - ScanStructs(&libraries) |
| 78 | + Executor(). |
| 79 | + Scanner() |
55 | 80 |
|
56 |
| - return libraries, err |
| 81 | + if err != nil { |
| 82 | + log.Error(err) |
| 83 | + return nil, err |
| 84 | + } |
| 85 | + |
| 86 | + defer func(scanner exec.Scanner) { |
| 87 | + if err := scanner.Close(); err != nil { |
| 88 | + log.Error(err) |
| 89 | + } |
| 90 | + }(scanner) |
| 91 | + |
| 92 | + librariesMap := make(map[int32]model.CombinedLibrary) |
| 93 | + for scanner.Next() { |
| 94 | + lr := LibraryRow{} |
| 95 | + if err = scanner.ScanStruct(&lr); err != nil { |
| 96 | + log.Error(err) |
| 97 | + return nil, err |
| 98 | + } |
| 99 | + |
| 100 | + var gallery = model.Gallery{UUID: lr.UUID, |
| 101 | + Title: lr.Title, |
| 102 | + TitleNative: lr.TitleNative, |
| 103 | + TitleTranslated: lr.TitleTranslated, |
| 104 | + Category: lr.Category, |
| 105 | + Series: lr.Series, |
| 106 | + Released: lr.Released, |
| 107 | + Language: lr.Language, |
| 108 | + Translated: lr.Translated, |
| 109 | + Nsfw: lr.Nsfw, |
| 110 | + Hidden: lr.Hidden, |
| 111 | + ImageCount: lr.ImageCount, |
| 112 | + ArchiveSize: lr.ArchiveSize, |
| 113 | + ArchiveHash: lr.ArchiveHash, |
| 114 | + Thumbnail: lr.Thumbnail, |
| 115 | + CreatedAt: lr.CreatedAt, |
| 116 | + UpdatedAt: lr.UpdatedAt, |
| 117 | + } |
| 118 | + |
| 119 | + value, ok := librariesMap[lr.ID] |
| 120 | + if ok { |
| 121 | + value.Galleries = append(value.Galleries, gallery) |
| 122 | + librariesMap[lr.ID] = value |
| 123 | + } else { |
| 124 | + librariesMap[lr.ID] = model.CombinedLibrary{ |
| 125 | + Library: model.Library{ |
| 126 | + ID: lr.ID, |
| 127 | + Path: lr.Path, |
| 128 | + Layout: lr.Layout, |
| 129 | + }, |
| 130 | + Galleries: []model.Gallery{gallery}, |
| 131 | + } |
| 132 | + } |
| 133 | + } |
| 134 | + |
| 135 | + librariesSlice := make([]model.CombinedLibrary, 0, len(librariesMap)) |
| 136 | + for _, val := range librariesMap { |
| 137 | + librariesSlice = append(librariesSlice, val) |
| 138 | + } |
| 139 | + |
| 140 | + return librariesSlice, nil |
57 | 141 | }
|
58 | 142 |
|
59 | 143 | // getLibrary returns the library from the database based on the ID or path.
|
|
0 commit comments