package repository import ( "database/sql" "vidarchive/internal/models" ) type PresetRepository struct { db *sql.DB } func NewPresetRepository(db *sql.DB) *PresetRepository { return &PresetRepository{db: db} } func (r *PresetRepository) Create(p *models.Preset) error { result, err := r.db.Exec( `INSERT INTO presets (name, description, is_default, format_mode, format, quality, custom_format, extract_audio, audio_format, embed_subs, sub_langs, embed_thumbnail, embed_metadata, write_info_json, output_template, custom_flags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, p.Name, p.Description, boolToInt(p.IsDefault), p.FormatMode, p.Format, p.Quality, p.CustomFormat, boolToInt(p.ExtractAudio), p.AudioFormat, boolToInt(p.EmbedSubs), p.SubLangs, boolToInt(p.EmbedThumbnail), boolToInt(p.EmbedMetadata), boolToInt(p.WriteInfoJSON), p.OutputTemplate, p.CustomFlags, ) if err != nil { return err } p.ID, _ = result.LastInsertId() return nil } func (r *PresetRepository) GetByID(id int64) (*models.Preset, error) { row := r.db.QueryRow( `SELECT id, name, description, is_default, format_mode, format, quality, custom_format, extract_audio, audio_format, embed_subs, sub_langs, embed_thumbnail, embed_metadata, write_info_json, output_template, custom_flags, created_at FROM presets WHERE id = ?`, id, ) return scanPreset(row) } func (r *PresetRepository) GetAll() ([]*models.Preset, error) { rows, err := r.db.Query( `SELECT id, name, description, is_default, format_mode, format, quality, custom_format, extract_audio, audio_format, embed_subs, sub_langs, embed_thumbnail, embed_metadata, write_info_json, output_template, custom_flags, created_at FROM presets ORDER BY name`, ) if err != nil { return nil, err } defer rows.Close() var presets []*models.Preset for rows.Next() { p, err := scanPreset(rows) if err != nil { return nil, err } presets = append(presets, p) } return presets, rows.Err() } func (r *PresetRepository) GetDefault() (*models.Preset, error) { row := r.db.QueryRow( `SELECT id, name, description, is_default, format_mode, format, quality, custom_format, extract_audio, audio_format, embed_subs, sub_langs, embed_thumbnail, embed_metadata, write_info_json, output_template, custom_flags, created_at FROM presets WHERE is_default = 1 LIMIT 1`, ) return scanPreset(row) } func (r *PresetRepository) Update(p *models.Preset) error { _, err := r.db.Exec( `UPDATE presets SET name=?, description=?, is_default=?, format_mode=?, format=?, quality=?, custom_format=?, extract_audio=?, audio_format=?, embed_subs=?, sub_langs=?, embed_thumbnail=?, embed_metadata=?, write_info_json=?, output_template=?, custom_flags=? WHERE id=?`, p.Name, p.Description, boolToInt(p.IsDefault), p.FormatMode, p.Format, p.Quality, p.CustomFormat, boolToInt(p.ExtractAudio), p.AudioFormat, boolToInt(p.EmbedSubs), p.SubLangs, boolToInt(p.EmbedThumbnail), boolToInt(p.EmbedMetadata), boolToInt(p.WriteInfoJSON), p.OutputTemplate, p.CustomFlags, p.ID, ) return err } func (r *PresetRepository) Delete(id int64) error { _, err := r.db.Exec(`DELETE FROM presets WHERE id = ?`, id) return err } func (r *PresetRepository) ClearDefault() error { _, err := r.db.Exec(`UPDATE presets SET is_default = 0`) return err } func scanPreset(row interface{ Scan(...interface{}) error }) (*models.Preset, error) { var p models.Preset var isDefault, extractAudio, embedSubs, embedThumbnail, embedMetadata, writeInfoJSON int var description, formatMode, format, quality, customFormat, audioFormat, subLangs, outputTemplate, customFlags sql.NullString err := row.Scan( &p.ID, &p.Name, &description, &isDefault, &formatMode, &format, &quality, &customFormat, &extractAudio, &audioFormat, &embedSubs, &subLangs, &embedThumbnail, &embedMetadata, &writeInfoJSON, &outputTemplate, &customFlags, &p.CreatedAt, ) if err != nil { return nil, err } p.Description = description.String p.FormatMode = formatMode.String p.Format = format.String p.Quality = quality.String p.CustomFormat = customFormat.String p.AudioFormat = audioFormat.String p.SubLangs = subLangs.String p.OutputTemplate = outputTemplate.String p.CustomFlags = customFlags.String p.IsDefault = isDefault == 1 p.ExtractAudio = extractAudio == 1 p.EmbedSubs = embedSubs == 1 p.EmbedThumbnail = embedThumbnail == 1 p.EmbedMetadata = embedMetadata == 1 p.WriteInfoJSON = writeInfoJSON == 1 return &p, nil } func boolToInt(b bool) int { if b { return 1 } return 0 }