refactor: eliminate store bypass and fix GetLastEvent style

- Add GetDistinctEventDates, UpdateEventWorkType, UpdateEventTime,
  DeleteEvent, GetEventByID store methods to calendar.go
- Replace all 5 raw h.DB.DB().Exec/Query calls with proper store methods
- Remove unused database/sql import from calendar.go
- Rewrite GetLastEvent to use QueryRow instead of Query+manual iteration
  (fixing row-vs-rows naming issue; removing rows.Close boilerplate)
- Add errors import to store.go for errors.Is
This commit is contained in:
2026-06-25 02:29:30 +03:30
parent af23f80fbb
commit 80de661f5b
2 changed files with 67 additions and 45 deletions

View File

@@ -2,7 +2,6 @@ package bot
import (
"context"
"database/sql"
"fmt"
"log/slog"
"strconv"
@@ -264,22 +263,11 @@ func (h *Handler) editCalendar(ctx context.Context, chatID int64, msgID int, yea
hasEvent := make(map[string]bool)
startDate, endDate := monthGregorianRange(cal, year, month)
rows, err := h.DB.DB().Query(
"SELECT DISTINCT date FROM days WHERE user_id=? AND date >= ? AND date <= ?",
user.ID, startDate, endDate,
)
dates, err := h.DB.GetDistinctEventDates(user.ID, startDate, endDate)
if err == nil {
for rows.Next() {
var d string
if err := rows.Scan(&d); err != nil {
slog.Error("failed to scan day row", "error", err)
continue
}
for _, d := range dates {
hasEvent[d] = true
}
if err := rows.Close(); err != nil {
slog.Error("failed to close rows", "error", err)
}
}
kbRows := [][]models.InlineKeyboardButton{}
@@ -439,8 +427,7 @@ func (h *Handler) editEventType(ctx context.Context, chatID int64, msgID int, us
// setEventWorkType updates an event's work type and returns to the day view.
func (h *Handler) setEventWorkType(ctx context.Context, chatID int64, msgID int, user *db.User, eventID, workTypeID int64, loc *time.Location) {
_, err := h.DB.DB().Exec("UPDATE events SET work_type_id=? WHERE id=?", workTypeID, eventID)
if err != nil {
if err := h.DB.UpdateEventWorkType(eventID, workTypeID); err != nil {
slog.Error("failed to update event work type", "event_id", eventID, "error", err)
h.sendDayView(ctx, chatID, msgID, user, "", loc, false)
return
@@ -557,8 +544,7 @@ func (h *Handler) editEventTimeSet(ctx context.Context, chatID int64, msgID int,
}
}
_, err = h.DB.DB().Exec("UPDATE events SET occurred_at=? WHERE id=?", newTime.Unix(), eventID)
if err != nil {
if err = h.DB.UpdateEventTime(eventID, newTime.Unix()); err != nil {
slog.Error("failed to update event occurred_at", "event_id", eventID, "error", err)
h.sendDayView(ctx, chatID, msgID, user, date, loc, false)
return
@@ -615,8 +601,7 @@ func (h *Handler) deleteEventConfirm(ctx context.Context, chatID int64, msgID in
t := time.Unix(event.OccurredAt, 0).In(loc)
date := t.Format(DateLayout)
_, err = h.DB.DB().Exec("DELETE FROM events WHERE id=?", eventID)
if err != nil {
if err = h.DB.DeleteEvent(eventID); err != nil {
slog.Error("failed to delete event", "event_id", eventID, "error", err)
h.sendDayView(ctx, chatID, msgID, user, date, loc, false)
return
@@ -654,19 +639,7 @@ func (h *Handler) backToDayView(ctx context.Context, chatID int64, msgID int, us
// getEventByID fetches a single event by ID, scoped to the user.
func (h *Handler) getEventByID(userID, eventID int64) (*db.Event, error) {
row := h.DB.DB().QueryRow(
"SELECT id, user_id, day_id, event_type, work_type_id, occurred_at, note, created_at FROM events WHERE id=? AND user_id=?",
eventID, userID,
)
var e db.Event
var wt sql.NullInt64
if err := row.Scan(&e.ID, &e.UserID, &e.DayID, &e.EventType, &wt, &e.OccurredAt, &e.Note, &e.CreatedAt); err != nil {
return nil, err
}
if wt.Valid {
e.WorkTypeID = &wt.Int64
}
return &e, nil
return h.DB.GetEventByID(eventID, userID)
}
// addEventTime shows an hour picker for adding a new event to a day.