56 lines
1.8 KiB
Go
56 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
|
|
"git.cin.su/m/Assistant/contracts/continuity"
|
|
continuitydomain "git.cin.su/m/Assistant/modules/continuity/domain"
|
|
"git.cin.su/m/Assistant/platform/ids"
|
|
)
|
|
|
|
type reminderRepository interface {
|
|
Save(context.Context, continuity.ProspectiveItem) error
|
|
}
|
|
|
|
func registerCreatorReminderRoute(mux *http.ServeMux, identityClient creatorIdentityClient, repository reminderRepository) {
|
|
mux.HandleFunc("POST /v1/creator/reminders", func(w http.ResponseWriter, r *http.Request) {
|
|
session, err := identityClient.Session(r.Context(), r.Header.Get("Authorization"))
|
|
if errors.Is(err, errCreatorSessionDenied) {
|
|
http.Error(w, "creator session denied", http.StatusUnauthorized)
|
|
return
|
|
}
|
|
if err != nil {
|
|
http.Error(w, "identity service unavailable", http.StatusServiceUnavailable)
|
|
return
|
|
}
|
|
var request continuity.ScheduleReminderRequest
|
|
decoder := json.NewDecoder(http.MaxBytesReader(w, r.Body, 32<<10))
|
|
decoder.DisallowUnknownFields()
|
|
if err := decoder.Decode(&request); err != nil {
|
|
http.Error(w, "invalid reminder", http.StatusBadRequest)
|
|
return
|
|
}
|
|
request.OwnerPrincipalID = session.PrincipalID
|
|
id, err := ids.New()
|
|
if err != nil {
|
|
http.Error(w, "reminder unavailable", http.StatusServiceUnavailable)
|
|
return
|
|
}
|
|
item, err := continuitydomain.BuildReminder(request, continuity.ProspectiveItemID(id))
|
|
if err != nil {
|
|
http.Error(w, "invalid reminder", http.StatusBadRequest)
|
|
return
|
|
}
|
|
if err := repository.Save(r.Context(), item); err != nil {
|
|
http.Error(w, "save reminder", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusCreated)
|
|
_ = json.NewEncoder(w).Encode(continuity.ScheduleReminderResult{Item: item})
|
|
})
|
|
}
|