lens @ 1ae70dbd9124675d4a510954619b01edd5f1f6c3

ref: Move away other repositories

Finish moving all repositories to a repository package. This should
reduce the amount of packages.
  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,