diff --git a/infra/db/event.go b/infra/db/event.go index fdb8d20b..d5830c73 100644 --- a/infra/db/event.go +++ b/infra/db/event.go @@ -57,6 +57,11 @@ func (repo *GormRepository) UpsertEventSchedule(eventID, userID uuid.UUID, sched return defaultErrorHandling(err) } +func (repo *GormRepository) DeleteEventSchedule(eventID uuid.UUID, userID uuid.UUID) error { + err := deleteEventSchedule(repo.db, eventID, userID) + return defaultErrorHandling(err) +} + func (repo *GormRepository) GetEvent(eventID uuid.UUID) (*Event, error) { es, err := getEvent(eventFullPreload(repo.db), eventID) return es, defaultErrorHandling(err) @@ -140,6 +145,13 @@ func upsertEventSchedule(tx *gorm.DB, eventID, userID uuid.UUID, schedule domain }).Create(&eventAttendee).Error } +func deleteEventSchedule(tx *gorm.DB, eventID uuid.UUID, userID uuid.UUID) error { + if eventID == uuid.Nil { + return NewValueError(gorm.ErrRecordNotFound, "eventID") + } + return tx.Where("event_id = ? AND user_id = ?", eventID, userID).Delete(&EventAttendee{}).Error +} + func getEvent(db *gorm.DB, eventID uuid.UUID) (*Event, error) { event := Event{} err := db.Take(&event, eventID).Error diff --git a/usecase/production/event.go b/usecase/production/event.go index 2952d823..309282a3 100644 --- a/usecase/production/event.go +++ b/usecase/production/event.go @@ -5,6 +5,7 @@ import ( "github.com/traPtitech/knoQ/domain" "github.com/traPtitech/knoQ/domain/filter" "github.com/traPtitech/knoQ/infra/db" + "golang.org/x/exp/slices" ) func (repo *Repository) CreateEvent(params domain.WriteEventParams, info *domain.ConInfo) (*domain.Event, error) { @@ -49,22 +50,48 @@ func (repo *Repository) UpdateEvent(eventID uuid.UUID, params domain.WriteEventP WriteEventParams: params, CreatedBy: info.ReqUserID, } + event, err := repo.GormRepo.UpdateEvent(eventID, p) if err != nil { return nil, defaultErrorHandling(err) } + + // groupが変更されていないとき + if currentEvent.Group.ID == params.GroupID { + return repo.GetEvent(event.ID, info) + } + + attendeesMap := make(map[uuid.UUID]domain.ScheduleStatus) + for _, attendee := range currentEvent.Attendees { + attendeesMap[attendee.UserID] = attendee.Schedule + } + + count := 0 for _, groupMember := range group.Members { - exist := false - for _, currentAttendee := range currentEvent.Attendees { - if currentAttendee.UserID == groupMember.ID { - exist = true - } - } - if !exist { + if _, ok := attendeesMap[groupMember.ID]; !ok { + // 新しくグループメンバーになった人をPendingにする _ = repo.GormRepo.UpsertEventSchedule(event.ID, groupMember.ID, domain.Pending) + count++ } + } + + // 変更前のグループメンバー全員が変更後のグループメンバーであるとき + // (変更前グループメンバーの数) = (変更後グループメンバーの数) - (変更後グループメンバーの中で新規グループメンバーの数) + if len(attendeesMap) == (len(group.Members) - count) { + return repo.GetEvent(event.ID, info) + } + for attendeeUserId, schedule := range attendeesMap { + ok := slices.ContainsFunc(group.Members, func(m domain.User) bool { + return m.ID == attendeeUserId + }) + // グループ外参加不可でグループメンバーから外れた人を削除 + // グループ外参加可でグループメンバーから外れた人でPendingだった人を削除 + if !ok && (!event.AllowTogether || schedule == domain.Pending) { + _ = repo.GormRepo.DeleteEventSchedule(event.ID, attendeeUserId) + } } + return repo.GetEvent(event.ID, info) }