diff --git a/app/events/delivery/http/event.go b/app/events/delivery/http/event.go index 6d607b6..a59288f 100644 --- a/app/events/delivery/http/event.go +++ b/app/events/delivery/http/event.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/gorilla/mux" + "github.com/hammer-code/lms-be/constants" "github.com/hammer-code/lms-be/domain" "github.com/hammer-code/lms-be/pkg/ngelog" "github.com/hammer-code/lms-be/utils" @@ -268,7 +269,7 @@ func (h Handler) List(w http.ResponseWriter, r *http.Request) { data, pagination, err := h.usecase.GetEvents(r.Context(), domain.EventFilter{ Title: r.URL.Query().Get("title"), - Type: r.URL.Query().Get("type"), + Type: constants.EventType(r.URL.Query().Get("type")), Status: r.URL.Query().Get("status"), StartDate: startDate, EndDate: endDate, @@ -323,7 +324,7 @@ func (h Handler) GetEvents(w http.ResponseWriter, r *http.Request) { endDate, _ := utils.ParseDate(r.URL.Query().Get("end_date")) data, pagination, err := h.usecase.GetEvents(r.Context(), domain.EventFilter{ Title: r.URL.Query().Get("title"), - Type: r.URL.Query().Get("type"), + Type: constants.EventType(r.URL.Query().Get("type")), Status: r.URL.Query().Get("status"), StartDate: startDate, EndDate: endDate, diff --git a/app/events/delivery/http/list_registration.go b/app/events/delivery/http/list_registration.go index 971402b..58925ed 100644 --- a/app/events/delivery/http/list_registration.go +++ b/app/events/delivery/http/list_registration.go @@ -3,6 +3,7 @@ package http import ( "net/http" + "github.com/hammer-code/lms-be/constants" "github.com/hammer-code/lms-be/domain" "github.com/hammer-code/lms-be/pkg/ngelog" "github.com/hammer-code/lms-be/utils" @@ -20,6 +21,7 @@ import ( // @Param start_date query string false "string" // @Param end_date query string false "string" // @Param status query string false "string" +// @Param type query string false "string" // @Failure 400 {object} domain.HttpResponse // @Failure 500 {object} domain.HttpResponse // @Success 200 {object} []domain.RegistrationEvent @@ -39,6 +41,7 @@ func (h Handler) ListRegistration(w http.ResponseWriter, r *http.Request) { data, pagination, err := h.usecase.ListRegistration(r.Context(), domain.EventFilter{ Status: r.URL.Query().Get("status"), + Type: constants.EventType(r.URL.Query().Get("type")), StartDate: startDate, EndDate: endDate, FilterPagination: flterPagination, diff --git a/app/events/repository/list_registration.go b/app/events/repository/list_registration.go index 1f4204c..d5f971f 100644 --- a/app/events/repository/list_registration.go +++ b/app/events/repository/list_registration.go @@ -7,22 +7,30 @@ import ( ) func (repo *repository) ListRegistration(ctx context.Context, filter domain.EventFilter, email string) (tData int, data []domain.RegistrationEvent, err error) { - db := repo.db.DB(ctx).Model(&domain.RegistrationEvent{}) + db := repo.db.DB(ctx).Model(&domain.RegistrationEvent{}). + Preload("Event"). + Preload("Event.Tags"). + Preload("Event.Speakers") if filter.Status != "" { - db = db.Where("status = ?", filter.Status) + db = db.Where("registration_events.status = ?", filter.Status) + } + + if filter.Type != "" { + db = db.Joins("JOIN events ON events.id = registration_events.event_id"). + Where("events.type = ?", filter.Type) } if filter.StartDate.Valid { - db = db.Where("start_date > ?", filter.StartDate) + db = db.Where("registration_events.created_at >= ?", filter.StartDate) } if filter.EndDate.Valid { - db = db.Where("end_date < ?", filter.EndDate) + db = db.Where("registration_events.created_at <= ?", filter.EndDate) } if email != "" { - db = db.Where("email = ?", email) + db = db.Where("registration_events.email = ?", email) } var totalData int64 diff --git a/app/events/usecase/create_event.go b/app/events/usecase/create_event.go index f9c748a..30f0b3e 100644 --- a/app/events/usecase/create_event.go +++ b/app/events/usecase/create_event.go @@ -4,11 +4,16 @@ import ( "context" "errors" + "github.com/hammer-code/lms-be/constants" "github.com/hammer-code/lms-be/domain" "github.com/hammer-code/lms-be/utils" ) func (uc usecase) CreateEvent(ctx context.Context, payload domain.CreateEventPayload) error { + if !constants.IsValidEventType(payload.Type) { + return utils.NewBadRequestError(ctx, "Sorry, invalid event type", errors.New("event type is not valid")) + } + dataImage, err := uc.imageRepository.GetImage(ctx, payload.FileName) if err != nil { err = utils.NewInternalServerError(ctx, err) diff --git a/app/events/usecase/list_registration_event.go b/app/events/usecase/list_registration_event.go index 4773c26..d803335 100644 --- a/app/events/usecase/list_registration_event.go +++ b/app/events/usecase/list_registration_event.go @@ -23,6 +23,11 @@ func (uc usecase) ListRegistration(ctx context.Context, filter domain.EventFilte for i, data := range datas { datas[i].ImageProofPayment = fmt.Sprintf("%s/api/v1/public/storage/images/%s", baseURL, data.ImageProofPayment) + + // Update event image URL + if datas[i].Event.Image != "" { + datas[i].Event.Image = fmt.Sprintf("%s/api/v1/public/storage/images/%s", baseURL, datas[i].Event.Image) + } } return datas, domain.NewPagination(tData, filter.FilterPagination), err diff --git a/app/events/usecase/update_event.go b/app/events/usecase/update_event.go index 89ca980..c61251c 100644 --- a/app/events/usecase/update_event.go +++ b/app/events/usecase/update_event.go @@ -2,14 +2,20 @@ package usecase import ( "context" + "errors" "time" + "github.com/hammer-code/lms-be/constants" "github.com/hammer-code/lms-be/domain" "github.com/hammer-code/lms-be/utils" "gopkg.in/guregu/null.v4" ) func (uc usecase) UpdateEvent(ctx context.Context, id uint, payload domain.UpdateEventPayload) error { + if !constants.IsValidEventType(payload.Type) { + return utils.NewBadRequestError(ctx, "Sorry, invalid event type", errors.New("event type is not valid")) + } + err := uc.repository.UpdateEvent(ctx, domain.Event{ ID: id, Title: payload.Title, diff --git a/constants/event.go b/constants/event.go index 4a52eb9..b82e5cd 100644 --- a/constants/event.go +++ b/constants/event.go @@ -5,3 +5,29 @@ const ( Soon = "soon" Closed = "closed" ) + +type EventType string + +const ( + EventTypeConference EventType = "Conference" + EventTypeTechTalk EventType = "Tech Talk" + EventTypeNgobar EventType = "Ngobar" +) + +func GetValidEventTypes() []EventType { + return []EventType{ + EventTypeConference, + EventTypeTechTalk, + EventTypeNgobar, + } +} + +func IsValidEventType(eventType EventType) bool { + validTypes := GetValidEventTypes() + for _, validType := range validTypes { + if validType == eventType { + return true + } + } + return false +} diff --git a/domain/event.go b/domain/event.go index 10115e2..97d2895 100644 --- a/domain/event.go +++ b/domain/event.go @@ -5,6 +5,7 @@ import ( "net/http" "time" + "github.com/hammer-code/lms-be/constants" "gopkg.in/guregu/null.v4" ) @@ -67,23 +68,23 @@ type Event struct { Author string `json:"author"` Image string `json:"image"` Date null.Time `json:"date"` - Type string `json:"type"` + Type constants.EventType `json:"type"` Location string `json:"location"` Duration string `json:"duration"` Capacity int `json:"capacity"` - Status string `json:"status"` // comming soon - Tags []EventTag `gorm:"foreignKey:EventID;constraint:OnDelete:CASCADE;"` // Ensure foreign key is correctly referenced - Speakers []EventSpeaker `gorm:"foreignKey:EventID;constraint:OnDelete:CASCADE;"` // Ensure foreign key is correctly referenced + Status string `json:"status"` + Tags []EventTag `json:"tags" gorm:"foreignKey:EventID;constraint:OnDelete:CASCADE;"` + Speakers []EventSpeaker `json:"speakers" gorm:"foreignKey:EventID;constraint:OnDelete:CASCADE;"` RegistrationLink string `json:"registration_link"` Price float64 `json:"price"` // 0 == free - CreatedBy int `json:"created_by"` - UpdatedBy int `json:"updated_by"` - DeletedBy int `json:"deleted_by"` + CreatedBy int `json:"-"` + UpdatedBy int `json:"-"` + DeletedBy int `json:"-"` ReservationStartDate null.Time `json:"reservation_start_date"` ReservationEndDate null.Time `json:"reservation_end_date"` CreatedAt time.Time `json:"created_at"` - UpdatedAt null.Time `json:"updated_at"` - DeletedAt null.Time `json:"deleted_at"` + UpdatedAt null.Time `json:"-"` + DeletedAt null.Time `json:"-"` AdditionalLink string `json:"additional_link"` } @@ -119,7 +120,7 @@ type CreateEventPayload struct { Slug string `json:"slug" validate:"required"` IsOnline string `json:"is_online" validate:"required"` Date null.Time `json:"date" validate:"required"` - Type string `json:"type" validate:"required"` + Type constants.EventType `json:"type" validate:"required"` Location string `json:"location" validate:"required"` Duration string `json:"duration" validate:"required"` Status string `json:"status" validate:"required"` @@ -141,7 +142,7 @@ type UpdateEventPayload struct { Slug string `json:"slug" validate:"required"` IsOnline string `json:"is_online" validate:"required"` Date null.Time `json:"date" validate:"required"` - Type string `json:"type" validate:"required"` + Type constants.EventType `json:"type" validate:"required"` Location string `json:"location" validate:"required"` Duration string `json:"duration" validate:"required"` Status string `json:"status" validate:"required"` @@ -162,7 +163,7 @@ type EventDTO struct { Author string `json:"author"` ImageEvent string `json:"image_event"` DateEvent null.Time `json:"date_event"` - Type string `json:"type"` + Type constants.EventType `json:"type"` Location string `json:"location"` Duration string `json:"duration"` Capacity int `json:"capacity"` @@ -175,7 +176,7 @@ type UpdateEvenPayload struct { Author string `json:"author"` ImageEvent string `json:"image_event"` DateEvent null.Time `json:"date_event"` - Type string `json:"type"` + Type constants.EventType `json:"type"` Location string `json:"location"` Duration string `json:"duration"` Capacity int `json:"capacity"` @@ -185,7 +186,7 @@ type UpdateEvenPayload struct { type EventFilter struct { ID uint Title string - Type string + Type constants.EventType Status string StartDate null.Time EndDate null.Time @@ -228,13 +229,14 @@ type RegistrationEvent struct { ImageProofPayment string `json:"image_proof_payment"` PaymentDate null.Time `json:"payment_date"` Status string `json:"status"` // register, pay, approve/cancel/decline - UpToYou string `json:"up_to_you"` - CreatedByUserID int `json:"created_by_user_id"` - UpdatedByUserID int `json:"updated_by_user_id"` - DeletedByUserID int `json:"deleted_by_user_id"` + UpToYou string `json:"-"` + CreatedByUserID int `json:"-"` + UpdatedByUserID int `json:"-"` + DeletedByUserID int `json:"-"` CreatedAt time.Time `json:"created_at"` - UpdatedAt null.Time `json:"updated_at"` - DeletedAt null.Time `json:"deleted_at"` + UpdatedAt null.Time `json:"-"` + DeletedAt null.Time `json:"-"` + Event Event `json:"event_detail" gorm:"foreignKey:EventID"` } func (RegistrationEvent) TableName() string {