package models import ( "database/sql" "errors" "fmt" "git.quimbo.fr/odwrtw/canape/backend/sqly" "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 { sqly.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 }