3
0

Add reminder routes

This commit is contained in:
Tomaž Jerman
2019-09-24 09:23:45 +02:00
parent 15cb72c880
commit 33ad6c878b
8 changed files with 1267 additions and 0 deletions

View File

@@ -1593,5 +1593,206 @@
}
}
]
},
{
"title": "Reminders",
"entrypoint": "reminder",
"path": "/reminder",
"authentication": [
"Client ID",
"Session ID"
],
"struct": [
{
"imports": [
"sqlxTypes github.com/jmoiron/sqlx/types",
"time"
]
}
],
"apis": [
{
"name": "list",
"method": "GET",
"title": "List/read reminders",
"path": "/",
"parameters": {
"get": [
{
"name": "resource",
"required": false,
"title": "Only reminders of a specific resource",
"type": "string"
},
{
"name": "assignedTo",
"required": false,
"title": "Only reminders for a given user",
"type": "uint64"
},
{
"name": "page",
"type": "uint",
"required": false,
"title": "Page number (1 based)"
},
{
"name": "perPage",
"type": "uint",
"required": false,
"title": "Returned items per page (default 50)"
}
]
}
},
{
"name": "create",
"method": "POST",
"title": "Add new reminder",
"path": "/",
"parameters": {
"post": [
{
"name": "resource",
"title": "Resource",
"type": "string",
"required": true
},
{
"name": "assignedTo",
"title": "Assigned To",
"type": "uint64",
"required": true
},
{
"name": "payload",
"title": "Payload",
"type": "sqlxTypes.JSONText",
"required": true
},
{
"name": "remindAt",
"title": "Remind At",
"type": "time.Time",
"required": true
}
]
}
},
{
"name": "update",
"method": "PUT",
"title": "Update reminder",
"path": "/{reminderID}",
"parameters": {
"path": [
{
"type": "uint64",
"name": "reminderID",
"required": true,
"title": "Reminder ID"
}
],
"post": [
{
"name": "resource",
"title": "Resource",
"type": "string",
"required": true
},
{
"name": "assignedTo",
"title": "Assigned To",
"type": "uint64",
"required": true
},
{
"name": "payload",
"title": "Payload",
"type": "sqlxTypes.JSONText",
"required": true
},
{
"name": "remindAt",
"title": "Remind At",
"type": "time.Time",
"required": true
}
]
}
},
{
"name": "read",
"method": "GET",
"title": "Read reminder by ID",
"path": "/{reminderID}",
"parameters": {
"path": [
{
"type": "uint64",
"name": "reminderID",
"required": true,
"title": "Reminder ID"
}
]
}
},
{
"name": "delete",
"method": "DELETE",
"title": "Delete reminder",
"path": "/{reminderID}",
"parameters": {
"path": [
{
"type": "uint64",
"name": "reminderID",
"required": true,
"title": "Reminder ID"
}
]
}
},
{
"name": "dismiss",
"method": "PATCH",
"title": "Dismiss reminder",
"path": "/{reminderID}/dismiss",
"parameters": {
"path": [
{
"type": "uint64",
"name": "reminderID",
"required": true,
"title": "reminder ID"
}
]
}
},
{
"name": "snooze",
"method": "PATCH",
"title": "Snooze reminder",
"path": "/{reminderID}/snooze",
"parameters": {
"path": [
{
"type": "uint64",
"name": "reminderID",
"required": true,
"title": "reminder ID"
}
],
"post": [
{
"type": "time.Time",
"name": "remindAt",
"required": true,
"title": "New Remind At Time"
}
]
}
}
]
}
]

View File

