model: import from gql.sr.ht

This commit is contained in:
Drew DeVault 2020-10-06 11:49:42 -04:00
parent 1d2a30cb44
commit 1d358dfe62
2 changed files with 75 additions and 0 deletions

69
model/cursor.go Normal file
View File

@ -0,0 +1,69 @@
package model
import (
"encoding/json"
"fmt"
"io"
"git.sr.ht/~sircmpwn/gql.sr.ht/crypto"
)
// TODO: Add field to prevent cursor reuse across unrelated resources
type Cursor struct {
Count int `json:"count"`
Next string `json:"next"`
Search string `json:"search"`
}
func (cur *Cursor) UnmarshalGQL(v interface{}) error {
enc, ok := v.(string)
if !ok {
return fmt.Errorf("cursor must be strings")
}
plain := crypto.Decrypt([]byte(enc))
if plain == nil {
return fmt.Errorf("Invalid cursor")
}
err := json.Unmarshal(plain, cur)
if err != nil {
// This is guaranteed to be a programming error
panic(err)
}
return nil
}
func (cur Cursor) MarshalGQL(w io.Writer) {
data, err := json.Marshal(cur)
if err != nil {
panic(err)
}
w.Write([]byte("\""))
w.Write(crypto.Encrypt(data))
w.Write([]byte("\""))
}
func derefOrInt(i *int, d int) int {
if i != nil {
return *i
}
return d
}
func NewCursor(filter *Filter) *Cursor {
if filter != nil {
count := derefOrInt(filter.Count, 25)
if count <= 0 {
count = 25
}
return &Cursor{
Next: "",
Count: count,
Search: "", // TODO
}
}
return &Cursor{
Count: 25,
Next: "",
Search: "",
}
}

6
model/filter.go Normal file
View File

@ -0,0 +1,6 @@
package model
type Filter struct {
Count *int `json:"count"`
Search *string `json:"search"`
}