package bot import ( "context" "errors" "log/slog" "codeberg.org/nextgo/dbots/internal/db" "codeberg.org/nextgo/dbots/internal/errorutil" "codeberg.org/nextgo/dbots/internal/middleware" "codeberg.org/nextgo/dbots/internal/paginate" "github.com/jackc/pgx/v5/pgconn" ) type Service struct { q *db.Queries } func NewService(q *db.Queries) *Service { return &Service{q: q} } func (s *Service) Submit(ctx context.Context, data CreateBotRequest) (*db.Bot, error) { user := middleware.GetUser(ctx) var count int32 = 0 b, err := s.q.CreateBot(ctx, db.CreateBotParams{ ID: data.ID, Overview: &data.Overview, IsSlash: data.IsSlash, InstallContext: data.InstallContext, ImportedFrom: nil, Username: data.Username, Avatar: &data.Avatar, Description: &data.Description, GuildCount: &count, InstallCount: &count, Prefix: data.Prefix, MainOwnerID: &user.ID, }) if err != nil { slog.Error("error submitting bot", "err", err, "bot_id", data.ID) var pgErr *pgconn.PgError if errors.As(err, &pgErr) { switch pgErr.Code { case "23505": return nil, errorutil.ErrBotAlreadyExists } } return nil, err } return b, nil } func (s *Service) Get(ctx context.Context, id string) (*db.Bot, error) { return s.q.GetBot(ctx, id) } func (s *Service) List( ctx context.Context, query string, p paginate.Params, ) (paginate.Page[*db.Bot], error) { total, err := s.q.CountBotsByUsername(ctx, db.CountBotsByUsernameParams{ Status: db.BotStatusApproved, Query: query, }) if err != nil { slog.Error("error counting bots", "query", query, "err", err) return paginate.Page[*db.Bot]{}, errorutil.ErrSearchFailed } bots, err := s.q.ListBotsByStatus(ctx, db.ListBotsByStatusParams{ Status: db.BotStatusApproved, Limit: p.Limit, Offset: p.Offset, // todo: query }) if err != nil { slog.Error("error listing bots", "query", query, "err", err) return paginate.Page[*db.Bot]{}, errorutil.ErrSearchFailed } return paginate.NewPage(bots, int(total), p), nil }