package api import ( "net/http" "slices" "gitea.tecamino.com/paadi/memberDB/models" "github.com/gin-gonic/gin" ) func (a *APIHandler) GetReport(c *gin.Context) { if !a.DBHandlerIsInitialized() { a.logger.Error("GetReport", "database handler is not initialized") c.JSON(http.StatusInternalServerError, nil) return } var err error var report models.Report var request models.ReportFilter err = c.BindJSON(&request) if err != nil { a.logger.Error("GetReport", err) c.JSON(http.StatusBadRequest, nil) return } if len(request.Date) == 0 { c.JSON(http.StatusOK, gin.H{ "data": report, }) return } var events []models.Event if len(request.Name) > 0 { events, err = a.DbHandler.GetEventByKey("name", request.Name, true) } else { events, err = a.DbHandler.GetEvent(0) } if err != nil { a.logger.Error("GetReport", err) c.JSON(http.StatusBadRequest, gin.H{ "message": err.Error(), }) return } report.Data = make(map[string]*models.Data) addedMember := make(map[uint]bool) if len(events) == 0 { c.JSON(http.StatusOK, gin.H{}) return } for _, e := range events { var includesDate bool if len(e.Date) < 10 { continue } for _, d := range request.Date { if len(d) < 10 { continue } else if d[:10] == e.Date[:10] { includesDate = true break } } if !includesDate { continue } attendanceLength := len(e.Attendees) total, ok := report.Data["total"] if !ok { total = models.AddNewData(attendanceLength) report.Data["total"] = total } data, ok := report.Data[e.Day] if !ok { data = models.AddNewData(attendanceLength) report.Data[e.Day] = data } data.AddData(attendanceLength) total.AddData(attendanceLength) for _, a := range e.Attendees { if _, ok := addedMember[a.Id]; ok { continue } report.Attendees = append(report.Attendees, a) addedMember[a.Id] = true } } // add all member not attended members, err := a.DbHandler.GetMember(0) if err != nil { a.logger.Error("GetReport", err) c.JSON(http.StatusBadRequest, gin.H{ "message": err.Error(), }) return } for _, m := range members { if _, ok := addedMember[m.Id]; ok { continue } else if len(request.Groups) > 0 { if m.Group == nil { continue } else if !slices.Contains(request.Groups, m.Group.Id) { continue } } report.NonAttendees = append(report.NonAttendees, &m) } c.JSON(http.StatusOK, gin.H{ "data": report, }) }