From 0ae5f0c7048d8cacd3b61c9bc00c88e59430630e Mon Sep 17 00:00:00 2001 From: Etzelia Date: Sun, 24 Nov 2019 22:20:07 +0100 Subject: [PATCH] Add functions for model POST API (#4) --- internal/common.go | 22 +++++++++++++++++++--- model/alert.go | 13 ++++++++++++- model/application.go | 13 ++++++++++++- model/ip.go | 13 ++++++++++++- model/model.go | 36 ++++++++++++++++++++++++++++++++++-- model/note.go | 13 ++++++++++++- model/player.go | 13 ++++++++++++- model/ticket.go | 13 ++++++++++++- model/ticketnote.go | 13 ++++++++++++- model/usersettings.go | 13 ++++++++++++- web/alert.go | 14 +------------- web/discord.go | 14 +------------- 12 files changed, 151 insertions(+), 39 deletions(-) diff --git a/internal/common.go b/internal/common.go index 9c5d09c..1f2bac1 100644 --- a/internal/common.go +++ b/internal/common.go @@ -1,11 +1,17 @@ package internal import ( + "encoding/json" "io/ioutil" "net/http" "net/url" ) +type Status struct { + Success bool `json:"success"` + Message string `json:"message"` +} + func ResponseGet(endpoint string) ([]byte, error) { resp, err := http.Get(endpoint) if err != nil { @@ -36,7 +42,17 @@ func ResponsePost(endpoint string, form url.Values) ([]byte, error) { return body, err } -type Status struct { - Success bool `json:"success"` - Message string `json:"message"` +func ResponseStatus(endpoint string, form url.Values) (*Status, error) { + resp, err := ResponsePost(endpoint, form) + if err != nil { + return nil, err + } + + status := &Status{} + err = json.Unmarshal(resp, &status) + if err != nil { + return nil, err + } + + return status, nil } diff --git a/model/alert.go b/model/alert.go index f85bcf7..effd6c5 100644 --- a/model/alert.go +++ b/model/alert.go @@ -13,10 +13,12 @@ type Alert struct { Seen bool `json:"seen"` Date string `json:"date"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) Alert(builder *django.Builder) ([]*Alert, error) { - endpoint := q.endpoint("alert", builder.QueryString()) + endpoint := q.queryEndpoint("alert", builder.QueryString()) alerts := make([]*Alert, 0) resp, err := internal.ResponseGet(endpoint) @@ -29,5 +31,14 @@ func (q *Model) Alert(builder *django.Builder) ([]*Alert, error) { return nil, err } + for _, alert := range alerts { + alert.model = q + } + return alerts, nil } + +func (a *Alert) Save() (*internal.Status, error) { + endpoint := a.model.endpoint("alert") + return internal.ResponseStatus(endpoint, a.model.Values(a)) +} diff --git a/model/application.go b/model/application.go index 9e14d32..0fb13f0 100644 --- a/model/application.go +++ b/model/application.go @@ -18,10 +18,12 @@ type Application struct { Accepted bool `json:"accepted"` Date string `json:"date"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) Application(builder *django.Builder) ([]*Application, error) { - endpoint := q.endpoint("application", builder.QueryString()) + endpoint := q.queryEndpoint("application", builder.QueryString()) applications := make([]*Application, 0) resp, err := internal.ResponseGet(endpoint) @@ -34,5 +36,14 @@ func (q *Model) Application(builder *django.Builder) ([]*Application, error) { return nil, err } + for _, application := range applications { + application.model = q + } + return applications, nil } + +func (a *Application) Save() (*internal.Status, error) { + endpoint := a.model.endpoint("application") + return internal.ResponseStatus(endpoint, a.model.Values(a)) +} diff --git a/model/ip.go b/model/ip.go index 682d27d..1acf6fc 100644 --- a/model/ip.go +++ b/model/ip.go @@ -11,10 +11,12 @@ type IP struct { PlayerID int64 `json:"player_id"` LastUsed string `json:"last_used"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) IP(builder *django.Builder) ([]*IP, error) { - endpoint := q.endpoint("ip", builder.QueryString()) + endpoint := q.queryEndpoint("ip", builder.QueryString()) ips := make([]*IP, 0) resp, err := internal.ResponseGet(endpoint) @@ -27,5 +29,14 @@ func (q *Model) IP(builder *django.Builder) ([]*IP, error) { return nil, err } + for _, ip := range ips { + ip.model = q + } + return ips, nil } + +func (i *IP) Save() (*internal.Status, error) { + endpoint := i.model.endpoint("ip") + return internal.ResponseStatus(endpoint, i.model.Values(i)) +} diff --git a/model/model.go b/model/model.go index f341f06..bb9255a 100644 --- a/model/model.go +++ b/model/model.go @@ -3,6 +3,8 @@ package model import ( "fmt" "go.etztech.xyz/go-mcm/model/django" + "net/url" + "reflect" "strings" ) @@ -22,9 +24,39 @@ func (q *Model) NewDjangoBuilder() *django.Builder { return django.NewBuilder(q.Token) } -func (q *Model) endpoint(model, query string) string { +func (q *Model) endpoint(model string) string { + return fmt.Sprintf("%s/%s/", q.URL, model) +} + +func (q *Model) queryEndpoint(model, query string) string { if !strings.HasPrefix(query, "?") { query = "?" + query } - return fmt.Sprintf("%s/%s%s", q.URL, model, query) + return fmt.Sprintf("%s%s", q.endpoint(model), query) +} + +func (q *Model) Values(i interface{}) url.Values { + values := url.Values{} + values.Set("api", q.Token) + iVal := reflect.ValueOf(i).Elem() + typ := iVal.Type() + for i := 0; i < iVal.NumField(); i++ { + tag := typ.Field(i).Tag.Get("json") + if tag != "-" { + values.Set(strings.ToLower(tag), PyConvert(iVal.Field(i))) + } + } + return values +} + +func PyConvert(value reflect.Value) string { + switch value.Kind() { + case reflect.Bool: + if fmt.Sprint(value) == "true" { + return "True" + } + return "False" + default: + return fmt.Sprint(value) + } } diff --git a/model/note.go b/model/note.go index 99257f6..0f6850f 100644 --- a/model/note.go +++ b/model/note.go @@ -22,10 +22,12 @@ type Note struct { StaffID int64 `json:"staff_id"` Date string `json:"date"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) Note(builder *django.Builder) ([]*Note, error) { - endpoint := q.endpoint("note", builder.QueryString()) + endpoint := q.queryEndpoint("note", builder.QueryString()) notes := make([]*Note, 0) resp, err := internal.ResponseGet(endpoint) @@ -38,5 +40,14 @@ func (q *Model) Note(builder *django.Builder) ([]*Note, error) { return nil, err } + for _, note := range notes { + note.model = q + } + return notes, nil } + +func (n *Note) Save() (*internal.Status, error) { + endpoint := n.model.endpoint("note") + return internal.ResponseStatus(endpoint, n.model.Values(n)) +} diff --git a/model/player.go b/model/player.go index 326c83a..93bba99 100644 --- a/model/player.go +++ b/model/player.go @@ -15,10 +15,12 @@ type Player struct { FirstSeen string `json:"first_seen"` LastSeen string `json:"last_seen"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) Player(builder *django.Builder) ([]*Player, error) { - endpoint := q.endpoint("player", builder.QueryString()) + endpoint := q.queryEndpoint("player", builder.QueryString()) players := make([]*Player, 0) resp, err := internal.ResponseGet(endpoint) @@ -31,5 +33,14 @@ func (q *Model) Player(builder *django.Builder) ([]*Player, error) { return nil, err } + for _, player := range players { + player.model = q + } + return players, nil } + +func (p *Player) Save() (*internal.Status, error) { + endpoint := p.model.endpoint("player") + return internal.ResponseStatus(endpoint, p.model.Values(p)) +} diff --git a/model/ticket.go b/model/ticket.go index 01d88eb..39d6558 100644 --- a/model/ticket.go +++ b/model/ticket.go @@ -35,10 +35,12 @@ type Ticket struct { Z string `json:"Z"` Date string `json:"date"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) Ticket(builder *django.Builder) ([]*Ticket, error) { - endpoint := q.endpoint("ticket", builder.QueryString()) + endpoint := q.queryEndpoint("ticket", builder.QueryString()) tickets := make([]*Ticket, 0) resp, err := internal.ResponseGet(endpoint) @@ -51,5 +53,14 @@ func (q *Model) Ticket(builder *django.Builder) ([]*Ticket, error) { return nil, err } + for _, ticket := range tickets { + ticket.model = q + } + return tickets, nil } + +func (t *Ticket) Save() (*internal.Status, error) { + endpoint := t.model.endpoint("ticket") + return internal.ResponseStatus(endpoint, t.model.Values(t)) +} diff --git a/model/ticketnote.go b/model/ticketnote.go index 9eaa0c7..6872255 100644 --- a/model/ticketnote.go +++ b/model/ticketnote.go @@ -14,10 +14,12 @@ type TicketNote struct { LastUpdate string `json:"last_update"` Date string `json:"date"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) TicketNote(builder *django.Builder) ([]*TicketNote, error) { - endpoint := q.endpoint("ticketnote", builder.QueryString()) + endpoint := q.queryEndpoint("ticketnote", builder.QueryString()) ticketNotes := make([]*TicketNote, 0) resp, err := internal.ResponseGet(endpoint) @@ -30,5 +32,14 @@ func (q *Model) TicketNote(builder *django.Builder) ([]*TicketNote, error) { return nil, err } + for _, ticketNote := range ticketNotes { + ticketNote.model = q + } + return ticketNotes, nil } + +func (t *TicketNote) Save() (*internal.Status, error) { + endpoint := t.model.endpoint("ticketnote") + return internal.ResponseStatus(endpoint, t.model.Values(t)) +} diff --git a/model/usersettings.go b/model/usersettings.go index a1d09cb..b9bef3a 100644 --- a/model/usersettings.go +++ b/model/usersettings.go @@ -35,10 +35,12 @@ type UserSettings struct { ShowTimestampChat bool `json:"show_timestamp_chat"` LastIP string `json:"last_ip"` Link string `json:"link"` + + model *Model `json:"-"` } func (q *Model) UserSettings(builder *django.Builder) ([]*UserSettings, error) { - endpoint := q.endpoint("usersettings", builder.QueryString()) + endpoint := q.queryEndpoint("usersettings", builder.QueryString()) userSettingss := make([]*UserSettings, 0) resp, err := internal.ResponseGet(endpoint) @@ -51,5 +53,14 @@ func (q *Model) UserSettings(builder *django.Builder) ([]*UserSettings, error) { return nil, err } + for _, userSetting := range userSettingss { + userSetting.model = q + } + return userSettingss, nil } + +func (u *UserSettings) Save() (*internal.Status, error) { + endpoint := u.model.endpoint("usersettings") + return internal.ResponseStatus(endpoint, u.model.Values(u)) +} diff --git a/web/alert.go b/web/alert.go index 06a0fab..30bb08b 100644 --- a/web/alert.go +++ b/web/alert.go @@ -1,14 +1,12 @@ package web import ( - "encoding/json" "go.etztech.xyz/go-mcm/internal" "net/url" ) func (web *Web) Alert(message string, ping bool) (*internal.Status, error) { endpoint := web.endpoint("alert") - status := &internal.Status{} form := url.Values{} form.Add("api", web.Token) @@ -17,15 +15,5 @@ func (web *Web) Alert(message string, ping bool) (*internal.Status, error) { form.Add("ping", "True") } - resp, err := internal.ResponsePost(endpoint, form) - if err != nil { - return nil, err - } - - err = json.Unmarshal(resp, &status) - if err != nil { - return nil, err - } - - return status, nil + return internal.ResponseStatus(endpoint, form) } diff --git a/web/discord.go b/web/discord.go index 82bdcdf..d80dfa9 100644 --- a/web/discord.go +++ b/web/discord.go @@ -1,14 +1,12 @@ package web import ( - "encoding/json" "go.etztech.xyz/go-mcm/internal" "net/url" ) func (web *Web) Discord(message string, ping bool) (*internal.Status, error) { endpoint := web.endpoint("discord") - status := &internal.Status{} form := url.Values{} form.Add("api", web.Token) @@ -17,15 +15,5 @@ func (web *Web) Discord(message string, ping bool) (*internal.Status, error) { form.Add("ping", "True") } - resp, err := internal.ResponsePost(endpoint, form) - if err != nil { - return nil, err - } - - err = json.Unmarshal(resp, &status) - if err != nil { - return nil, err - } - - return status, nil + return internal.ResponseStatus(endpoint, form) }