Skip to content

Commit

Permalink
Merge pull request #13 from SwimResults/develop
Browse files Browse the repository at this point in the history
registration backend preparation; fix delay not working with random event number order
  • Loading branch information
konrad2002 authored Jun 5, 2024
2 parents 6acfca5 + 5c8f846 commit 1dc5f8d
Show file tree
Hide file tree
Showing 7 changed files with 364 additions and 5 deletions.
1 change: 1 addition & 0 deletions controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ func Run() {
heatController()
disqualificationController()
resultController()
registrationController()

router.GET("/actuator", actuator)

Expand Down
31 changes: 31 additions & 0 deletions controller/heat_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"net/http"
"strconv"
"time"
)

func heatController() {
Expand All @@ -26,6 +27,7 @@ func heatController() {

router.POST("/heat", addHeat)
router.POST("/heat/import", importHeat)
router.POST("/heat/meet/:meet_id/event/:event_id/start_estimation_date", updateHeatsStartEstimationDate)
router.POST("/heat/:id/time", updateHeatTime)

router.PUT("/heat", updateHeat)
Expand Down Expand Up @@ -287,3 +289,32 @@ func updateHeatTime(c *gin.Context) {

c.IndentedJSON(http.StatusOK, r)
}

func updateHeatsStartEstimationDate(c *gin.Context) {
meeting := c.Param("meet_id")

if meeting == "" {
c.String(http.StatusBadRequest, "no meeting id given")
return
}

event, err1 := strconv.Atoi(c.Param("event_id"))
if err1 != nil {
c.IndentedJSON(http.StatusBadRequest, gin.H{"message": "given event_id is not of type number"})
return
}

var request time.Time
if err := c.BindJSON(&request); err != nil {
c.IndentedJSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return
}

info, err := service.UpdateHeatsEstimationDateByMeetingAndEvent(meeting, event, request)
if err != nil {
c.IndentedJSON(http.StatusNotFound, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusOK, info)
}
125 changes: 125 additions & 0 deletions controller/registration_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package controller

import (
"github.com/gin-gonic/gin"
"github.com/swimresults/start-service/model"
"github.com/swimresults/start-service/service"
"go.mongodb.org/mongo-driver/bson/primitive"
"net/http"
)

func registrationController() {
router.GET("/registration/:id", getRegistration)

router.GET("/registration/meet/:meet_id", getRegistrationsByMeeting)
router.GET("/registration/meet/:meet_id/me", getRegistrationsByMeetingForMe)

router.POST("/registration", addRegistration)

router.PUT("/registration", updateRegistration)
router.DELETE("/registration/:id", removeRegistration)
}

func getRegistration(c *gin.Context) {
id, convErr := primitive.ObjectIDFromHex(c.Param("id"))
if convErr != nil {
c.IndentedJSON(http.StatusBadRequest, gin.H{"message": "given id was not of type ObjectID"})
return
}

registration, err := service.GetRegistrationById(id)
if err != nil {
c.IndentedJSON(http.StatusNotFound, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusOK, registration)
}

func getRegistrationsByMeeting(c *gin.Context) {
meeting := c.Param("meet_id")

if meeting == "" {
c.String(http.StatusBadRequest, "no meeting id given")
return
}

registrations, err := service.GetRegistrationsByMeeting(meeting)
if err != nil {
c.IndentedJSON(http.StatusNotFound, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusOK, registrations)
}

func getRegistrationsByMeetingForMe(c *gin.Context) {
meeting := c.Param("meet_id")

if meeting == "" {
c.String(http.StatusBadRequest, "no meeting id given")
return
}

id, convErr := primitive.ObjectIDFromHex(c.Query("user_id"))
if convErr != nil {
c.IndentedJSON(http.StatusBadRequest, gin.H{"message": "given id was not of type ObjectID"})
return
}

registrations, err := service.GetRegistrationByMeetingAndUser(meeting, id)
if err != nil {
c.IndentedJSON(http.StatusNotFound, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusOK, registrations)
}

func removeRegistration(c *gin.Context) {
id, convErr := primitive.ObjectIDFromHex(c.Param("id"))
if convErr != nil {
c.IndentedJSON(http.StatusBadRequest, gin.H{"message": "given id was not of type ObjectID"})
return
}

err := service.RemoveRegistrationById(id)
if err != nil {
c.IndentedJSON(http.StatusNotFound, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusNoContent, "")
}

func addRegistration(c *gin.Context) {
var registration model.Registration
if err := c.BindJSON(&registration); err != nil {
c.IndentedJSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return
}

r, err := service.AddRegistration(registration)
if err != nil {
c.IndentedJSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusOK, r)
}

func updateRegistration(c *gin.Context) {
var registration model.Registration
if err := c.BindJSON(&registration); err != nil {
c.IndentedJSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return
}

r, err := service.UpdateRegistration(registration)
if err != nil {
c.IndentedJSON(http.StatusNotFound, gin.H{"message": err.Error()})
return
}

c.IndentedJSON(http.StatusOK, r)
}
31 changes: 31 additions & 0 deletions model/registration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package model

import (
"github.com/swimresults/athlete-service/model"
"go.mongodb.org/mongo-driver/bson/primitive"
"time"
)

type Registration struct {
Identifier primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
Meeting string `json:"meeting" bson:"meeting"`
CreatorUserId primitive.ObjectID `json:"creator_user_id,omitempty" bson:"creator_user_id,omitempty"`
Address model.Address `json:"address,omitempty" bson:"address,omitempty"`
Contact model.Contact `json:"contact,omitempty" bson:"contact,omitempty"`
AthleteRegistrations []AthleteRegistration `json:"athlete_registrations" bson:"athlete_registrations"`
AddedAt time.Time `json:"added_at,omitempty" bson:"added_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty" bson:"updated_at,omitempty"`
}

type AthleteRegistration struct {
AthleteId primitive.ObjectID `json:"athlete_id,omitempty" bson:"athlete_id,omitempty"`
AthleteFirstName string `json:"athlete_first_name,omitempty" bson:"athlete_first_name,omitempty"`
AthleteLastName string `json:"athlete_last_name,omitempty" bson:"athlete_last_name,omitempty"`
AthleteYear int `json:"athlete_year,omitempty" bson:"athlete_year,omitempty"`
StartRegistrations []StartRegistration `json:"start_registrations" bson:"start_registrations"`
}

type StartRegistration struct {
Event int `json:"event" bson:"event"`
RegistrationTime time.Duration `json:"registration_time" bson:"registration_time"`
}
57 changes: 52 additions & 5 deletions service/heat_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func getHeatsByBsonDocumentWithOptions(d interface{}, fOps options.FindOptions,
if heat.StartDelayEstimation.IsZero() {
// no time information in current heat, calculating delay
if fetchDelay {
delay, e := getDelayForHeat(heat.Meeting, heat.Event, heat.Number)
delay, e := getDelayForHeat(heat)
if e == nil {
// add delay to estimation
heat.StartDelayEstimation = heat.StartEstimation.Add(*delay)
Expand Down Expand Up @@ -110,6 +110,10 @@ func GetHeatsByMeeting(id string) ([]model.Heat, error) {
return getHeatsByBsonDocument(bson.D{{"meeting", id}})
}

func GetHeatsByMeetingAndEvent(id string, event int) ([]model.Heat, error) {
return getHeatsByBsonDocument(bson.D{{"meeting", id}, {"event", event}})
}

func GetHeatById(id primitive.ObjectID) (model.Heat, error) {
return getHeatByBsonDocument(bson.D{{"_id", id}})
}
Expand Down Expand Up @@ -227,7 +231,7 @@ func GetHeatInfoByMeeting(meeting string) (dto.MeetingHeatInfoDto, error) {

// returns delay of previous heat with delay information as time.Duration
// positive number, if heat is delayed
func getDelayForHeat(meeting string, event int, heatNumber int) (delay *time.Duration, err error) {
func getDelayForHeat(heat model.Heat) (delay *time.Duration, err error) {

fmt.Println("need to fetch delay")

Expand All @@ -238,8 +242,9 @@ func getDelayForHeat(meeting string, event int, heatNumber int) (delay *time.Dur
// ((smaller event) OR (same event, smaller heat)) AND ((start_delay_estimation exists) OR (started_at exists))
bson.M{
"$and": []interface{}{
bson.M{"meeting": meeting},
bson.M{
bson.M{"meeting": heat.Meeting},
// old way of finding previous heats, but event numbers can be not in order
/*bson.M{
"$or": []interface{}{
bson.M{
"event": bson.M{"$lt": event},
Expand All @@ -249,6 +254,10 @@ func getDelayForHeat(meeting string, event int, heatNumber int) (delay *time.Dur
"number": bson.M{"$lt": heatNumber},
},
},
},*/
// new way with time estimation…
bson.M{
"start_estimation": bson.M{"$lt": heat.StartEstimation},
},
bson.M{
"$or": []interface{}{
Expand All @@ -259,7 +268,8 @@ func getDelayForHeat(meeting string, event int, heatNumber int) (delay *time.Dur
},
},
//options.FindOptions{},
*options.Find().SetLimit(1).SetSort(bson.D{{"event", -1}, {"number", -1}}),
//*options.Find().SetLimit(1).SetSort(bson.D{{"event", -1}, {"number", -1}}),
*options.Find().SetLimit(1).SetSort(bson.D{{"start_estimation", -1}}),
false)

if err1 != nil {
Expand Down Expand Up @@ -401,3 +411,40 @@ func UpdateHeatTimes(id primitive.ObjectID, time time.Time, timeType string) (mo

return UpdateHeat(heat)
}

func UpdateHeatsEstimationDateByMeetingAndEvent(meeting string, event int, t time.Time) ([]model.Heat, error) {
heats, err := GetHeatsByMeetingAndEvent(meeting, event)
if err != nil {
return []model.Heat{}, err
}

var savedHeats []model.Heat

for _, heat := range heats {
t2 := heat.StartEstimation

heat.StartEstimation = time.Date(t.Year(), t.Month(), t.Day(), t2.Hour(), t2.Minute(), t2.Second(), t2.Nanosecond(), t2.Location())

saved, err := UpdateHeat(heat)
if err != nil {
return []model.Heat{}, err
}

savedHeats = append(savedHeats, saved)
}

return savedHeats, nil
}

func UpdateHeatEstimationDate(id primitive.ObjectID, t time.Time) (model.Heat, error) {
heat, err := GetHeatById(id)
if err != nil {
return model.Heat{}, err
}

t2 := heat.StartEstimation

heat.StartEstimation = time.Date(t.Year(), t.Month(), t.Day(), t2.Hour(), t2.Minute(), t2.Second(), t2.Nanosecond(), t2.Location())

return UpdateHeat(heat)
}
Loading

0 comments on commit 1dc5f8d

Please sign in to comment.