mirror of
https://codeberg.org/scip/ephemerup.git
synced 2025-12-18 21:11:04 +01:00
generalized DB engine to support multiple types (upload+form)
This commit is contained in:
102
common/types.go
102
common/types.go
@@ -17,6 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package common
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// used to return to the api client
|
||||
type Result struct {
|
||||
Success bool `json:"success"`
|
||||
@@ -24,6 +29,12 @@ type Result struct {
|
||||
Code int `json:"code"`
|
||||
}
|
||||
|
||||
// upload or form structs
|
||||
type Dbentry interface {
|
||||
Getcontext(j []byte) (string, error)
|
||||
Marshal() ([]byte, error)
|
||||
}
|
||||
|
||||
type Upload struct {
|
||||
Id string `json:"id"`
|
||||
Expire string `json:"expire"`
|
||||
@@ -35,9 +46,96 @@ type Upload struct {
|
||||
}
|
||||
|
||||
// this one is also used for marshalling to the client
|
||||
type Uploads struct {
|
||||
Entries []*Upload `json:"uploads"`
|
||||
type Response struct {
|
||||
Uploads []*Upload `json:"uploads"`
|
||||
Forms []*Form `json:"forms"`
|
||||
|
||||
// integrate the Result struct so we can signal success
|
||||
Result
|
||||
}
|
||||
|
||||
type Form struct {
|
||||
Id string `json:"id"`
|
||||
Expire string `json:"expire"`
|
||||
Description string `json:"description"`
|
||||
Created Timestamp `json:"uploaded"`
|
||||
Context string `json:"context"`
|
||||
Url string `json:"url"`
|
||||
}
|
||||
|
||||
const (
|
||||
TypeUpload = iota
|
||||
TypeForm
|
||||
)
|
||||
|
||||
/*
|
||||
implement Dbentry interface
|
||||
*/
|
||||
func (upload Upload) Getcontext(j []byte) (string, error) {
|
||||
if err := json.Unmarshal(j, &upload); err != nil {
|
||||
return "", fmt.Errorf("unable to unmarshal json: %s", err)
|
||||
}
|
||||
|
||||
return upload.Context, nil
|
||||
}
|
||||
|
||||
func (form Form) Getcontext(j []byte) (string, error) {
|
||||
if err := json.Unmarshal(j, &form); err != nil {
|
||||
return "", fmt.Errorf("unable to unmarshal json: %s", err)
|
||||
}
|
||||
|
||||
return form.Context, nil
|
||||
}
|
||||
|
||||
func (upload Upload) Marshal() ([]byte, error) {
|
||||
jsonentry, err := json.Marshal(upload)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("json marshalling failure: %s", err)
|
||||
}
|
||||
|
||||
return jsonentry, nil
|
||||
}
|
||||
|
||||
func (form Form) Marshal() ([]byte, error) {
|
||||
jsonentry, err := json.Marshal(form)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("json marshalling failure: %s", err)
|
||||
}
|
||||
|
||||
return jsonentry, nil
|
||||
}
|
||||
|
||||
/*
|
||||
Extract context, whatever kind entry is, but we don't know in
|
||||
advance, only after unmarshalling. So try Upload first, if that
|
||||
fails, try Form.
|
||||
*/
|
||||
func GetContext(j []byte) (string, error) {
|
||||
upload := &Upload{}
|
||||
entryContext, err := upload.Getcontext(j)
|
||||
if err != nil {
|
||||
form := &Form{}
|
||||
entryContext, err = form.Getcontext(j)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("unable to unmarshal json: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
return entryContext, nil
|
||||
}
|
||||
|
||||
func Unmarshal(j []byte, t int) (Dbentry, error) {
|
||||
if t == TypeUpload {
|
||||
upload := &Upload{}
|
||||
if err := json.Unmarshal(j, &upload); err != nil {
|
||||
return upload, fmt.Errorf("unable to unmarshal json: %s", err)
|
||||
}
|
||||
return upload, nil
|
||||
} else {
|
||||
form := &Form{}
|
||||
if err := json.Unmarshal(j, &form); err != nil {
|
||||
return form, fmt.Errorf("unable to unmarshal json: %s", err)
|
||||
}
|
||||
return form, nil
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user