package database import ( "context" "log/slog" "github.com/yyc12345/coconut-leaf/backend/config" ) // ResponseBody is the envelope returned by every Database operation, mirroring // the legacy database.ResponseBody. Data is any so each method can return its // own shape (scalar, []string, []any row, [][]any rows, ...). JSON tags keep the // legacy lowercase keys (success/error/data) used by ConstructResponseBody. type ResponseBody struct { Success bool `json:"success"` Error string `json:"error"` Data any `json:"data"` } // CalendarUpdateOptions carries the optional fields of CalendarUpdate. A nil // pointer means "not provided", mirroring the legacy **optArgs semantics: a // field is applied only when its pointer is non-nil. type CalendarUpdateOptions struct { BelongTo *string Title *string Description *string EventDateTimeStart *int64 EventDateTimeEnd *int64 LoopRules *string TimezoneOffset *int64 } // AdminUpdateOptions carries the optional fields of AdminUpdate. A nil pointer // means "not provided". type AdminUpdateOptions struct { Password *string IsAdmin *bool } // Deps bundles the shared dependencies a database implementation needs: the // loaded configuration and a logger. It is passed to database constructors and // stored inside each implementation so they can read config and emit logs. type Deps struct { Cfg *config.Config Logger *slog.Logger } // Database describes every database operation the Gin server may use. It is the // Go equivalent of the legacy CalendarDatabase public surface: each method takes // a context.Context for cancellation and returns a ResponseBody whose // Success/Error fields encode failure (mirroring the legacy decorator behavior). type Database interface { Init(username, password string) error Close() error CommonSalt(ctx context.Context, username string) ResponseBody CommonLogin(ctx context.Context, username, password, clientUa, clientIp string) ResponseBody CommonWebLogin(ctx context.Context, username, password, clientUa, clientIp string) ResponseBody CommonLogout(ctx context.Context, token string) ResponseBody CommonTokenValid(ctx context.Context, token string) ResponseBody CalendarGetFull(ctx context.Context, token string, startDateTime, endDateTime int64) ResponseBody CalendarGetList(ctx context.Context, token string, startDateTime, endDateTime int64) ResponseBody CalendarGetDetail(ctx context.Context, token, uuid string) ResponseBody CalendarUpdate(ctx context.Context, token, uuid, lastChange string, opts CalendarUpdateOptions) ResponseBody CalendarAdd(ctx context.Context, token, belongTo, title, description string, eventDateTimeStart, eventDateTimeEnd int64, loopRules string, timezoneOffset int64) ResponseBody CalendarDelete(ctx context.Context, token, uuid, lastChange string) ResponseBody CollectionGetFullOwn(ctx context.Context, token string) ResponseBody CollectionGetListOwn(ctx context.Context, token string) ResponseBody CollectionGetDetailOwn(ctx context.Context, token, uuid string) ResponseBody CollectionAddOwn(ctx context.Context, token, name string) ResponseBody CollectionUpdateOwn(ctx context.Context, token, uuid, name, lastChange string) ResponseBody CollectionDeleteOwn(ctx context.Context, token, uuid, lastChange string) ResponseBody CollectionGetSharing(ctx context.Context, token, uuid string) ResponseBody CollectionDeleteSharing(ctx context.Context, token, uuid, target, lastChange string) ResponseBody CollectionAddSharing(ctx context.Context, token, uuid, target, lastChange string) ResponseBody CollectionGetShared(ctx context.Context, token string) ResponseBody TodoGetFull(ctx context.Context, token string) ResponseBody TodoGetList(ctx context.Context, token string) ResponseBody TodoGetDetail(ctx context.Context, token, uuid string) ResponseBody TodoAdd(ctx context.Context, token string) ResponseBody TodoUpdate(ctx context.Context, token, uuid, data, lastChange string) ResponseBody TodoDelete(ctx context.Context, token, uuid, lastChange string) ResponseBody AdminGet(ctx context.Context, token string) ResponseBody AdminAdd(ctx context.Context, token, username string) ResponseBody AdminUpdate(ctx context.Context, token, username string, opts AdminUpdateOptions) ResponseBody AdminDelete(ctx context.Context, token, username string) ResponseBody ProfileIsAdmin(ctx context.Context, token string) ResponseBody ProfileChangePassword(ctx context.Context, token, password string) ResponseBody ProfileGetToken(ctx context.Context, token string) ResponseBody ProfileDeleteToken(ctx context.Context, token, deleteToken string) ResponseBody }