@@ -0,0 +1,203 @@
{
"Title": "Reminders",
"Interface": "Reminder",
"Struct": [
{
"imports": [
"sqlxTypes github.com/jmoiron/sqlx/types",
"time"
]
}
],
"Parameters": null,
"Protocol": "",
"Authentication": [
"Client ID",
"Session ID"
],
"Path": "/reminder",
"APIs": [
{
"Name": "list",
"Method": "GET",
"Title": "List/read reminders",
"Path": "/",
"Parameters": {
"get": [
{
"name": "resource",
"required": false,
"title": "Only reminders of a specific resource",
"type": "string"
},
{
"name": "assignedTo",
"required": false,
"title": "Only reminders for a given user",
"type": "uint64"
},
{
"name": "page",
"required": false,
"title": "Page number (1 based)",
"type": "uint"
},
{
"name": "perPage",
"required": false,
"title": "Returned items per page (default 50)",
"type": "uint"
}
]
}
},
{
"Name": "create",
"Method": "POST",
"Title": "Add new reminder",
"Path": "/",
"Parameters": {
"post": [
{
"name": "resource",
"required": true,
"title": "Resource",
"type": "string"
},
{
"name": "assignedTo",
"required": true,
"title": "Assigned To",
"type": "uint64"
},
{
"name": "payload",
"required": true,
"title": "Payload",
"type": "sqlxTypes.JSONText"
},
{
"name": "remindAt",
"required": true,
"title": "Remind At",
"type": "time.Time"
}
]
}
},
{
"Name": "update",
"Method": "PUT",
"Title": "Update reminder",
"Path": "/{reminderID}",
"Parameters": {
"path": [
{
"name": "reminderID",
"required": true,
"title": "Reminder ID",
"type": "uint64"
}
],
"post": [
{
"name": "resource",
"required": true,
"title": "Resource",
"type": "string"
},
{
"name": "assignedTo",
"required": true,
"title": "Assigned To",
"type": "uint64"
},
{
"name": "payload",
"required": true,
"title": "Payload",
"type": "sqlxTypes.JSONText"
},
{
"name": "remindAt",
"required": true,
"title": "Remind At",
"type": "time.Time"
}
]
}
},
{
"Name": "read",
"Method": "GET",
"Title": "Read reminder by ID",
"Path": "/{reminderID}",
"Parameters": {
"path": [
{
"name": "reminderID",
"required": true,
"title": "Reminder ID",
"type": "uint64"
}
]
}
},
{
"Name": "delete",
"Method": "DELETE",
"Title": "Delete reminder",
"Path": "/{reminderID}",
"Parameters": {
"path": [
{
"name": "reminderID",
"required": true,
"title": "Reminder ID",
"type": "uint64"
}
]
}
},
{
"Name": "dismiss",
"Method": "PATCH",
"Title": "Dismiss reminder",
"Path": "/{reminderID}/dismiss",
"Parameters": {
"path": [
{
"name": "reminderID",
"required": true,
"title": "reminder ID",
"type": "uint64"
}
]
}
},
{
"Name": "snooze",
"Method": "PATCH",
"Title": "Snooze reminder",
"Path": "/{reminderID}/snooze",
"Parameters": {
"path": [
{
"name": "reminderID",
"required": true,
"title": "reminder ID",
"type": "uint64"
}
],
"post": [
{
"name": "remindAt",
"required": true,
"title": "New Remind At Time",
"type": "time.Time"
}
]
}
}
]
}

View File

