Skip to content

Commit

Permalink
Merge pull request #1894 from H1rono/add-bot-events
Browse files Browse the repository at this point in the history
BOTイベントを追加
  • Loading branch information
ikura-hamu committed Sep 3, 2023
2 parents 9d6c523 + 0642dc8 commit 8a2db60
Show file tree
Hide file tree
Showing 27 changed files with 1,156 additions and 13 deletions.
24 changes: 24 additions & 0 deletions service/bot/event/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,22 @@ const (
TagAdded model.BotEventType = "TAG_ADDED"
// TagRemoved タグ削除イベント
TagRemoved model.BotEventType = "TAG_REMOVED"
// UserGroupCreated グループ作成イベント
UserGroupCreated model.BotEventType = "USER_GROUP_CREATED"
// UserGroupUpdated グループ更新イベント
UserGroupUpdated model.BotEventType = "USER_GROUP_UPDATED"
// UserGroupDeleted グループ削除イベント
UserGroupDeleted model.BotEventType = "USER_GROUP_DELETED"
// UserGroupMemberAdded グループメンバー追加イベント
UserGroupMemberAdded model.BotEventType = "USER_GROUP_MEMBER_ADDED"
// UserGroupMemberUpdated グループメンバー更新イベント
UserGroupMemberUpdated model.BotEventType = "USER_GROUP_MEMBER_UPDATED"
// UserGroupMemberRemoved グループメンバー削除イベント
UserGroupMemberRemoved model.BotEventType = "USER_GROUP_MEMBER_REMOVED"
// UserGroupAdminAdded グループ管理者追加イベント
UserGroupAdminAdded model.BotEventType = "USER_GROUP_ADMIN_ADDED"
// UserGroupAdminRemoved グループ管理者削除イベント
UserGroupAdminRemoved model.BotEventType = "USER_GROUP_ADMIN_REMOVED"
)

var Types model.BotEventTypes
Expand All @@ -62,6 +78,14 @@ func init() {
StampCreated,
TagAdded,
TagRemoved,
UserGroupCreated,
UserGroupUpdated,
UserGroupDeleted,
UserGroupMemberAdded,
UserGroupMemberUpdated,
UserGroupMemberRemoved,
UserGroupAdminAdded,
UserGroupAdminRemoved,
} {
Types[t] = struct{}{}
}
Expand Down
72 changes: 72 additions & 0 deletions service/bot/event/payload/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,75 @@ func MakeUser(user model.UserInfo) User {
}
return payload
}

type GroupMember struct {
GroupID uuid.UUID `json:"groupId"`
UserID uuid.UUID `json:"userId"`
}

func MakeGroupMember(groupID, userID uuid.UUID) GroupMember {
return GroupMember{
GroupID: groupID,
UserID: userID,
}
}

type UserGroupAdmin GroupMember

func MakeUserGroupAdmin(groupID, userID uuid.UUID) UserGroupAdmin {
return UserGroupAdmin{
GroupID: groupID,
UserID: userID,
}
}

type UserGroupMember struct {
GroupMember
Role string `json:"role"`
}

func MakeUserGroupMember(groupID, userID uuid.UUID, role string) UserGroupMember {
return UserGroupMember{
GroupMember: GroupMember{
GroupID: groupID,
UserID: userID,
},
Role: role,
}
}

type UserGroup struct {
ID uuid.UUID `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Icon uuid.UUID `json:"icon"`
Admins []*UserGroupAdmin `json:"admins"`
Members []*UserGroupMember `json:"members"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}

func MakeUserGroup(group model.UserGroup) UserGroup {
admins := make([]*UserGroupAdmin, len(group.Admins))
for i, admin := range group.Admins {
a := MakeUserGroupAdmin(admin.GroupID, admin.UserID)
admins[i] = &a
}
members := make([]*UserGroupMember, len(group.Members))
for i, member := range group.Members {
m := MakeUserGroupMember(member.GroupID, member.UserID, member.Role)
members[i] = &m
}
return UserGroup{
ID: group.ID,
Name: group.Name,
Description: group.Description,
Type: group.Type,
Icon: group.Icon,
Admins: admins,
Members: members,
CreatedAt: group.CreatedAt,
UpdatedAt: group.UpdatedAt,
}
}
19 changes: 19 additions & 0 deletions service/bot/event/payload/ev_user_group_admin_added.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package payload

