7 Commits

Author SHA1 Message Date
Anatolii Grynchuk 3e1cc696c1 fix: rename api service to web in all docker-compose files
- Aligns compose service name with the image name (hrynco.notification-service.web)
- Rename API_PORT env var to WEB_PORT for consistency

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 18:50:16 +03:00
Anatolii Grynchuk ae119d1a3d feat: add production docker-compose with hrynco-services network
- Base compose: explicit internal network, named volumes with VOLUME_PREFIX
- docker-compose.prod.yml: production images, ports, restart policies, hrynco-services external network on rabbitmq
- docker-compose.Development.yml: cleaned up orphan volumes, named dev volumes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 15:25:09 +03:00
Anatolii Grynchuk b0996833bc feat: add RabbitMQ worker, contracts, usage UI in channels screen
- Add HrynCo.NotificationService.Contracts project with SendEmailMessage and NotificationResultMessage
- Add SendEmailConsumer (RabbitMQ worker) with reply-to pattern via CorrelationContext.ReplyTo
- Add SendEmailHandler owning SMTP send + usage increment as business logic
- Add GetChannelUsageSummaryHandler with single DB query via navigation property
- Merge usage stats inline into channels list (daily/monthly with progress bars)
- Refactor AdminChannelsController.Index to use GetChannelUsageSummaryQuery
- Add RabbitMQ service to docker-compose files
- Remove dead AdminChannelUsageController, ChannelUsageViewModel, ChannelUsageSummary

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 14:00:58 +03:00
Anatolii Grynchuk 855d0862f9 fix: save button not submitting — form id + form= attribute on submit button; migrator connection string in dev compose
- _EditorLayout renders FormActions section outside <form> in the DOM
- Added id='templateForm' to form, form='templateForm' to submit button (HTML5 form association)
- Added migrator env override in docker-compose.Development.yml so connection string is not read from \

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 02:35:01 +03:00
Anatolii Grynchuk d36bfd2b97 fix: pin Seq to 2024 image, add no-auth flag, restore dedicated Seq service
- datalust/seq:latest (2025.x) requires mandatory auth — pin to :2024
- Add SEQ_FIRSTRUN_NOAUTHENTICATION=true to match ItemTracker pattern
- Seq UI on port 5342, api/worker point to internal http://seq
- Restore notification_seq volume

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 02:31:05 +03:00
Anatolii Grynchuk 7ee811ca8e fix: reuse host Seq instance in Development, remove local seq service
- Seq on 5341 conflicts with ItemTracker dev environment
- Dev compose now points to host.docker.internal:5341 (shared Seq)
- Removed seq service and notification_seq volume from dev compose

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 02:28:51 +03:00
Anatolii Grynchuk ae724e4aee chore: add docker compose files and solution folder
- docker/environments/docker-compose.yml: base Api + Worker service definitions
- docker/environments/docker-compose.Development.yml: local PostgreSQL + Seq + port mappings
- Solution folder /docker/ in .slnx for IDE access

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-02 01:31:40 +03:00