bottin/request.go
Victor Lacasse-Beaudoin eb1982898c rework: config and cmd
Renamed `web` command to `server ui` (web is still an alias to ui)

Completely changed the config options and flags

Usage of PersistentFlags now allow clearer `--help`

BREAKING: cmd modified
BREAKING: config overhauled
BREAKING: Bump API to v8
2024-07-15 16:52:04 -04:00

350 lines
7.6 KiB
Go

package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"codeberg.org/vlbeaudoin/voki/v3"
)
var _ voki.Requester[HealthGETResponse] = HealthGETRequest{}
type HealthGETRequest struct{}
func (request HealthGETRequest) Complete() bool { return true }
func (request HealthGETRequest) Request(v *voki.Voki) (response HealthGETResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete HealthGET request")
return
}
statusCode, body, err := v.CallAndParse(
http.MethodGet,
"/api/v8/health/",
nil,
true,
)
if err != nil {
err = fmt.Errorf("%d: %s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[ProgrammesPOSTResponse] = ProgrammesPOSTRequest{}
type ProgrammesPOSTRequest struct {
Data struct {
Programmes []Programme
}
}
func (request ProgrammesPOSTRequest) Complete() bool {
return len(request.Data.Programmes) != 0
}
func (request ProgrammesPOSTRequest) Request(v *voki.Voki) (response ProgrammesPOSTResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete ProgrammesPOSTRequest")
return
}
var buf bytes.Buffer
if err = json.NewEncoder(&buf).Encode(request.Data); err != nil {
return
}
statusCode, body, err := v.CallAndParse(
http.MethodPost,
"/api/v8/programme/",
&buf,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[MembresPOSTResponse] = MembresPOSTRequest{}
type MembresPOSTRequest struct {
Data struct {
Membres []Membre
}
}
func (request MembresPOSTRequest) Complete() bool {
return len(request.Data.Membres) != 0
}
func (request MembresPOSTRequest) Request(v *voki.Voki) (response MembresPOSTResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete MembresPOSTRequest")
return
}
var buf bytes.Buffer
if err = json.NewEncoder(&buf).Encode(request.Data); err != nil {
return
}
statusCode, body, err := v.CallAndParse(
http.MethodPost,
"/api/v8/membre/",
&buf,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[MembreGETResponse] = MembreGETRequest{}
type MembreGETRequest struct {
Param struct {
MembreID string `json:"membre_id" param:"membre_id"`
}
}
func (request MembreGETRequest) Complete() bool {
return request.Param.MembreID != ""
}
func (request MembreGETRequest) Request(v *voki.Voki) (response MembreGETResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete MembreGETRequest")
return
}
if id := request.Param.MembreID; !IsMembreID(id) {
err = fmt.Errorf("MembreID '%s' invalide", id)
return
}
statusCode, body, err := v.CallAndParse(
http.MethodGet,
fmt.Sprintf("/api/v8/membre/%s/", request.Param.MembreID),
nil,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[MembresGETResponse] = MembresGETRequest{}
type MembresGETRequest struct {
Query struct {
Limit int `json:"limit" query:"limit"`
}
}
func (request MembresGETRequest) Complete() bool { return true }
func (request MembresGETRequest) Request(v *voki.Voki) (response MembresGETResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete MembresGETRequest")
return
}
statusCode, body, err := v.CallAndParse(
http.MethodGet,
fmt.Sprintf("/api/v8/membre/?limit=%d", request.Query.Limit),
nil,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[MembrePreferedNamePUTResponse] = MembrePreferedNamePUTRequest{}
type MembrePreferedNamePUTRequest struct {
Data struct {
PreferedName string `json:"prefered_name"`
} `json:"data"`
Param struct {
MembreID string `json:"membre_id" param:"membre_id"`
} `json:"param"`
}
func (request MembrePreferedNamePUTRequest) Complete() bool {
return IsMembreID(request.Param.MembreID) && len(request.Data.PreferedName) != 0
}
func (request MembrePreferedNamePUTRequest) Request(v *voki.Voki) (response MembrePreferedNamePUTResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete MembrePreferedNamePUTRequest")
return
}
var buf bytes.Buffer
if err = json.NewEncoder(&buf).Encode(request.Data); err != nil {
return
}
statusCode, body, err := v.CallAndParse(
http.MethodPut,
fmt.Sprintf("/api/v8/membre/%s/prefered_name/", request.Param.MembreID),
&buf,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[ProgrammesGETResponse] = ProgrammesGETRequest{}
type ProgrammesGETRequest struct {
Query struct {
Limit int `json:"limit" query:"limit"`
}
}
func (request ProgrammesGETRequest) Complete() bool { return true }
func (request ProgrammesGETRequest) Request(v *voki.Voki) (response ProgrammesGETResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete ProgrammesGETRequest")
return
}
statusCode, body, err := v.CallAndParse(
http.MethodGet,
fmt.Sprintf("/api/v8/programme/?limit=%d", request.Query.Limit),
nil,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[MembresDisplayGETResponse] = MembresDisplayGETRequest{}
type MembresDisplayGETRequest struct {
Query struct {
Limit int `json:"limit" query:"limit"`
}
}
func (request MembresDisplayGETRequest) Complete() bool { return true }
func (request MembresDisplayGETRequest) Request(v *voki.Voki) (response MembresDisplayGETResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete MembresDisplayGETRequest")
return
}
statusCode, body, err := v.CallAndParse(
http.MethodGet,
fmt.Sprintf("/api/v8/membre/display/?limit=%d", request.Query.Limit),
nil,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}
var _ voki.Requester[MembreDisplayGETResponse] = MembreDisplayGETRequest{}
type MembreDisplayGETRequest struct {
Param struct {
MembreID string `json:"membre_id" param:"membre_id"`
}
}
func (request MembreDisplayGETRequest) Complete() bool {
return request.Param.MembreID != ""
}
func (request MembreDisplayGETRequest) Request(v *voki.Voki) (response MembreDisplayGETResponse, err error) {
if !request.Complete() {
err = fmt.Errorf("Incomplete MembreDisplayGETRequest")
return
}
if id := request.Param.MembreID; !IsMembreID(id) {
err = fmt.Errorf("MembreID '%s' invalide", id)
return
}
statusCode, body, err := v.CallAndParse(
http.MethodGet,
fmt.Sprintf("/api/v8/membre/%s/display/", request.Param.MembreID),
nil,
true,
)
if err != nil {
err = fmt.Errorf("code=%d err=%s", statusCode, err)
return
}
response.SetStatusCode(statusCode)
if err = json.Unmarshal(body, &response); err != nil {
return
}
return
}