import (
"github.com/gofrs/uuid"
"time"
)

// UserGroupAdminAdded USER_GROUP_ADMIN_ADDEDイベントペイロード
type UserGroupAdminAdded struct {
Base
GroupMember `json:"groupMember"`
}

func MakeUserGroupAdminAdded(eventTime time.Time, groupID, userID uuid.UUID) *UserGroupAdminAdded {
return &UserGroupAdminAdded{
Base: MakeBase(eventTime),
GroupMember: MakeGroupMember(groupID, userID),
}
}
19 changes: 19 additions & 0 deletions service/bot/event/payload/ev_user_group_admin_removed.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package payload

import (
"github.com/gofrs/uuid"
"time"
)

// UserGroupAdminRemoved USER_GROUP_ADMIN_REMOVEDイベントペイロード
type UserGroupAdminRemoved struct {
Base
GroupMember `json:"groupMember"`
}

func MakeUserGroupAdminRemoved(eventTime time.Time, groupID, userID uuid.UUID) *UserGroupAdminRemoved {
return &UserGroupAdminRemoved{
Base: MakeBase(eventTime),
GroupMember: MakeGroupMember(groupID, userID),
}
}
20 changes: 20 additions & 0 deletions service/bot/event/payload/ev_user_group_created.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package payload

import (
"time"

"github.com/traPtitech/traQ/model"
)

// UserGroupCreated USER_GROUP_CREATEDイベントペイロード
type UserGroupCreated struct {
Base
Group UserGroup `json:"group"`
}

func MakeUserGroupCreated(eventTime time.Time, group model.UserGroup) *UserGroupCreated {
return &UserGroupCreated{
Base: MakeBase(eventTime),
Group: MakeUserGroup(group),
}
}
21 changes: 21 additions & 0 deletions service/bot/event/payload/ev_user_group_deleted.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package payload

import (
"time"

"github.com/gofrs/uuid"
"github.com/traPtitech/traQ/model"
)

// UserGroupDeleted USER_GROUP_DELETEDイベントペイロード
type UserGroupDeleted struct {
Base
GroupID uuid.UUID `json:"groupId"`
}

func MakeUserGroupDeleted(eventTime time.Time, group model.UserGroup) *UserGroupDeleted {
return &UserGroupDeleted{
Base: MakeBase(eventTime),
GroupID: group.ID,
}
}
19 changes: 19 additions & 0 deletions service/bot/event/payload/ev_user_group_member_added.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package payload

import (
"github.com/gofrs/uuid"
"time"
)

// UserGroupMemberAdded USER_GROUP_MEMBER_ADDEDイベントペイロード
type UserGroupMemberAdded struct {
Base
GroupMember `json:"groupMember"`
}

func MakeUserGroupMemberAdded(eventTime time.Time, groupID, userID uuid.UUID) *UserGroupMemberAdded {
return &UserGroupMemberAdded{
Base: MakeBase(eventTime),
GroupMember: MakeGroupMember(groupID, userID),
}
}
19 changes: 19 additions & 0 deletions service/bot/event/payload/ev_user_group_member_removed.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package payload

import (
"github.com/gofrs/uuid"
"time"
)

// UserGroupMemberRemoved USER_GROUP_MEMBER_REMOVEDイベントペイロード
type UserGroupMemberRemoved struct {
Base
GroupMember `json:"groupMember"`
}

func MakeUserGroupMemberRemoved(eventTime time.Time, groupID, userID uuid.UUID) *UserGroupMemberRemoved {
return &UserGroupMemberRemoved{
Base: MakeBase(eventTime),
GroupMember: MakeGroupMember(groupID, userID),
}
}
19 changes: 19 additions & 0 deletions service/bot/event/payload/ev_user_group_member_updated.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package payload

import (
"github.com/gofrs/uuid"
"time"
)

// UserGroupMemberUpdated USER_GROUP_MEMBER_UPDATEDイベントペイロード
type UserGroupMemberUpdated struct {
Base
GroupMember `json:"groupMember"`
}

func MakeUserGroupMemberUpdated(eventTime time.Time, groupID, userID uuid.UUID) *UserGroupMemberUpdated {
return &UserGroupMemberUpdated{
Base: MakeBase(eventTime),
GroupMember: MakeGroupMember(groupID, userID),
}
}
20 changes: 20 additions & 0 deletions service/bot/event/payload/ev_user_group_updated.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package payload

