diff --git a/internal/database/filter.go b/internal/database/filter.go index 9bfdeb8..b6047ad 100644 --- a/internal/database/filter.go +++ b/internal/database/filter.go @@ -58,7 +58,7 @@ func (r *FilterRepo) FindByID(ctx context.Context, filterID int) (*domain.Filter //r.db.lock.RLock() //defer r.db.lock.RUnlock() - row := r.db.handler.QueryRowContext(ctx, "SELECT id, enabled, name, min_size, max_size, delay, match_releases, except_releases, use_regex, match_release_groups, except_release_groups, scene, freeleech, freeleech_percent, shows, seasons, episodes, resolutions, codecs, sources, containers, match_hdr, except_hdr, years, artists, albums, release_types_match, formats, quality, media, log_score, has_log, has_cue, perfect_flac, match_categories, except_categories, match_uploaders, except_uploaders, tags, except_tags, created_at, updated_at FROM filter WHERE id = ?", filterID) + row := r.db.handler.QueryRowContext(ctx, "SELECT id, enabled, name, min_size, max_size, delay, priority, match_releases, except_releases, use_regex, match_release_groups, except_release_groups, scene, freeleech, freeleech_percent, shows, seasons, episodes, resolutions, codecs, sources, containers, match_hdr, except_hdr, years, artists, albums, release_types_match, formats, quality, media, log_score, has_log, has_cue, perfect_flac, match_categories, except_categories, match_uploaders, except_uploaders, tags, except_tags, created_at, updated_at FROM filter WHERE id = ?", filterID) if err := row.Err(); err != nil { return nil, err } @@ -68,7 +68,7 @@ func (r *FilterRepo) FindByID(ctx context.Context, filterID int) (*domain.Filter var useRegex, scene, freeleech, hasLog, hasCue, perfectFlac sql.NullBool var delay, logScore sql.NullInt32 - if err := row.Scan(&f.ID, &f.Enabled, &f.Name, &minSize, &maxSize, &delay, &matchReleases, &exceptReleases, &useRegex, &matchReleaseGroups, &exceptReleaseGroups, &scene, &freeleech, &freeleechPercent, &shows, &seasons, &episodes, pq.Array(&f.Resolutions), pq.Array(&f.Codecs), pq.Array(&f.Sources), pq.Array(&f.Containers), pq.Array(&f.MatchHDR), pq.Array(&f.ExceptHDR), &years, &artists, &albums, pq.Array(&f.MatchReleaseTypes), pq.Array(&f.Formats), pq.Array(&f.Quality), pq.Array(&f.Media), &logScore, &hasLog, &hasCue, &perfectFlac, &matchCategories, &exceptCategories, &matchUploaders, &exceptUploaders, &tags, &exceptTags, &f.CreatedAt, &f.UpdatedAt); err != nil { + if err := row.Scan(&f.ID, &f.Enabled, &f.Name, &minSize, &maxSize, &delay, &f.Priority, &matchReleases, &exceptReleases, &useRegex, &matchReleaseGroups, &exceptReleaseGroups, &scene, &freeleech, &freeleechPercent, &shows, &seasons, &episodes, pq.Array(&f.Resolutions), pq.Array(&f.Codecs), pq.Array(&f.Sources), pq.Array(&f.Containers), pq.Array(&f.MatchHDR), pq.Array(&f.ExceptHDR), &years, &artists, &albums, pq.Array(&f.MatchReleaseTypes), pq.Array(&f.Formats), pq.Array(&f.Quality), pq.Array(&f.Media), &logScore, &hasLog, &hasCue, &perfectFlac, &matchCategories, &exceptCategories, &matchUploaders, &exceptUploaders, &tags, &exceptTags, &f.CreatedAt, &f.UpdatedAt); err != nil { log.Error().Stack().Err(err).Msgf("filter: %v : error scanning data to struct", filterID) return nil, err } @@ -117,6 +117,7 @@ func (r *FilterRepo) FindByIndexerIdentifier(indexer string) ([]domain.Filter, e f.min_size, f.max_size, f.delay, + f.priority, f.match_releases, f.except_releases, f.use_regex, @@ -157,7 +158,8 @@ func (r *FilterRepo) FindByIndexerIdentifier(indexer string) ([]domain.Filter, e JOIN filter_indexer fi on f.id = fi.filter_id JOIN indexer i on i.id = fi.indexer_id WHERE i.identifier = ? - AND f.enabled = true`, indexer) + AND f.enabled = true + ORDER BY f.priority DESC`, indexer) if err != nil { log.Error().Stack().Err(err).Msg("error querying filter row") return nil, err @@ -173,7 +175,7 @@ func (r *FilterRepo) FindByIndexerIdentifier(indexer string) ([]domain.Filter, e var useRegex, scene, freeleech, hasLog, hasCue, perfectFlac sql.NullBool var delay, logScore sql.NullInt32 - if err := rows.Scan(&f.ID, &f.Enabled, &f.Name, &minSize, &maxSize, &delay, &matchReleases, &exceptReleases, &useRegex, &matchReleaseGroups, &exceptReleaseGroups, &scene, &freeleech, &freeleechPercent, &shows, &seasons, &episodes, pq.Array(&f.Resolutions), pq.Array(&f.Codecs), pq.Array(&f.Sources), pq.Array(&f.Containers), pq.Array(&f.MatchHDR), pq.Array(&f.ExceptHDR), &years, &artists, &albums, pq.Array(&f.MatchReleaseTypes), pq.Array(&f.Formats), pq.Array(&f.Quality), pq.Array(&f.Media), &logScore, &hasLog, &hasCue, &perfectFlac, &matchCategories, &exceptCategories, &matchUploaders, &exceptUploaders, &tags, &exceptTags, &f.CreatedAt, &f.UpdatedAt); err != nil { + if err := rows.Scan(&f.ID, &f.Enabled, &f.Name, &minSize, &maxSize, &delay, &f.Priority, &matchReleases, &exceptReleases, &useRegex, &matchReleaseGroups, &exceptReleaseGroups, &scene, &freeleech, &freeleechPercent, &shows, &seasons, &episodes, pq.Array(&f.Resolutions), pq.Array(&f.Codecs), pq.Array(&f.Sources), pq.Array(&f.Containers), pq.Array(&f.MatchHDR), pq.Array(&f.ExceptHDR), &years, &artists, &albums, pq.Array(&f.MatchReleaseTypes), pq.Array(&f.Formats), pq.Array(&f.Quality), pq.Array(&f.Media), &logScore, &hasLog, &hasCue, &perfectFlac, &matchCategories, &exceptCategories, &matchUploaders, &exceptUploaders, &tags, &exceptTags, &f.CreatedAt, &f.UpdatedAt); err != nil { log.Error().Stack().Err(err).Msg("error scanning data to struct") return nil, err } @@ -231,6 +233,7 @@ func (r *FilterRepo) Store(filter domain.Filter) (*domain.Filter, error) { min_size, max_size, delay, + priority, match_releases, except_releases, use_regex, @@ -266,12 +269,13 @@ func (r *FilterRepo) Store(filter domain.Filter) (*domain.Filter, error) { has_cue, perfect_flac ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) ON CONFLICT DO NOTHING`, + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40) ON CONFLICT DO NOTHING`, filter.Name, filter.Enabled, filter.MinSize, filter.MaxSize, filter.Delay, + filter.Priority, filter.MatchReleases, filter.ExceptReleases, filter.UseRegex, @@ -333,6 +337,7 @@ func (r *FilterRepo) Update(ctx context.Context, filter domain.Filter) (*domain. min_size = ?, max_size = ?, delay = ?, + priority = ?, match_releases = ?, except_releases = ?, use_regex = ?, @@ -374,6 +379,7 @@ func (r *FilterRepo) Update(ctx context.Context, filter domain.Filter) (*domain. filter.MinSize, filter.MaxSize, filter.Delay, + filter.Priority, filter.MatchReleases, filter.ExceptReleases, filter.UseRegex, diff --git a/internal/database/migrate.go b/internal/database/migrate.go index 64295f6..37b2714 100644 --- a/internal/database/migrate.go +++ b/internal/database/migrate.go @@ -68,6 +68,7 @@ CREATE TABLE filter min_size TEXT, max_size TEXT, delay INTEGER, + priority INTEGER DEFAULT 0 NOT NULL, match_releases TEXT, except_releases TEXT, use_regex BOOLEAN, @@ -340,6 +341,10 @@ var migrations = []string{ ALTER TABLE "filter" ADD COLUMN media TEXT [] DEFAULT '{}'; `, + ` + ALTER TABLE "filter" + ADD COLUMN priority INTEGER DEFAULT 0 NOT NULL; + `, } func (db *SqliteDB) migrate() error { diff --git a/internal/domain/filter.go b/internal/domain/filter.go index b066a04..50b811c 100644 --- a/internal/domain/filter.go +++ b/internal/domain/filter.go @@ -32,6 +32,7 @@ type Filter struct { MinSize string `json:"min_size"` MaxSize string `json:"max_size"` Delay int `json:"delay"` + Priority int32 `json:"priority"` MatchReleases string `json:"match_releases"` ExceptReleases string `json:"except_releases"` UseRegex bool `json:"use_regex"` diff --git a/web/src/screens/filters/details.tsx b/web/src/screens/filters/details.tsx index 44a38ba..cad3354 100644 --- a/web/src/screens/filters/details.tsx +++ b/web/src/screens/filters/details.tsx @@ -245,6 +245,7 @@ export default function FilterDetails() { min_size: filter.min_size, max_size: filter.max_size, delay: filter.delay, + priority: filter.priority, shows: filter.shows, years: filter.years, resolutions: filter.resolutions || [], @@ -359,6 +360,7 @@ function General() { + diff --git a/web/src/types/Filter.d.ts b/web/src/types/Filter.d.ts index fa4286b..99a46fc 100644 --- a/web/src/types/Filter.d.ts +++ b/web/src/types/Filter.d.ts @@ -7,6 +7,7 @@ interface Filter { min_size: string; max_size: string; delay: number; + priority: number; match_releases: string; except_releases: string; use_regex: boolean;