Files
cms-server/service/service_event/get_joined_event.go
Asai Neko e7df62e673
All checks were successful
Client CMS Check Build (NixCN CMS) TeamCity build finished
Backend Check Build (NixCN CMS) TeamCity build finished
Add is_checked_in into joined event api
Signed-off-by: Asai Neko <sugar@sne.moe>
2026-02-08 16:22:40 +08:00

162 lines
3.9 KiB
Go

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,
}
}