package service_event import ( "context" "nixcn-cms/data" "nixcn-cms/internal/exception" "nixcn-cms/service/shared" "strconv" "time" "github.com/google/uuid" ) type JoinedEventListData struct { Limit *string `json:"limit"` Offset *string `json:"offset"` } type JoinedEventListPayload struct { Context context.Context UserId uuid.UUID Data *JoinedEventListData } type JoinedEventListResult struct { Common shared.CommonResult Data *[]data.EventIndexDoc `json:"event_list"` } func (self *EventServiceImpl) GetJoinedEvent(payload *JoinedEventListPayload) (result *JoinedEventListResult) { var limit string if payload.Data.Limit == nil || *payload.Data.Limit == "" { limit = "20" } else { limit = *payload.Data.Limit } var offset string if payload.Data.Offset == nil || *payload.Data.Offset == "" { exc := new(exception.Builder). SetStatus(exception.StatusUser). SetService(exception.ServiceEvent). SetEndpoint(exception.EndpointEventServiceList). SetType(exception.TypeCommon). SetOriginal(exception.CommonErrorInvalidInput). SetError(nil). Throw(payload.Context) return &JoinedEventListResult{ Common: shared.CommonResult{ HttpCode: 400, Exception: exc, }, } } else { offset = *payload.Data.Offset } limitNum, err := strconv.Atoi(limit) if err != nil { exc := new(exception.Builder). SetStatus(exception.StatusUser). SetService(exception.ServiceEvent). SetEndpoint(exception.EndpointEventServiceList). SetType(exception.TypeCommon). SetOriginal(exception.CommonErrorInvalidInput). SetError(err). Throw(payload.Context) return &JoinedEventListResult{ Common: shared.CommonResult{HttpCode: 400, Exception: exc}, } } offsetNum, err := strconv.Atoi(offset) if err != nil { exc := new(exception.Builder). SetStatus(exception.StatusUser). SetService(exception.ServiceEvent). SetEndpoint(exception.EndpointEventServiceList). SetType(exception.TypeCommon). SetOriginal(exception.CommonErrorInvalidInput). SetError(err). Throw(payload.Context) return &JoinedEventListResult{ Common: shared.CommonResult{HttpCode: 400, Exception: exc}, } } eventList, err := new(data.Event). GetEventsByUserId(payload.Context, payload.UserId, int64(limitNum), int64(offsetNum)) if err != nil { exc := new(exception.Builder). SetStatus(exception.StatusServer). SetService(exception.ServiceEvent). SetEndpoint(exception.EndpointEventServiceList). SetType(exception.TypeSpecific). SetOriginal(exception.EventListDatabaseFailed). SetError(err). Throw(payload.Context) return &JoinedEventListResult{ Common: shared.CommonResult{ HttpCode: 500, Exception: exc, }, } } if eventList != nil && len(*eventList) > 0 { attendances, err := new(data.Attendance).GetEventsByUserID(payload.Context, payload.UserId) checkinMap := make(map[uuid.UUID]time.Time) if err == nil && attendances != nil { for _, att := range *attendances { checkinMap[att.EventId] = att.CheckinAt } } for i := range *eventList { item := &(*eventList)[i] item.IsJoined = true eID, _ := uuid.Parse(item.EventId) if checkinTime, signedUp := checkinMap[eID]; signedUp { if !checkinTime.IsZero() && checkinTime.After(time.Unix(0, 0)) { item.IsCheckedIn = true } } cCount, _ := new(data.Attendance).CountCheckedInUsersByEventID(payload.Context, eID) item.CheckinCount = cCount } } if eventList != nil { for i := range *eventList { (*eventList)[i].IsJoined = true } } successExc := new(exception.Builder). SetStatus(exception.StatusSuccess). SetService(exception.ServiceEvent). SetEndpoint(exception.EndpointEventServiceList). SetType(exception.TypeCommon). SetOriginal(exception.CommonSuccess). Throw(payload.Context) return &JoinedEventListResult{ Common: shared.CommonResult{ HttpCode: 200, Exception: successExc, }, Data: eventList, } }