85 lines
2 KiB
Go
85 lines
2 KiB
Go
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,
|
|
})
|
|
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
|
|
}
|