@@ -689,6 +689,132 @@ Organisations represent a top-level grouping entity. There may be many organisat
# Reminders
| Method | Endpoint | Purpose |
| ------ | -------- | ------- |
| `GET` | `/reminder/` | List/read reminders |
| `POST` | `/reminder/` | Add new reminder |
| `PUT` | `/reminder/{reminderID}` | Update reminder |
| `GET` | `/reminder/{reminderID}` | Read reminder by ID |
| `DELETE` | `/reminder/{reminderID}` | Delete reminder |
| `PATCH` | `/reminder/{reminderID}/dismiss` | Dismiss reminder |
| `PATCH` | `/reminder/{reminderID}/snooze` | Snooze reminder |
## List/read reminders
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/` | HTTP/S | GET | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| resource | string | GET | Only reminders of a specific resource | N/A | NO |
| assignedTo | uint64 | GET | Only reminders for a given user | N/A | NO |
| page | uint | GET | Page number (1 based) | N/A | NO |
| perPage | uint | GET | Returned items per page (default 50) | N/A | NO |
## Add new reminder
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/` | HTTP/S | POST | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| resource | string | POST | Resource | N/A | YES |
| assignedTo | uint64 | POST | Assigned To | N/A | YES |
| payload | sqlxTypes.JSONText | POST | Payload | N/A | YES |
| remindAt | time.Time | POST | Remind At | N/A | YES |
## Update reminder
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/{reminderID}` | HTTP/S | PUT | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| reminderID | uint64 | PATH | Reminder ID | N/A | YES |
| resource | string | POST | Resource | N/A | YES |
| assignedTo | uint64 | POST | Assigned To | N/A | YES |
| payload | sqlxTypes.JSONText | POST | Payload | N/A | YES |
| remindAt | time.Time | POST | Remind At | N/A | YES |
## Read reminder by ID
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/{reminderID}` | HTTP/S | GET | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| reminderID | uint64 | PATH | Reminder ID | N/A | YES |
## Delete reminder
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/{reminderID}` | HTTP/S | DELETE | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| reminderID | uint64 | PATH | Reminder ID | N/A | YES |
## Dismiss reminder
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/{reminderID}/dismiss` | HTTP/S | PATCH | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| reminderID | uint64 | PATH | reminder ID | N/A | YES |
## Snooze reminder
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/reminder/{reminderID}/snooze` | HTTP/S | PATCH | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| reminderID | uint64 | PATH | reminder ID | N/A | YES |
| remindAt | time.Time | POST | New Remind At Time | N/A | YES |
---
# Roles
An organisation may have many roles. Roles may have many channels available. Access to channels may be shared between roles.

View File

@@ -0,0 +1,208 @@
package handlers
/*
Hello! This file is auto-generated from `docs/src/spec.json`.
For development:
In order to update the generated files, edit this file under the location,
add your struct fields, imports, API definitions and whatever you want, and:
1. run [spec](https://github.com/titpetric/spec) in the same folder,
2. run `./_gen.php` in this folder.
You may edit `reminder.go`, `reminder.util.go` or `reminder_test.go` to
implement your API calls, helper functions and tests. The file `reminder.go`
is only generated the first time, and will not be overwritten if it exists.
*/
import (
"context"
"net/http"
"github.com/go-chi/chi"
"github.com/titpetric/factory/resputil"
"github.com/cortezaproject/corteza-server/pkg/logger"
"github.com/cortezaproject/corteza-server/system/rest/request"
)
// Internal API interface
type ReminderAPI interface {
List(context.Context, *request.ReminderList) (interface{}, error)
Create(context.Context, *request.ReminderCreate) (interface{}, error)
Update(context.Context, *request.ReminderUpdate) (interface{}, error)
Read(context.Context, *request.ReminderRead) (interface{}, error)
Delete(context.Context, *request.ReminderDelete) (interface{}, error)
Dismiss(context.Context, *request.ReminderDismiss) (interface{}, error)
Snooze(context.Context, *request.ReminderSnooze) (interface{}, error)
}
// HTTP API interface
type Reminder struct {
List func(http.ResponseWriter, *http.Request)
Create func(http.ResponseWriter, *http.Request)
Update func(http.ResponseWriter, *http.Request)
Read func(http.ResponseWriter, *http.Request)
Delete func(http.ResponseWriter, *http.Request)
Dismiss func(http.ResponseWriter, *http.Request)
Snooze func(http.ResponseWriter, *http.Request)
}
func NewReminder(h ReminderAPI) *Reminder {
return &Reminder{
List: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderList()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.List", r, err)
resputil.JSON(w, err)
return
}
value, err := h.List(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.List", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.List", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
Create: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderCreate()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.Create", r, err)
resputil.JSON(w, err)
return
}
value, err := h.Create(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.Create", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.Create", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
Update: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderUpdate()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.Update", r, err)
resputil.JSON(w, err)
return
}
value, err := h.Update(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.Update", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.Update", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
Read: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderRead()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.Read", r, err)
resputil.JSON(w, err)
return
}
value, err := h.Read(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.Read", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.Read", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
Delete: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderDelete()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.Delete", r, err)
resputil.JSON(w, err)
return
}
value, err := h.Delete(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.Delete", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.Delete", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
Dismiss: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderDismiss()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.Dismiss", r, err)
resputil.JSON(w, err)
return
}
value, err := h.Dismiss(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.Dismiss", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.Dismiss", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
Snooze: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewReminderSnooze()
if err := params.Fill(r); err != nil {
logger.LogParamError("Reminder.Snooze", r, err)
resputil.JSON(w, err)
return
}
value, err := h.Snooze(r.Context(), params)
if err != nil {
logger.LogControllerError("Reminder.Snooze", r, err, params.Auditable())
resputil.JSON(w, err)
return
}
logger.LogControllerCall("Reminder.Snooze", r, params.Auditable())
if !serveHTTP(value, w, r) {
resputil.JSON(w, value)
}
},
}
}
func (h Reminder) MountRoutes(r chi.Router, middlewares ...func(http.Handler) http.Handler) {
r.Group(func(r chi.Router) {
r.Use(middlewares...)
r.Get("/reminder/", h.List)
r.Post("/reminder/", h.Create)
r.Put("/reminder/{reminderID}", h.Update)
r.Get("/reminder/{reminderID}", h.Read)
r.Delete("/reminder/{reminderID}", h.Delete)
r.Patch("/reminder/{reminderID}/dismiss", h.Dismiss)
r.Patch("/reminder/{reminderID}/snooze", h.Snooze)
})
}

47
system/rest/reminder.go Normal file
View File

@@ -0,0 +1,47 @@
package rest
import (
"context"
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/system/rest/request"
)
var _ = errors.Wrap
type Reminder struct {
// xxx service.XXXService
}
func (Reminder) New() *Reminder {
return &Reminder{}
}
func (ctrl *Reminder) List(ctx context.Context, r *request.ReminderList) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.list")
}
func (ctrl *Reminder) Create(ctx context.Context, r *request.ReminderCreate) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.create")
}
func (ctrl *Reminder) Update(ctx context.Context, r *request.ReminderUpdate) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.update")
}
func (ctrl *Reminder) Read(ctx context.Context, r *request.ReminderRead) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.read")
}
func (ctrl *Reminder) Delete(ctx context.Context, r *request.ReminderDelete) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.delete")
}
func (ctrl *Reminder) Dismiss(ctx context.Context, r *request.ReminderDismiss) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.dismiss")
}
func (ctrl *Reminder) Snooze(ctx context.Context, r *request.ReminderSnooze) (interface{}, error) {
return nil, errors.New("Not implemented: Reminder.snooze")
}

View File

@@ -0,0 +1,466 @@
package request
/*
Hello! This file is auto-generated from `docs/src/spec.json`.
For development:
In order to update the generated files, edit this file under the location,
add your struct fields, imports, API definitions and whatever you want, and:
1. run [spec](https://github.com/titpetric/spec) in the same folder,
2. run `./_gen.php` in this folder.
You may edit `reminder.go`, `reminder.util.go` or `reminder_test.go` to
implement your API calls, helper functions and tests. The file `reminder.go`
is only generated the first time, and will not be overwritten if it exists.
*/
import (
"io"
"strings"
"encoding/json"
"mime/multipart"
"net/http"
"github.com/go-chi/chi"
"github.com/pkg/errors"
"time"
sqlxTypes "github.com/jmoiron/sqlx/types"
)
var _ = chi.URLParam
var _ = multipart.FileHeader{}
// Reminder list request parameters
type ReminderList struct {
Resource string
AssignedTo uint64 `json:",string"`
Page uint
PerPage uint
}
func NewReminderList() *ReminderList {
return &ReminderList{}
}
func (r ReminderList) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["resource"] = r.Resource
out["assignedTo"] = r.AssignedTo
out["page"] = r.Page
out["perPage"] = r.PerPage
return out
}
func (r *ReminderList) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
if val, ok := get["resource"]; ok {
r.Resource = val
}
if val, ok := get["assignedTo"]; ok {
r.AssignedTo = parseUInt64(val)
}
if val, ok := get["page"]; ok {
r.Page = parseUint(val)
}
if val, ok := get["perPage"]; ok {
r.PerPage = parseUint(val)
}
return err
}
var _ RequestFiller = NewReminderList()
// Reminder create request parameters
type ReminderCreate struct {
Resource string
AssignedTo uint64 `json:",string"`
Payload sqlxTypes.JSONText
RemindAt time.Time
}
func NewReminderCreate() *ReminderCreate {
return &ReminderCreate{}
}
func (r ReminderCreate) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["resource"] = r.Resource
out["assignedTo"] = r.AssignedTo
out["payload"] = r.Payload
out["remindAt"] = r.RemindAt
return out
}
func (r *ReminderCreate) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
if val, ok := post["resource"]; ok {
r.Resource = val
}
if val, ok := post["assignedTo"]; ok {
r.AssignedTo = parseUInt64(val)
}
if val, ok := post["payload"]; ok {
if r.Payload, err = parseJSONTextWithErr(val); err != nil {
return err
}
}
if val, ok := post["remindAt"]; ok {
if r.RemindAt, err = parseISODateWithErr(val); err != nil {
return err
}
}
return err
}
var _ RequestFiller = NewReminderCreate()
// Reminder update request parameters
type ReminderUpdate struct {
ReminderID uint64 `json:",string"`
Resource string
AssignedTo uint64 `json:",string"`
Payload sqlxTypes.JSONText
RemindAt time.Time
}
func NewReminderUpdate() *ReminderUpdate {
return &ReminderUpdate{}
}
func (r ReminderUpdate) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["reminderID"] = r.ReminderID
out["resource"] = r.Resource
out["assignedTo"] = r.AssignedTo
out["payload"] = r.Payload
out["remindAt"] = r.RemindAt
return out
}
func (r *ReminderUpdate) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
r.ReminderID = parseUInt64(chi.URLParam(req, "reminderID"))
if val, ok := post["resource"]; ok {
r.Resource = val
}
if val, ok := post["assignedTo"]; ok {
r.AssignedTo = parseUInt64(val)
}
if val, ok := post["payload"]; ok {
if r.Payload, err = parseJSONTextWithErr(val); err != nil {
return err
}
}
if val, ok := post["remindAt"]; ok {
if r.RemindAt, err = parseISODateWithErr(val); err != nil {
return err
}
}
return err
}
var _ RequestFiller = NewReminderUpdate()
// Reminder read request parameters
type ReminderRead struct {
ReminderID uint64 `json:",string"`
}
func NewReminderRead() *ReminderRead {
return &ReminderRead{}
}
func (r ReminderRead) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["reminderID"] = r.ReminderID
return out
}
func (r *ReminderRead) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
r.ReminderID = parseUInt64(chi.URLParam(req, "reminderID"))
return err
}
var _ RequestFiller = NewReminderRead()
// Reminder delete request parameters
type ReminderDelete struct {
ReminderID uint64 `json:",string"`
}
func NewReminderDelete() *ReminderDelete {
return &ReminderDelete{}
}
func (r ReminderDelete) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["reminderID"] = r.ReminderID
return out
}
func (r *ReminderDelete) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
r.ReminderID = parseUInt64(chi.URLParam(req, "reminderID"))
return err
}
var _ RequestFiller = NewReminderDelete()
// Reminder dismiss request parameters
type ReminderDismiss struct {
ReminderID uint64 `json:",string"`
}
func NewReminderDismiss() *ReminderDismiss {
return &ReminderDismiss{}
}
func (r ReminderDismiss) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["reminderID"] = r.ReminderID
return out
}
func (r *ReminderDismiss) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
r.ReminderID = parseUInt64(chi.URLParam(req, "reminderID"))
return err
}
var _ RequestFiller = NewReminderDismiss()
// Reminder snooze request parameters
type ReminderSnooze struct {
ReminderID uint64 `json:",string"`
RemindAt time.Time
}
func NewReminderSnooze() *ReminderSnooze {
return &ReminderSnooze{}
}
func (r ReminderSnooze) Auditable() map[string]interface{} {
var out = map[string]interface{}{}
out["reminderID"] = r.ReminderID
out["remindAt"] = r.RemindAt
return out
}
func (r *ReminderSnooze) Fill(req *http.Request) (err error) {
if strings.ToLower(req.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(req.Body).Decode(r)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = req.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := req.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := req.Form
for name, param := range postVars {
post[name] = string(param[0])
}
r.ReminderID = parseUInt64(chi.URLParam(req, "reminderID"))
if val, ok := post["remindAt"]; ok {
if r.RemindAt, err = parseISODateWithErr(val); err != nil {
return err
}
}
return err
}
var _ RequestFiller = NewReminderSnooze()

View File

@@ -6,6 +6,7 @@ import (
"regexp"
"strconv"
"strings"
"time"
"github.com/jmoiron/sqlx/types"
"github.com/pkg/errors"
@@ -19,6 +20,19 @@ func parseJSONTextWithErr(s string) (types.JSONText, error) {
return *result, err
}
func parseISODateWithErr(s string) (time.Time, error) {
return time.Parse(time.RFC3339, s)
}
func parseISODatePtrWithErr(s string) (*time.Time, error) {
t, err := parseISODateWithErr(s)
if err != nil {
return nil, err
}
return &t, nil
}
// parseInt parses a string to int
func parseInt(s string) int {
if s == "" {

View File

@@ -36,5 +36,7 @@ func MountRoutes(r chi.Router) {
handlers.NewAutomationScript(AutomationScript{}.New()).MountRoutes(r)
handlers.NewAutomationTrigger(AutomationTrigger{}.New()).MountRoutes(r)
handlers.NewReminder(Reminder{}.New()).MountRoutes(r)
})
}