feat: add a new command - group delete #16
|
@ -58,7 +58,7 @@ func (g *Group) Update(ctx context.Context, id, serverID string, params domain.U
|
||||||
Apply(updateGroupsParamsApplier{params}.apply).
|
Apply(updateGroupsParamsApplier{params}.apply).
|
||||||
Exec(ctx)
|
Exec(ctx)
|
||||||
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return domain.Group{}, fmt.Errorf("couldn't update group (id=%s): %w", id, err)
|
return domain.Group{}, fmt.Errorf("couldn't update group (id=%s,serverID=%s): %w", id, serverID, err)
|
||||||
}
|
}
|
||||||
if affected, _ := res.RowsAffected(); affected == 0 {
|
if affected, _ := res.RowsAffected(); affected == 0 {
|
||||||
return domain.Group{}, domain.GroupNotFoundError{ID: id}
|
return domain.Group{}, domain.GroupNotFoundError{ID: id}
|
||||||
|
@ -85,6 +85,26 @@ func (g *Group) List(ctx context.Context, params domain.ListGroupsParams) ([]dom
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *Group) Delete(ctx context.Context, id, serverID string) error {
|
||||||
|
if _, err := uuid.Parse(id); err != nil {
|
||||||
|
return domain.GroupNotFoundError{ID: id}
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := g.db.NewDelete().
|
||||||
|
Model(&model.Group{}).
|
||||||
|
Returning("NULL").
|
||||||
|
Where("id = ?", id).
|
||||||
|
Where("server_id = ?", serverID).
|
||||||
|
Exec(ctx)
|
||||||
|
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
|
return fmt.Errorf("couldn't delete group (id=%s,serverID=%s): %w", id, serverID, err)
|
||||||
|
}
|
||||||
|
if affected, _ := res.RowsAffected(); affected == 0 {
|
||||||
|
return domain.GroupNotFoundError{ID: id}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type updateGroupsParamsApplier struct {
|
type updateGroupsParamsApplier struct {
|
||||||
params domain.UpdateGroupParams
|
params domain.UpdateGroupParams
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,6 +190,55 @@ func TestGroup_List(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGroup_Delete(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
db := newDB(t)
|
||||||
|
fixture := loadFixtures(t, db)
|
||||||
|
repo := bundb.NewGroup(db)
|
||||||
|
group := getGroupFromFixture(t, fixture, "group-server-1-1")
|
||||||
|
|
||||||
|
t.Run("OK", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert.NoError(t, repo.Delete(context.Background(), group.ID.String(), group.ServerID))
|
||||||
|
|
||||||
|
groups, err := repo.List(context.Background(), domain.ListGroupsParams{
|
||||||
|
ServerIDs: []string{group.ID.String()},
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Len(t, groups, 0)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("ERR: invalid UUID", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
id := "12345"
|
||||||
|
assert.ErrorIs(t, repo.Delete(context.Background(), id, ""), domain.GroupNotFoundError{ID: id})
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("ERR: group not found (unknown ID)", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
id := uuid.NewString()
|
||||||
|
assert.ErrorIs(
|
||||||
|
t,
|
||||||
|
repo.Delete(context.Background(), id, group.ServerID),
|
||||||
|
domain.GroupNotFoundError{ID: id},
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("ERR: group not found (unknown ServerID)", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert.ErrorIs(
|
||||||
|
t,
|
||||||
|
repo.Delete(context.Background(), group.ID.String(), uuid.NewString()),
|
||||||
|
domain.GroupNotFoundError{ID: group.ID.String()},
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func getAllGroupsFromFixture(tb testing.TB, fixture *dbfixture.Fixture) []model.Group {
|
func getAllGroupsFromFixture(tb testing.TB, fixture *dbfixture.Fixture) []model.Group {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ type GroupService interface {
|
||||||
SetChannelGains(ctx context.Context, id, serverID, channel string) (domain.Group, error)
|
SetChannelGains(ctx context.Context, id, serverID, channel string) (domain.Group, error)
|
||||||
SetChannelLosses(ctx context.Context, id, serverID, channel string) (domain.Group, error)
|
SetChannelLosses(ctx context.Context, id, serverID, channel string) (domain.Group, error)
|
||||||
List(ctx context.Context, params domain.ListGroupsParams) ([]domain.Group, error)
|
List(ctx context.Context, params domain.ListGroupsParams) ([]domain.Group, error)
|
||||||
|
Delete(ctx context.Context, id, serverID string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type TWHelpClient interface {
|
type TWHelpClient interface {
|
||||||
|
|
|
@ -193,6 +193,19 @@ func (c *groupCommand) create(s *discordgo.Session) error {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "delete",
|
||||||
|
Description: "Deletes a group",
|
||||||
|
Type: discordgo.ApplicationCommandOptionSubCommand,
|
||||||
|
Options: []*discordgo.ApplicationCommandOption{
|
||||||
|
{
|
||||||
|
Name: "group",
|
||||||
|
Description: "Group ID",
|
||||||
|
Type: discordgo.ApplicationCommandOptionString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -237,6 +250,9 @@ func (c *groupCommand) handle(s *discordgo.Session, i *discordgo.InteractionCrea
|
||||||
case "unset":
|
case "unset":
|
||||||
c.handleUnset(s, i)
|
c.handleUnset(s, i)
|
||||||
return
|
return
|
||||||
|
case "delete":
|
||||||
|
c.handleDelete(s, i)
|
||||||
|
return
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -515,6 +531,28 @@ func (c *groupCommand) handleUnsetChannelLosses(s *discordgo.Session, i *discord
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *groupCommand) handleDelete(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
group := i.ApplicationCommandData().Options[0].Options[0].StringValue()
|
||||||
|
if err := c.svc.Delete(ctx, group, i.GuildID); err != nil {
|
||||||
|
_ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
|
||||||
|
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
||||||
|
Data: &discordgo.InteractionResponseData{
|
||||||
|
Content: messageFromError(err),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
|
||||||
|
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
||||||
|
Data: &discordgo.InteractionResponseData{
|
||||||
|
Content: "group has been successfully deleted",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func buildGroupListDescription(groups []domain.Group) string {
|
func buildGroupListDescription(groups []domain.Group) string {
|
||||||
description := "**ID** - **Version** - **Server**"
|
description := "**ID** - **Version** - **Server**"
|
||||||
for i, g := range groups {
|
for i, g := range groups {
|
||||||
|
|
|
@ -18,6 +18,7 @@ type GroupRepository interface {
|
||||||
Create(ctx context.Context, params domain.CreateGroupParams) (domain.Group, error)
|
Create(ctx context.Context, params domain.CreateGroupParams) (domain.Group, error)
|
||||||
Update(ctx context.Context, id, serverID string, params domain.UpdateGroupParams) (domain.Group, error)
|
Update(ctx context.Context, id, serverID string, params domain.UpdateGroupParams) (domain.Group, error)
|
||||||
List(ctx context.Context, params domain.ListGroupsParams) ([]domain.Group, error)
|
List(ctx context.Context, params domain.ListGroupsParams) ([]domain.Group, error)
|
||||||
|
Delete(ctx context.Context, id, serverID string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type Group struct {
|
type Group struct {
|
||||||
|
@ -112,6 +113,13 @@ func (g *Group) List(ctx context.Context, params domain.ListGroupsParams) ([]dom
|
||||||
return groups, nil
|
return groups, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *Group) Delete(ctx context.Context, id, serverID string) error {
|
||||||
|
if err := g.repo.Delete(ctx, id, serverID); err != nil {
|
||||||
|
return fmt.Errorf("GroupRepository.Delete: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (g *Group) checkTWServer(ctx context.Context, versionCode, serverKey string) error {
|
func (g *Group) checkTWServer(ctx context.Context, versionCode, serverKey string) error {
|
||||||
server, err := g.client.GetServer(ctx, versionCode, serverKey)
|
server, err := g.client.GetServer(ctx, versionCode, serverKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user