import (
"time"

"github.com/gofrs/uuid"
)

// UserGroupUpdated USER_GROUP_UPDATEDイベントペイロード
type UserGroupUpdated struct {
Base
GroupID uuid.UUID `json:"groupId"`
}

func MakeUserGroupUpdated(eventTime time.Time, groupID uuid.UUID) *UserGroupUpdated {
return &UserGroupUpdated{
Base: MakeBase(eventTime),
GroupID: groupID,
}
}
33 changes: 33 additions & 0 deletions service/bot/handler/ev_user_group_admin_added.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package handler

import (
"fmt"
"github.com/gofrs/uuid"
"time"

"github.com/leandro-lugaresi/hub"

"github.com/traPtitech/traQ/service/bot/event"
"github.com/traPtitech/traQ/service/bot/event/payload"
)

func UserGroupAdminAdded(ctx Context, datetime time.Time, _ string, fields hub.Fields) error {
groupID := fields["group_id"].(uuid.UUID)
userID := fields["user_id"].(uuid.UUID)
bots, err := ctx.GetBots(event.UserGroupAdminAdded)
if err != nil {
return fmt.Errorf("failed to GetBots: %w", err)
}
if len(bots) == 0 {
return nil
}

if err := ctx.Multicast(
event.UserGroupAdminAdded,
payload.MakeUserGroupAdminAdded(datetime, groupID, userID),
bots,
); err != nil {
return fmt.Errorf("failed to multicast: %w", err)
}
return nil
}
69 changes: 69 additions & 0 deletions service/bot/handler/ev_user_group_admin_added_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package handler

import (
"testing"
"time"

"github.com/gofrs/uuid"
"github.com/golang/mock/gomock"
"github.com/leandro-lugaresi/hub"
"github.com/stretchr/testify/assert"

intevent "github.com/traPtitech/traQ/event"
"github.com/traPtitech/traQ/model"
"github.com/traPtitech/traQ/service/bot/event"
"github.com/traPtitech/traQ/service/bot/event/payload"
"github.com/traPtitech/traQ/service/bot/handler/mock_handler"
)

func TestUserGroupAdminAdded(t *testing.T) {
t.Parallel()

b := &model.Bot{
ID: uuid.NewV3(uuid.Nil, "b"),
BotUserID: uuid.NewV3(uuid.Nil, "bu"),
SubscribeEvents: model.BotEventTypesFromArray([]string{event.UserGroupAdminAdded.String()}),
State: model.BotActive,
}

t.Run("success", func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
handlerCtx := mock_handler.NewMockContext(ctrl)
registerBot(t, handlerCtx, b)

userID := uuid.NewV3(uuid.Nil, "u")
groupID := uuid.NewV3(uuid.Nil, "g")
et := time.Now()

expectMulticast(handlerCtx, event.UserGroupAdminAdded, payload.MakeUserGroupAdminAdded(et, groupID, userID), []*model.Bot{b})
assert.NoError(t, UserGroupAdminAdded(handlerCtx, et, intevent.UserGroupAdminAdded, hub.Fields{
"group_id": groupID,
"user_id": userID,
}))
})

t.Run("not subscribe USER_GROUP_ADMIN_ADDED", func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
handlerCtx := mock_handler.NewMockContext(ctrl)
b2 := &model.Bot{
ID: uuid.NewV3(uuid.Nil, "b2"),
BotUserID: uuid.NewV3(uuid.Nil, "bu2"),
SubscribeEvents: model.BotEventTypesFromArray([]string{event.MessageCreated.String()}),
State: model.BotActive,
}
registerBot(t, handlerCtx, b)
registerBot(t, handlerCtx, b2)

userID := uuid.NewV3(uuid.Nil, "u")
groupID := uuid.NewV3(uuid.Nil, "g")
et := time.Now()

expectMulticast(handlerCtx, event.UserGroupAdminAdded, payload.MakeUserGroupAdminAdded(et, groupID, userID), []*model.Bot{b})
assert.NoError(t, UserGroupAdminAdded(handlerCtx, et, intevent.UserGroupAdminAdded, hub.Fields{
"group_id": groupID,
"user_id": userID,
}))
})
}

0 comments on commit 8a2db60

Please sign in to comment.