package sqlite import ( "context" "database/sql" "fmt" "ntech/internal/db" "ntech/internal/model" ) // PodsetnikRepo je SQLite implementacija PodsetnikRepository interfejsa type PodsetnikRepo struct { db *sql.DB } // NoviPodsetnikRepo kreira novi PodsetnikRepo func NoviPodsetnikRepo(db *sql.DB) *PodsetnikRepo { return &PodsetnikRepo{db: db} } // Lista vraća listu podsetnika sa opcionim filterom func (r *PodsetnikRepo) Lista(ctx context.Context, filter db.PodsetnikFilter) ([]model.Podsetnik, error) { upit := ` SELECT id, naslov, napomena, datum_podsecanja, zavrseno, tip, datum_unosa FROM podsetnici WHERE 1=1` if filter.SamoAktivni { upit += " AND zavrseno = 0" } upit += " ORDER BY datum_podsecanja ASC" redovi, err := r.db.QueryContext(ctx, upit) if err != nil { return nil, fmt.Errorf("ntech: PodsetnikRepo.Lista: %w", err) } defer redovi.Close() var rezultat []model.Podsetnik for redovi.Next() { var p model.Podsetnik var napomena sql.NullString var zavrseno int err := redovi.Scan( &p.ID, &p.Naslov, &napomena, &p.DatumPodsecanja, &zavrseno, &p.Tip, &p.DatumUnosa, ) if err != nil { return nil, fmt.Errorf("ntech: PodsetnikRepo.Lista: scan: %w", err) } p.Napomena = napomena.String p.Zavrseno = zavrseno == 1 rezultat = append(rezultat, p) } return rezultat, nil } // DohvatiID vraća jedan podsetnik po ID-u func (r *PodsetnikRepo) DohvatiID(ctx context.Context, id int64) (*model.Podsetnik, error) { var p model.Podsetnik var napomena sql.NullString var zavrseno int err := r.db.QueryRowContext(ctx, ` SELECT id, naslov, napomena, datum_podsecanja, zavrseno, tip, datum_unosa FROM podsetnici WHERE id = ?`, id).Scan( &p.ID, &p.Naslov, &napomena, &p.DatumPodsecanja, &zavrseno, &p.Tip, &p.DatumUnosa, ) if err != nil { return nil, fmt.Errorf("ntech: PodsetnikRepo.DohvatiID: %w", err) } p.Napomena = napomena.String p.Zavrseno = zavrseno == 1 return &p, nil } // Kreiraj dodaje novi podsetnik u bazu func (r *PodsetnikRepo) Kreiraj(ctx context.Context, p *model.Podsetnik) (int64, error) { rezultat, err := r.db.ExecContext(ctx, ` INSERT INTO podsetnici (naslov, napomena, datum_podsecanja, tip) VALUES (?, ?, ?, ?)`, p.Naslov, nullString(p.Napomena), p.DatumPodsecanja, p.Tip, ) if err != nil { return 0, fmt.Errorf("ntech: PodsetnikRepo.Kreiraj: %w", err) } id, err := rezultat.LastInsertId() if err != nil { return 0, fmt.Errorf("ntech: PodsetnikRepo.Kreiraj: last insert id: %w", err) } return id, nil } // Izmeni ažurira postojeći podsetnik func (r *PodsetnikRepo) Izmeni(ctx context.Context, p *model.Podsetnik) error { _, err := r.db.ExecContext(ctx, ` UPDATE podsetnici SET naslov = ?, napomena = ?, datum_podsecanja = ?, tip = ? WHERE id = ?`, p.Naslov, nullString(p.Napomena), p.DatumPodsecanja, p.Tip, p.ID, ) if err != nil { return fmt.Errorf("ntech: PodsetnikRepo.Izmeni: %w", err) } return nil } // OznaciZavrsenim postavlja ili uklanja oznaku završenosti func (r *PodsetnikRepo) OznaciZavrsenim(ctx context.Context, id int64, zavrseno bool) error { val := 0 if zavrseno { val = 1 } _, err := r.db.ExecContext(ctx, "UPDATE podsetnici SET zavrseno = ? WHERE id = ?", val, id, ) if err != nil { return fmt.Errorf("ntech: PodsetnikRepo.OznaciZavrsenim: %w", err) } return nil } // Obrisi briše podsetnik po ID-u func (r *PodsetnikRepo) Obrisi(ctx context.Context, id int64) error { _, err := r.db.ExecContext(ctx, "DELETE FROM podsetnici WHERE id = ?", id) if err != nil { return fmt.Errorf("ntech: PodsetnikRepo.Obrisi: %w", err) } return nil } // BrojAktivnih vraća broj nezavršenih podsetnika func (r *PodsetnikRepo) BrojAktivnih(ctx context.Context) (int, error) { var broj int err := r.db.QueryRowContext(ctx, "SELECT COUNT(*) FROM podsetnici WHERE zavrseno = 0", ).Scan(&broj) if err != nil { return 0, fmt.Errorf("ntech: PodsetnikRepo.BrojAktivnih: %w", err) } return broj, nil }