- Fix notifications_sent PK: changed from (rgid, sent_at) to rgid-only PK
to prevent duplicate RGID rows across seconds. Use INSERT OR REPLACE
instead of INSERT OR IGNORE for true idempotency.
- Add foreign key constraints to DDL (artist_id references artist_settings,
rgid references external_releases) per specification.
- Enable PRAGMA foreign_keys=ON and PRAGMA busy_timeout=5000 for concurrent
access safety.
- Fix GetNotificationSentAt query: add ORDER BY sent_at DESC LIMIT 1 for
deterministic results.
- Fix config test: change YAML key from 'chat' to 'chat_id' to match struct
tag, add ChatID assertion.
- Fix migration tracking test: correct error message from "expected 4" to
"expected 3".
- Remove dead code in TestLoadConfig_InvalidPort: eliminate unused YAML
template and remove port 0 case (valid, not invalid).
- Remove unused path parameter from buildConfigWithPort helper.
- Remove pointless 100ms sleep in run() and unused time import.
- Remove tautological TestDefaultConfigPath test.
- Update README.md: Go version 1.21+ to 1.25+, placeholder passwords to
CHANGE_ME.
- Update config.yaml.example: placeholder passwords to CHANGE_ME.
- Update all database tests to insert parent rows first for FK satisfaction.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mark Task 9 checkboxes complete: README already has accurate build/run/test
instructions, config.yaml.example matches spec, no deviations from
specification found in the foundation layer implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mark Task 8 complete after verifying: go build succeeds, config loads
from YAML, all 3 database tables created via migrations, all CRUD
operations work, Docker builds, all 53 tests pass, go vet clean,
gofmt clean, coverage exceeds 70% for foundation packages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Dockerfile with golang:1.25-alpine build stage + alpine runtime stage
- Add docker-compose.yml with naviwatcher service and data volume
- Add .dockerignore for build context cleanup
- Add .gitignore for build artifacts and data directory
- Update plan: mark Task 7 checkboxes as complete
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement MarkNotificationSent, IsNotificationSent, and
GetUnnotifiedReleases with LEFT JOIN query. Includes 10
table-driven tests covering success, error, idempotent,
and edge cases. Also go fmt cleanup on existing files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement GetExternalRelease, SaveExternalRelease,
GetExternalReleasesByArtist, GetIgnoredReleases, and
SetReleaseIgnored with 12 table-driven tests covering
success and error cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements GetArtistSettings, SaveArtistSettings, GetAllArtistSettings,
and UpdateArtistSettings with full test coverage (10 new tests).
All 17 database tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add internal/database package with SQLite3 connection management,
versioned migration system, and three schema tables (artist_settings,
external_releases, notifications_sent). Includes 7 tests covering
initialization, migration idempotency, Close() behavior, and schema
validation using in-memory SQLite.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add internal/config package with Config struct (Server, Navidrome,
MusicBrainz, Telegram, Scanner sections), LoadConfig function for
YAML parsing, config validation (required fields, port range,
threshold range), and defaults. Include config.yaml.example matching
spec. Update main.go to use real config package instead of
placeholders. Add comprehensive tests covering valid configs,
defaults, missing files, malformed YAML, and validation boundaries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Initialize naviwatcher Go module
- Create directory structure: internal/config/, internal/database/, cmd/naviwatcher/
- Add main.go entry point with flag parsing, config loading placeholder, and graceful shutdown skeleton
- Add dependencies: go-sqlite3, yaml.v3
- Write tests for config loading and flag parsing
- All tests pass, go vet clean
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>