feat: multi-user isolation and graceful shutdown

- Add chat_id to events, settings, and days_off for per-user data
- Add proper graceful shutdown (signal handling, WaitGroup)
- Separate polling and webhook modes with goroutine management
- Add schema migration from single-user to multi-user schema
- Refactor handlers with shared actionFunc pattern (msg + callback)
- Fix schema path for Docker deployment (/app/db/schema.sql)
- Remove emoji from output text for cleaner formatting
This commit is contained in:
2026-06-24 00:14:41 +03:30
parent 7aada8d118
commit 8616ed0867
7 changed files with 416 additions and 412 deletions

View File

@@ -9,7 +9,7 @@ import (
"worktimeBot/internal/db"
)
func GenerateMonthlyReport(store *db.Store, year int, month time.Month) ([]byte, error) {
func GenerateMonthlyReport(store *db.Store, chatID int64, year int, month time.Month) ([]byte, error) {
f := excelize.NewFile()
defer f.Close()
@@ -59,7 +59,6 @@ func GenerateMonthlyReport(store *db.Store, year int, month time.Month) ([]byte,
})
monthName := time.Date(year, month, 1, 0, 0, 0, 0, time.UTC).Format("January 2006")
f.SetCellValue(sheet, "A1", fmt.Sprintf("Work Time Report — %s", monthName))
f.MergeCell(sheet, "A1", "E1")
f.SetCellStyle(sheet, "A1", "E1", titleStyle)
@@ -89,7 +88,7 @@ func GenerateMonthlyReport(store *db.Store, year int, month time.Month) ([]byte,
for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 0, 1) {
dateStr := d.Format("2006-01-02")
isOff, err := store.IsDayOff(dateStr)
isOff, err := store.IsDayOff(chatID, dateStr)
if err != nil {
return nil, err
}
@@ -97,7 +96,7 @@ func GenerateMonthlyReport(store *db.Store, year int, month time.Month) ([]byte,
continue
}
events, err := store.EventsForDay(dateStr)
events, err := store.EventsForDay(chatID, dateStr)
if err != nil {
return nil, err
}