nidus-sync/resource/district.go

91 lines
2.2 KiB
Go

package resource
import (
"context"
"fmt"
"strconv"
nhttp "github.com/Gleipnir-Technology/nidus-sync/http"
"github.com/Gleipnir-Technology/nidus-sync/platform"
"github.com/gorilla/mux"
"net/http"
//"github.com/rs/zerolog/log"
)
type districtR struct {
router *router
}
type district struct {
Name string `json:"name"`
PhoneOffice string `json:"phone_office"`
Slug string `json:"slug"`
URI string `json:"uri"`
URLLogo string `json:"url_logo"`
URLWebsite string `json:"url_website"`
}
func District(r *router) *districtR {
return &districtR{
router: r,
}
}
func (res *districtR) GetByID(ctx context.Context, r *http.Request, query QueryParams) (*district, *nhttp.ErrorWithStatus) {
vars := mux.Vars(r)
id_str := vars["id"]
id, err := strconv.Atoi(id_str)
if err != nil {
return nil, nhttp.NewBadRequest("id conversion: %w", err)
}
org, err := platform.OrganizationByID(ctx, id)
if err != nil {
return nil, nhttp.NewError("get org: %w", err)
}
district, err := newDistrict(res.router, org)
if err != nil {
return nil, nhttp.NewError("new district: %w", err)
}
return district, nil
}
func (res *districtR) List(ctx context.Context, r *http.Request, query QueryParams) ([]*district, *nhttp.ErrorWithStatus) {
organizations, err := platform.OrganizationList(ctx)
if err != nil {
return nil, nhttp.NewError("list orgs: %w", err)
}
districts := make([]*district, 0)
for _, org := range organizations {
district, err := newDistrict(res.router, org)
if err != nil {
return nil, nhttp.NewError("make district: %w", err)
}
if district == nil {
continue
}
districts = append(districts, district)
}
return districts, nil
}
func newDistrict(r *router, org *platform.Organization) (*district, error) {
slug := org.Slug()
if slug == "" {
return nil, nil
}
logo, err := r.SlugToURI("district.logo.BySlug", slug)
if err != nil {
return nil, fmt.Errorf("logo url: %w", err)
}
uri, err := r.IDToURI("district.ByIDGet", int(org.ID))
if err != nil {
return nil, nhttp.NewError("district uri: %w", err)
}
return &district{
Name: org.Name(),
PhoneOffice: org.PhoneOffice(),
Slug: slug,
URI: uri,
URLLogo: logo,
URLWebsite: org.Website(),
}, nil
}