1diff --git a/cmd/server/main.go b/cmd/server/main.go
2index 4942ac31216717bc8c568944e409c69bb93ea521..76cf0c087be14c81404492af02b7c4875d4dd1b9 100644
3--- a/cmd/server/main.go
4+++ b/cmd/server/main.go
5@@ -19,8 +19,8 @@
6 "git.sr.ht/~gabrielgio/img"
7 "git.sr.ht/~gabrielgio/img/pkg/components/auth"
8 "git.sr.ht/~gabrielgio/img/pkg/components/filesystem"
9- "git.sr.ht/~gabrielgio/img/pkg/components/media"
10 "git.sr.ht/~gabrielgio/img/pkg/database/localfs"
11+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
12 "git.sr.ht/~gabrielgio/img/pkg/database/sql"
13 "git.sr.ht/~gabrielgio/img/pkg/ext"
14 "git.sr.ht/~gabrielgio/img/pkg/view"
15@@ -125,7 +125,7 @@ fileScanner,
16 scheduler,
17 logrus.WithField("context", "file scanner"),
18 )
19- exifWorker = worker.NewWorkerFromBatchProcessor[*media.Media](
20+ exifWorker = worker.NewWorkerFromBatchProcessor[*repository.Media](
21 exifScanner,
22 scheduler,
23 logrus.WithField("context", "exif scanner"),
24diff --git a/go.mod b/go.mod
25index abd738844b4ff89064efa2533e7dd67cb6fffac9..519070cc76069ed724e608d7b5492c233dcdc9d7 100644
26--- a/go.mod
27+++ b/go.mod
28@@ -6,7 +6,6 @@ require (
29 github.com/barasher/go-exiftool v1.10.0
30 github.com/fasthttp/router v1.4.19
31 github.com/google/go-cmp v0.5.9
32- github.com/samber/lo v1.38.1
33 github.com/sirupsen/logrus v1.9.2
34 github.com/spf13/pflag v1.0.5
35 github.com/valyala/fasthttp v1.47.0
36@@ -30,7 +29,6 @@ github.com/klauspost/compress v1.16.5 // indirect
37 github.com/mattn/go-sqlite3 v1.14.16 // indirect
38 github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
39 github.com/valyala/bytebufferpool v1.0.0 // indirect
40- golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
41 golang.org/x/mod v0.10.0 // indirect
42 golang.org/x/sys v0.8.0 // indirect
43 golang.org/x/text v0.9.0 // indirect
44diff --git a/go.sum b/go.sum
45index ac79e0eafbc1fed60c5403a124dddc4329c49d58..b90e74709efdc06de5807a334e87b48862661cfc 100644
46--- a/go.sum
47+++ b/go.sum
48@@ -34,8 +34,6 @@ github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
49 github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
50 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
51 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
52-github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
53-github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
54 github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk=
55 github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g=
56 github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
57@@ -52,8 +50,6 @@ github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c=
58 github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
59 golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
60 golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
61-golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
62-golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
63 golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
64 golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
65 golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
66diff --git a/pkg/components/filesystem/controller.go b/pkg/components/filesystem/controller.go
67index 6b478a5ef6de92b9df254199dfc4958c65840765..6c613a3c0c1e1cd8ba152e855deeb12e8fb2b1a3 100644
68--- a/pkg/components/filesystem/controller.go
69+++ b/pkg/components/filesystem/controller.go
70@@ -5,11 +5,13 @@ "io/fs"
71 "net/url"
72 "path"
73 "strings"
74+
75+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
76 )
77
78 type (
79 Controller struct {
80- repository Repository
81+ repository repository.FileSystemRepository
82 }
83
84 DirectoryParam struct {
85@@ -28,7 +30,7 @@ Files []*FileParam
86 }
87 )
88
89-func NewController(repository Repository) *Controller {
90+func NewController(repository repository.FileSystemRepository) *Controller {
91 return &Controller{
92 repository: repository,
93 }
94diff --git a/pkg/components/filesystem/model.go b/pkg/database/repository/filesystem.go
95rename from pkg/components/filesystem/model.go
96rename to pkg/database/repository/filesystem.go
97index 2caed8248292390e1d3c827855c977c5d7a38a89..f553b3f64c1d76e0b49f12795ec7b5f6ab977964 100644
98--- a/pkg/components/filesystem/model.go
99+++ b/pkg/database/repository/filesystem.go
100@@ -1,9 +1,9 @@
101-package filesystem
102+package repository
103
104 import "io/fs"
105
106 type (
107- Repository interface {
108+ FileSystemRepository interface {
109 List(path string) ([]fs.FileInfo, error)
110 Stat(path string) (fs.FileInfo, error)
111 }
112diff --git a/pkg/components/media/model.go b/pkg/database/repository/media.go
113rename from pkg/components/media/model.go
114rename to pkg/database/repository/media.go
115index 1962a23e2716418d3919b66d253cdbbfc46d2de3..2e94ff3f45dd4fa6188e3ab389f68bed6e62b925 100644
116--- a/pkg/components/media/model.go
117+++ b/pkg/database/repository/media.go
118@@ -1,4 +1,4 @@
119-package media
120+package repository
121
122 import (
123 "context"
124@@ -46,7 +46,7 @@ PathHash string
125 MIMEType string
126 }
127
128- Repository interface {
129+ MediaRepository interface {
130 Create(context.Context, *CreateMedia) error
131 Exists(context.Context, string) (bool, error)
132 List(context.Context, *Pagination) ([]*Media, error)
133diff --git a/pkg/components/settings/model.go b/pkg/database/repository/settings.go
134rename from pkg/components/settings/model.go
135rename to pkg/database/repository/settings.go
136index da07f2ce68d20584217269a31346b19ff4e7edb6..6ed1eb61e66b2ddbc5f9ddcafc13a568e232e348 100644
137--- a/pkg/components/settings/model.go
138+++ b/pkg/database/repository/settings.go
139@@ -1,4 +1,4 @@
140-package settings
141+package repository
142
143 import "context"
144
145@@ -8,7 +8,7 @@ ShowMode bool
146 ShowOwner bool
147 }
148
149- Repository interface {
150+ SettingsRepository interface {
151 Save(context.Context, *Settings) error
152 Load(context.Context) (*Settings, error)
153 }
154diff --git a/pkg/database/sql/media.go b/pkg/database/sql/media.go
155index 3446f792eabcf77cdae30b8f97500f15ddbd0900..27f8cf0f642ad82c9b6bec7480d0d31ada616ab8 100644
156--- a/pkg/database/sql/media.go
157+++ b/pkg/database/sql/media.go
158@@ -6,7 +6,7 @@ "time"
159
160 "gorm.io/gorm"
161
162- "git.sr.ht/~gabrielgio/img/pkg/components/media"
163+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
164 "git.sr.ht/~gabrielgio/img/pkg/list"
165 )
166
167@@ -46,10 +46,10 @@ db *gorm.DB
168 }
169 )
170
171-var _ media.Repository = &MediaRepository{}
172+var _ repository.MediaRepository = &MediaRepository{}
173
174-func (self *Media) ToModel() *media.Media {
175- return &media.Media{
176+func (self *Media) ToModel() *repository.Media {
177+ return &repository.Media{
178 ID: self.ID,
179 Path: self.Path,
180 PathHash: self.PathHash,
181@@ -58,8 +58,8 @@ MIMEType: self.MIMEType,
182 }
183 }
184
185-func (m *MediaEXIF) ToModel() *media.MediaEXIF {
186- return &media.MediaEXIF{
187+func (m *MediaEXIF) ToModel() *repository.MediaEXIF {
188+ return &repository.MediaEXIF{
189 Height: m.Height,
190 Width: m.Width,
191 Description: m.Description,
192@@ -85,7 +85,7 @@ db: db,
193 }
194 }
195
196-func (self *MediaRepository) Create(ctx context.Context, createMedia *media.CreateMedia) error {
197+func (self *MediaRepository) Create(ctx context.Context, createMedia *repository.CreateMedia) error {
198 media := &Media{
199 Name: createMedia.Name,
200 Path: createMedia.Path,
201@@ -119,7 +119,7 @@
202 return exists, nil
203 }
204
205-func (self *MediaRepository) List(ctx context.Context, pagination *media.Pagination) ([]*media.Media, error) {
206+func (self *MediaRepository) List(ctx context.Context, pagination *repository.Pagination) ([]*repository.Media, error) {
207 medias := make([]*Media, 0)
208 result := self.db.
209 WithContext(ctx).
210@@ -133,14 +133,14 @@ if result.Error != nil {
211 return nil, result.Error
212 }
213
214- m := list.Map(medias, func(s *Media) *media.Media {
215+ m := list.Map(medias, func(s *Media) *repository.Media {
216 return s.ToModel()
217 })
218
219 return m, nil
220 }
221
222-func (self *MediaRepository) Get(ctx context.Context, pathHash string) (*media.Media, error) {
223+func (self *MediaRepository) Get(ctx context.Context, pathHash string) (*repository.Media, error) {
224 m := &Media{}
225 result := self.db.
226 WithContext(ctx).
227@@ -173,7 +173,7 @@
228 return path, nil
229 }
230
231-func (m *MediaRepository) GetEXIF(ctx context.Context, mediaID uint) (*media.MediaEXIF, error) {
232+func (m *MediaRepository) GetEXIF(ctx context.Context, mediaID uint) (*repository.MediaEXIF, error) {
233 exif := &MediaEXIF{}
234 result := m.db.
235 WithContext(ctx).
236@@ -189,7 +189,7 @@
237 return exif.ToModel(), nil
238 }
239
240-func (s *MediaRepository) CreateEXIF(ctx context.Context, id uint, info *media.MediaEXIF) error {
241+func (s *MediaRepository) CreateEXIF(ctx context.Context, id uint, info *repository.MediaEXIF) error {
242 media := &MediaEXIF{
243 MediaID: id,
244 Width: info.Width,
245@@ -220,7 +220,7 @@
246 return nil
247 }
248
249-func (r *MediaRepository) GetEmptyEXIF(ctx context.Context, pagination *media.Pagination) ([]*media.Media, error) {
250+func (r *MediaRepository) GetEmptyEXIF(ctx context.Context, pagination *repository.Pagination) ([]*repository.Media, error) {
251 medias := make([]*Media, 0)
252 result := r.db.
253 WithContext(ctx).
254@@ -236,7 +236,7 @@ if result.Error != nil {
255 return nil, result.Error
256 }
257
258- m := list.Map(medias, func(s *Media) *media.Media {
259+ m := list.Map(medias, func(s *Media) *repository.Media {
260 return s.ToModel()
261 })
262
263diff --git a/pkg/database/sql/settings.go b/pkg/database/sql/settings.go
264index 7ad718b826874b93c4f4491874f3098fd9032080..4e738789296ad2129eb5aa504461c312070f2fca 100644
265--- a/pkg/database/sql/settings.go
266+++ b/pkg/database/sql/settings.go
267@@ -5,7 +5,7 @@ "context"
268
269 "gorm.io/gorm"
270
271- "git.sr.ht/~gabrielgio/img/pkg/components/settings"
272+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
273 )
274
275 type (
276@@ -20,7 +20,7 @@ db *gorm.DB
277 }
278 )
279
280-var _ settings.Repository = &SettingsRepository{}
281+var _ repository.SettingsRepository = &SettingsRepository{}
282
283 func NewSettingsRespository(db *gorm.DB) *SettingsRepository {
284 return &SettingsRepository{
285@@ -41,7 +41,7 @@
286 return s, nil
287 }
288
289-func (self *SettingsRepository) Save(ctx context.Context, toSaveSettings *settings.Settings) error {
290+func (self *SettingsRepository) Save(ctx context.Context, toSaveSettings *repository.Settings) error {
291 db := self.db.WithContext(ctx)
292
293 s, err := self.ensureSettings(ctx)
294@@ -56,13 +56,13 @@ result := db.Save(s)
295 return result.Error
296 }
297
298-func (self *SettingsRepository) Load(ctx context.Context) (*settings.Settings, error) {
299+func (self *SettingsRepository) Load(ctx context.Context) (*repository.Settings, error) {
300 s, err := self.ensureSettings(ctx)
301 if err != nil {
302 return nil, err
303 }
304
305- return &settings.Settings{
306+ return &repository.Settings{
307 ShowMode: s.ShowMode,
308 ShowOwner: s.ShowOwner,
309 }, nil
310diff --git a/pkg/database/sql/user_test.go b/pkg/database/sql/user_test.go
311index f0d89addaf626140630730ce1d27ee65780a0c1f..01f6729bc00c576b97cc6bdf2fa45154e0b4eab8 100644
312--- a/pkg/database/sql/user_test.go
313+++ b/pkg/database/sql/user_test.go
314@@ -12,7 +12,7 @@ "gorm.io/driver/sqlite"
315 "gorm.io/gorm"
316 "gorm.io/gorm/logger"
317
318- "git.sr.ht/~gabrielgio/img/pkg/components/user"
319+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
320 )
321
322 func setup(t *testing.T) (*gorm.DB, func()) {
323@@ -46,9 +46,9 @@ t.Parallel()
324 db, tearDown := setup(t)
325 defer tearDown()
326
327- repository := NewUserRepository(db)
328+ userRepository := NewUserRepository(db)
329
330- id, err := repository.Create(context.Background(), &user.CreateUser{
331+ id, err := userRepository.Create(context.Background(), &repository.CreateUser{
332 Username: "new_username",
333 Name: "new_name",
334 })
335@@ -56,11 +56,11 @@ if err != nil {
336 t.Fatalf("Error creating: %s", err.Error())
337 }
338
339- got, err := repository.Get(context.Background(), id)
340+ got, err := userRepository.Get(context.Background(), id)
341 if err != nil {
342 t.Fatalf("Error getting: %s", err.Error())
343 }
344- want := &user.User{
345+ want := &repository.User{
346 ID: id,
347 Username: "new_username",
348 Name: "new_name",
349@@ -76,9 +76,9 @@ t.Parallel()
350 db, tearDown := setup(t)
351 defer tearDown()
352
353- repository := NewUserRepository(db)
354+ userRepository := NewUserRepository(db)
355
356- id, err := repository.Create(context.Background(), &user.CreateUser{
357+ id, err := userRepository.Create(context.Background(), &repository.CreateUser{
358 Username: "username",
359 Name: "name",
360 })
361@@ -86,7 +86,7 @@ if err != nil {
362 t.Fatalf("Error creating user: %s", err.Error())
363 }
364
365- err = repository.Update(context.Background(), id, &user.UpdateUser{
366+ err = userRepository.Update(context.Background(), id, &repository.UpdateUser{
367 Username: "new_username",
368 Name: "new_name",
369 })
370@@ -94,11 +94,11 @@ if err != nil {
371 t.Fatalf("Error update user: %s", err.Error())
372 }
373
374- got, err := repository.Get(context.Background(), 1)
375+ got, err := userRepository.Get(context.Background(), 1)
376 if err != nil {
377 t.Fatalf("Error getting user: %s", err.Error())
378 }
379- want := &user.User{
380+ want := &repository.User{
381 ID: id,
382 Username: "new_username",
383 Name: "new_name",
384diff --git a/pkg/fileop/exif.go b/pkg/fileop/exif.go
385index 79716ebe76df1d97bb717872cde6fe56095b7ffb..49cd0ce96fef9742223fef099298ae62a13b9ea9 100644
386--- a/pkg/fileop/exif.go
387+++ b/pkg/fileop/exif.go
388@@ -6,17 +6,17 @@ "time"
389
390 "github.com/barasher/go-exiftool"
391
392- "git.sr.ht/~gabrielgio/img/pkg/components/media"
393+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
394 )
395
396-func ReadExif(path string) (*media.MediaEXIF, error) {
397+func ReadExif(path string) (*repository.MediaEXIF, error) {
398 et, err := exiftool.NewExiftool()
399 if err != nil {
400 return nil, err
401 }
402 defer et.Close()
403
404- newExif := &media.MediaEXIF{}
405+ newExif := &repository.MediaEXIF{}
406 fileInfo := et.ExtractMetadata(path)[0]
407
408 // Get description
409@@ -159,7 +159,7 @@ }
410
411 // sanitizeEXIF removes any EXIF float64 field that is not a real number (+Inf,
412 // -Inf or Nan)
413-func sanitizeEXIF(exif *media.MediaEXIF) {
414+func sanitizeEXIF(exif *repository.MediaEXIF) {
415 if exif.Exposure != nil && !isFloatReal(*exif.Exposure) {
416 exif.Exposure = nil
417 }
418diff --git a/pkg/view/filesystem.go b/pkg/view/filesystem.go
419index f10d788971d34bebac0b6655b51752885fa51e48..d2ebff41d46fb2a9cb581d29ee31bca4af814216 100644
420--- a/pkg/view/filesystem.go
421+++ b/pkg/view/filesystem.go
422@@ -5,14 +5,14 @@ "github.com/valyala/fasthttp"
423
424 "git.sr.ht/~gabrielgio/img"
425 "git.sr.ht/~gabrielgio/img/pkg/components/filesystem"
426- "git.sr.ht/~gabrielgio/img/pkg/components/settings"
427+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
428 "git.sr.ht/~gabrielgio/img/pkg/ext"
429 )
430
431 type (
432 FileSystemView struct {
433 controller filesystem.Controller
434- settings settings.Repository
435+ settings repository.SettingsRepository
436 }
437 FilePage struct {
438 Page *filesystem.Page
439@@ -23,7 +23,7 @@ )
440
441 func NewFileSystemView(
442 controller filesystem.Controller,
443- settingsRepository settings.Repository,
444+ settingsRepository repository.SettingsRepository,
445 ) *FileSystemView {
446 return &FileSystemView{
447 controller: controller,
448diff --git a/pkg/view/media.go b/pkg/view/media.go
449index 66e302013f11217f069046868bc5c707b9a87cf9..ce9e27278588eb37a883deda70eaa4b6aa4edc9c 100644
450--- a/pkg/view/media.go
451+++ b/pkg/view/media.go
452@@ -6,22 +6,22 @@
453 "github.com/valyala/fasthttp"
454
455 "git.sr.ht/~gabrielgio/img"
456- "git.sr.ht/~gabrielgio/img/pkg/components/media"
457+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
458 "git.sr.ht/~gabrielgio/img/pkg/ext"
459 )
460
461 type (
462 MediaView struct {
463- mediaRepository media.Repository
464+ mediaRepository repository.MediaRepository
465 }
466
467 Page struct {
468- Medias []*media.Media
469- Next *media.Pagination
470+ Medias []*repository.Media
471+ Next *repository.Pagination
472 }
473 )
474
475-func getPagination(ctx *fasthttp.RequestCtx) *media.Pagination {
476+func getPagination(ctx *fasthttp.RequestCtx) *repository.Pagination {
477 var (
478 size int
479 page int
480@@ -45,13 +45,13 @@ } else {
481 page = p
482 }
483
484- return &media.Pagination{
485+ return &repository.Pagination{
486 Page: page,
487 Size: size,
488 }
489 }
490
491-func NewMediaView(mediaRepository media.Repository) *MediaView {
492+func NewMediaView(mediaRepository repository.MediaRepository) *MediaView {
493 return &MediaView{
494 mediaRepository: mediaRepository,
495 }
496@@ -68,7 +68,7 @@ err = img.Render(ctx, "media.html", &img.HTMLView[*Page]{
497 Title: "Media",
498 Data: &Page{
499 Medias: medias,
500- Next: &media.Pagination{
501+ Next: &repository.Pagination{
502 Size: p.Size,
503 Page: p.Page + 1,
504 },
505diff --git a/pkg/view/settings.go b/pkg/view/settings.go
506index 954cc986086e6ba0d9429c32c800d9c91fbe6b90..14f4e49fbaa75c5258c946507e6163b8ff1b02f8 100644
507--- a/pkg/view/settings.go
508+++ b/pkg/view/settings.go
509@@ -4,7 +4,6 @@ import (
510 "github.com/valyala/fasthttp"
511
512 "git.sr.ht/~gabrielgio/img"
513- "git.sr.ht/~gabrielgio/img/pkg/components/settings"
514 "git.sr.ht/~gabrielgio/img/pkg/database/repository"
515 "git.sr.ht/~gabrielgio/img/pkg/ext"
516 )
517@@ -12,18 +11,18 @@
518 type (
519 SettingsView struct {
520 // there is not need to create a controller for this
521- settingsRepository settings.Repository
522+ settingsRepository repository.SettingsRepository
523 userRepository repository.UserRepository
524 }
525
526 SettingsPage struct {
527- Settings *settings.Settings
528+ Settings *repository.Settings
529 Users []*repository.User
530 }
531 )
532
533 func NewSettingsView(
534- settingsRespository settings.Repository,
535+ settingsRespository repository.SettingsRepository,
536 userRepository repository.UserRepository,
537 ) *SettingsView {
538 return &SettingsView{
539@@ -58,7 +57,7 @@ showMode = string(ctx.FormValue("showMode")) == "on"
540 showOwner = string(ctx.FormValue("showOwner")) == "on"
541 )
542
543- err := self.settingsRepository.Save(ctx, &settings.Settings{
544+ err := self.settingsRepository.Save(ctx, &repository.Settings{
545 ShowMode: showMode,
546 ShowOwner: showOwner,
547 })
548diff --git a/pkg/worker/exif_scanner.go b/pkg/worker/exif_scanner.go
549index 91eed1270268368fa3f43216e087648984296d15..97790a083761672e3d03680d8e32be2eec902368 100644
550--- a/pkg/worker/exif_scanner.go
551+++ b/pkg/worker/exif_scanner.go
552@@ -3,27 +3,27 @@
553 import (
554 "context"
555
556- "git.sr.ht/~gabrielgio/img/pkg/components/media"
557 "git.sr.ht/~gabrielgio/img/pkg/coroutine"
558+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
559 "git.sr.ht/~gabrielgio/img/pkg/fileop"
560 )
561
562 type (
563 EXIFScanner struct {
564- repository media.Repository
565+ repository repository.MediaRepository
566 }
567 )
568
569-var _ BatchProcessor[*media.Media] = &EXIFScanner{}
570+var _ BatchProcessor[*repository.Media] = &EXIFScanner{}
571
572-func NewEXIFScanner(repository media.Repository) *EXIFScanner {
573+func NewEXIFScanner(repository repository.MediaRepository) *EXIFScanner {
574 return &EXIFScanner{
575 repository: repository,
576 }
577 }
578
579-func (e *EXIFScanner) Query(ctx context.Context) ([]*media.Media, error) {
580- medias, err := e.repository.GetEmptyEXIF(ctx, &media.Pagination{
581+func (e *EXIFScanner) Query(ctx context.Context) ([]*repository.Media, error) {
582+ medias, err := e.repository.GetEmptyEXIF(ctx, &repository.Pagination{
583 Page: 0,
584 Size: 100,
585 })
586@@ -34,8 +34,8 @@
587 return medias, nil
588 }
589
590-func (e *EXIFScanner) Process(ctx context.Context, m *media.Media) error {
591- exif, err := coroutine.WrapProcess(ctx, func() (*media.MediaEXIF, error) { return fileop.ReadExif(m.Path) })
592+func (e *EXIFScanner) Process(ctx context.Context, m *repository.Media) error {
593+ exif, err := coroutine.WrapProcess(ctx, func() (*repository.MediaEXIF, error) { return fileop.ReadExif(m.Path) })
594 if err != nil {
595 return err
596 }
597diff --git a/pkg/worker/file_scanner.go b/pkg/worker/file_scanner.go
598index a51f60bbc11afea841fce4787e37e11b54992812..aa79035b77c5fb9724a149bbb0e29450583f0baa 100644
599--- a/pkg/worker/file_scanner.go
600+++ b/pkg/worker/file_scanner.go
601@@ -9,19 +9,19 @@ "mime"
602 "path/filepath"
603 "strings"
604
605- "git.sr.ht/~gabrielgio/img/pkg/components/media"
606+ "git.sr.ht/~gabrielgio/img/pkg/database/repository"
607 )
608
609 type (
610 FileScanner struct {
611 root string
612- repository media.Repository
613+ repository repository.MediaRepository
614 }
615 )
616
617 var _ ChanProcessor[string] = &FileScanner{}
618
619-func NewFileScanner(root string, repository media.Repository) *FileScanner {
620+func NewFileScanner(root string, repository repository.MediaRepository) *FileScanner {
621 return &FileScanner{
622 root: root,
623 repository: repository,
624@@ -77,7 +77,7 @@ if exists {
625 return nil
626 }
627
628- return f.repository.Create(ctx, &media.CreateMedia{
629+ return f.repository.Create(ctx, &repository.CreateMedia{
630 Name: name,
631 Path: path,
632 PathHash: str,