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}) }) }