164 lines
4.4 KiB
Go
164 lines
4.4 KiB
Go
package v1
|
|
|
|
import (
|
|
"context"
|
|
"math"
|
|
"time"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"reichard.io/antholume/database"
|
|
)
|
|
|
|
// GET /progress
|
|
func (s *Server) GetProgressList(ctx context.Context, request GetProgressListRequestObject) (GetProgressListResponseObject, error) {
|
|
auth, ok := s.getSessionFromContext(ctx)
|
|
if !ok {
|
|
return GetProgressList401JSONResponse{Code: 401, Message: "Unauthorized"}, nil
|
|
}
|
|
|
|
page := int64(1)
|
|
if request.Params.Page != nil {
|
|
page = *request.Params.Page
|
|
}
|
|
|
|
limit := int64(15)
|
|
if request.Params.Limit != nil {
|
|
limit = *request.Params.Limit
|
|
}
|
|
|
|
filter := database.GetProgressParams{
|
|
UserID: auth.UserName,
|
|
Offset: (page - 1) * limit,
|
|
Limit: limit,
|
|
}
|
|
|
|
if request.Params.Document != nil && *request.Params.Document != "" {
|
|
filter.DocFilter = true
|
|
filter.DocumentID = *request.Params.Document
|
|
}
|
|
|
|
progress, err := s.db.Queries.GetProgress(ctx, filter)
|
|
if err != nil {
|
|
log.Error("GetProgress DB Error:", err)
|
|
return GetProgressList500JSONResponse{Code: 500, Message: "Database error"}, nil
|
|
}
|
|
|
|
total := int64(len(progress))
|
|
var nextPage *int64
|
|
var previousPage *int64
|
|
|
|
// Calculate total pages
|
|
totalPages := int64(math.Ceil(float64(total) / float64(limit)))
|
|
if page < totalPages {
|
|
nextPage = ptrOf(page + 1)
|
|
}
|
|
if page > 1 {
|
|
previousPage = ptrOf(page - 1)
|
|
}
|
|
|
|
apiProgress := make([]Progress, len(progress))
|
|
for i, row := range progress {
|
|
apiProgress[i] = Progress{
|
|
Title: row.Title,
|
|
Author: row.Author,
|
|
DeviceName: &row.DeviceName,
|
|
Percentage: &row.Percentage,
|
|
DocumentId: &row.DocumentID,
|
|
UserId: &row.UserID,
|
|
CreatedAt: parseTimePtr(row.CreatedAt),
|
|
}
|
|
}
|
|
|
|
response := ProgressListResponse{
|
|
Progress: &apiProgress,
|
|
Page: &page,
|
|
Limit: &limit,
|
|
NextPage: nextPage,
|
|
PreviousPage: previousPage,
|
|
Total: &total,
|
|
}
|
|
|
|
return GetProgressList200JSONResponse(response), nil
|
|
}
|
|
|
|
// GET /progress/{id}
|
|
func (s *Server) GetProgress(ctx context.Context, request GetProgressRequestObject) (GetProgressResponseObject, error) {
|
|
auth, ok := s.getSessionFromContext(ctx)
|
|
if !ok {
|
|
return GetProgress401JSONResponse{Code: 401, Message: "Unauthorized"}, nil
|
|
}
|
|
|
|
row, err := s.db.Queries.GetDocumentProgress(ctx, database.GetDocumentProgressParams{
|
|
UserID: auth.UserName,
|
|
DocumentID: request.Id,
|
|
})
|
|
if err != nil {
|
|
log.Error("GetDocumentProgress DB Error:", err)
|
|
return GetProgress404JSONResponse{Code: 404, Message: "Progress not found"}, nil
|
|
}
|
|
|
|
apiProgress := Progress{
|
|
DeviceName: &row.DeviceName,
|
|
DeviceId: &row.DeviceID,
|
|
Percentage: &row.Percentage,
|
|
Progress: &row.Progress,
|
|
DocumentId: &row.DocumentID,
|
|
UserId: &row.UserID,
|
|
CreatedAt: parseTimePtr(row.CreatedAt),
|
|
}
|
|
|
|
response := ProgressResponse{
|
|
Progress: &apiProgress,
|
|
}
|
|
|
|
return GetProgress200JSONResponse(response), nil
|
|
}
|
|
|
|
// PUT /progress
|
|
func (s *Server) UpdateProgress(ctx context.Context, request UpdateProgressRequestObject) (UpdateProgressResponseObject, error) {
|
|
auth, ok := s.getSessionFromContext(ctx)
|
|
if !ok {
|
|
return UpdateProgress401JSONResponse{Code: 401, Message: "Unauthorized"}, nil
|
|
}
|
|
|
|
if request.Body == nil {
|
|
return UpdateProgress400JSONResponse{Code: 400, Message: "Request body is required"}, nil
|
|
}
|
|
|
|
if _, err := s.db.Queries.UpsertDevice(ctx, database.UpsertDeviceParams{
|
|
ID: request.Body.DeviceId,
|
|
UserID: auth.UserName,
|
|
DeviceName: request.Body.DeviceName,
|
|
LastSynced: time.Now().UTC().Format(time.RFC3339),
|
|
}); err != nil {
|
|
log.Error("UpsertDevice DB Error:", err)
|
|
return UpdateProgress500JSONResponse{Code: 500, Message: "Database error"}, nil
|
|
}
|
|
|
|
if _, err := s.db.Queries.UpsertDocument(ctx, database.UpsertDocumentParams{
|
|
ID: request.Body.DocumentId,
|
|
}); err != nil {
|
|
log.Error("UpsertDocument DB Error:", err)
|
|
return UpdateProgress500JSONResponse{Code: 500, Message: "Database error"}, nil
|
|
}
|
|
|
|
progress, err := s.db.Queries.UpdateProgress(ctx, database.UpdateProgressParams{
|
|
Percentage: request.Body.Percentage,
|
|
DocumentID: request.Body.DocumentId,
|
|
DeviceID: request.Body.DeviceId,
|
|
UserID: auth.UserName,
|
|
Progress: request.Body.Progress,
|
|
})
|
|
if err != nil {
|
|
log.Error("UpdateProgress DB Error:", err)
|
|
return UpdateProgress400JSONResponse{Code: 400, Message: "Invalid request"}, nil
|
|
}
|
|
|
|
response := UpdateProgressResponse{
|
|
DocumentId: progress.DocumentID,
|
|
Timestamp: parseTime(progress.CreatedAt),
|
|
}
|
|
|
|
return UpdateProgress200JSONResponse(response), nil
|
|
}
|