package store import "database/sql" type Share struct { ID string FileID string Token string PasswordHash string ExpiresAt int64 CreatedAt int64 LastAccessedAt int64 } func (s *Store) ShareCreate(sh *Share) error { _, err := s.db.Exec( `INSERT INTO shares (id, file_id, token, password_hash, expires_at, created_at, last_accessed_at) VALUES (?, ?, ?, ?, ?, ?, ?)`, sh.ID, sh.FileID, sh.Token, sh.PasswordHash, sh.ExpiresAt, sh.CreatedAt, sh.LastAccessedAt, ) return err } func (s *Store) ShareGetByToken(token string) (*Share, error) { row := s.db.QueryRow( `SELECT id, file_id, token, password_hash, expires_at, created_at, last_accessed_at FROM shares WHERE token = ?`, token, ) return scanShare(row) } func (s *Store) ShareList() ([]*Share, error) { rows, err := s.db.Query( `SELECT id, file_id, token, password_hash, expires_at, created_at, last_accessed_at FROM shares ORDER BY created_at DESC`, ) if err != nil { return nil, err } defer rows.Close() var shares []*Share for rows.Next() { sh, err := scanShare(rows) if err != nil { return nil, err } shares = append(shares, sh) } return shares, rows.Err() } func (s *Store) ShareDelete(id string) error { _, err := s.db.Exec(`DELETE FROM shares WHERE id = ?`, id) return err } func scanShare(row interface { Scan(dest ...any) error }) (*Share, error) { sh := &Share{} err := row.Scan(&sh.ID, &sh.FileID, &sh.Token, &sh.PasswordHash, &sh.ExpiresAt, &sh.CreatedAt, &sh.LastAccessedAt) if err == sql.ErrNoRows { return nil, err } return sh, err }