123 lines
3.0 KiB
Go
123 lines
3.0 KiB
Go
package models
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"github.com/odwrtw/papi"
|
|
)
|
|
|
|
const (
|
|
addPolochonQuery = `INSERT INTO
|
|
polochons (name, url, token, admin_id)
|
|
VALUES ($1, $2, $3, $4)
|
|
RETURNING id;`
|
|
getPolochonByIDQuery = `SELECT * FROM polochons WHERE id=$1;`
|
|
getPolochonsByUserIDQuery = `SELECT * FROM polochons WHERE admin_id=$1 ORDER BY created_at DESC;`
|
|
updatePolochonQuery = `UPDATE polochons SET
|
|
name=:name, url=:url, token=:token, auth_token=:auth_token,
|
|
admin_id=:admin_id
|
|
WHERE id=:id
|
|
RETURNING *;`
|
|
deletePolochonQuery = `DELETE FROM polochons WHERE id=:id;`
|
|
|
|
getAllPolochonsQuery = `SELECT * FROM polochons ORDER BY created_at DESC;`
|
|
)
|
|
|
|
// ErrUnknownPolochon returned when a polochon doesn't exist
|
|
var ErrUnknownPolochon = fmt.Errorf("polochons: polochon does'nt exist")
|
|
|
|
// Polochon represents a polochon
|
|
type Polochon struct {
|
|
BaseModel
|
|
Name string `db:"name" json:"name"`
|
|
URL string `db:"url" json:"url"`
|
|
Token string `db:"token" json:"token"`
|
|
AuthToken string `db:"auth_token" json:"auth_token"`
|
|
AdminID string `db:"admin_id" json:"admin_id"`
|
|
Admin *User `json:"admin"`
|
|
Users []*User `json:"users"`
|
|
}
|
|
|
|
// GetPolochonByID returns polochon using its id
|
|
func GetPolochonByID(q sqlx.Queryer, id string) (*Polochon, error) {
|
|
p := &Polochon{}
|
|
err := q.QueryRowx(getPolochonByIDQuery, id).StructScan(p)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, ErrUnknownPolochon
|
|
}
|
|
return nil, err
|
|
}
|
|
return p, nil
|
|
}
|
|
|
|
// GetAllPolochons returns all the polochons
|
|
func GetAllPolochons(db *sqlx.DB) ([]*Polochon, error) {
|
|
polochons := []*Polochon{}
|
|
err := db.Select(&polochons, getAllPolochonsQuery)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return polochons, nil
|
|
}
|
|
|
|
// GetAllPolochonsByUser returns all the polochons owned by the user
|
|
func GetAllPolochonsByUser(db *sqlx.DB, id string) ([]*Polochon, error) {
|
|
polochons := []*Polochon{}
|
|
err := db.Select(&polochons, getPolochonsByUserIDQuery, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return polochons, nil
|
|
}
|
|
|
|
// Add polochon to database or raises an error
|
|
func (p *Polochon) Add(q sqlx.Queryer) error {
|
|
var id string
|
|
err := q.QueryRowx(addPolochonQuery, p.Name, p.URL, p.Token, p.AdminID).Scan(&id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
p.ID = id
|
|
return nil
|
|
}
|
|
|
|
// Update polochon on database or raise an error
|
|
func (p *Polochon) Update(ex *sqlx.DB) error {
|
|
rows, err := ex.NamedQuery(updatePolochonQuery, p)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for rows.Next() {
|
|
if err := rows.StructScan(p); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Delete polochon from database or raise an error
|
|
func (p *Polochon) Delete(ex *sqlx.DB) error {
|
|
_, err := ex.NamedExec(deletePolochonQuery, p)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// NewPapiClient creates a new papi client for the given polochon
|
|
func (p *Polochon) NewPapiClient() (*papi.Client, error) {
|
|
client, err := papi.New(p.URL)
|
|
if err != nil {
|
|
return nil, errors.New("error getting papi client")
|
|
}
|
|
|
|
if p.Token != "" {
|
|
client.SetToken(p.Token)
|
|
}
|
|
return client, nil
|
|
}
|