api: added subreddits get api and update telemetry package
This commit is contained in:
parent
778b5c6524
commit
3e95251181
|
@ -3,6 +3,7 @@ package api
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/go-jet/jet/v2/qrm"
|
||||||
"github.com/stephenafamo/bob"
|
"github.com/stephenafamo/bob"
|
||||||
"github.com/tigorlazuardi/bluemage/go/gen/converter"
|
"github.com/tigorlazuardi/bluemage/go/gen/converter"
|
||||||
)
|
)
|
||||||
|
@ -11,7 +12,8 @@ var convert converter.DeviceConverterImpl
|
||||||
|
|
||||||
type API struct {
|
type API struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
DB bob.Executor
|
Executor bob.Executor
|
||||||
|
DB qrm.Queryable
|
||||||
}
|
}
|
||||||
|
|
||||||
func (api *API) lockf(f func()) {
|
func (api *API) lockf(f func()) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ func queryFromCountDevicesRequest(req *device.CountDevicesRequest) (expr []bob.M
|
||||||
}
|
}
|
||||||
|
|
||||||
func (api *API) DevicesCount(ctx context.Context, request *device.CountDevicesRequest) (uint64, error) {
|
func (api *API) DevicesCount(ctx context.Context, request *device.CountDevicesRequest) (uint64, error) {
|
||||||
count, err := models.Devices.Query(ctx, api.DB, queryFromCountDevicesRequest(request)...).Count()
|
count, err := models.Devices.Query(ctx, api.Executor, queryFromCountDevicesRequest(request)...).Count()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errs.Wrapw(err, "failed to count devices", "request", request)
|
return 0, errs.Wrapw(err, "failed to count devices", "request", request)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ func (api *API) DevicesCreate(ctx context.Context, params *models.Device) (devic
|
||||||
ctx, coll := log.WithQueryCollector(ctx)
|
ctx, coll := log.WithQueryCollector(ctx)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
api.lockf(func() {
|
api.lockf(func() {
|
||||||
device, err = models.Devices.Insert(ctx, api.DB, &models.DeviceSetter{
|
device, err = models.Devices.Insert(ctx, api.Executor, &models.DeviceSetter{
|
||||||
Slug: omit.From(params.Slug),
|
Slug: omit.From(params.Slug),
|
||||||
Name: omit.From(params.Name),
|
Name: omit.From(params.Name),
|
||||||
ResolutionX: omit.From(params.ResolutionX),
|
ResolutionX: omit.From(params.ResolutionX),
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
func (api *API) DevicesExist(ctx context.Context, slug string) (exists bool, err error) {
|
func (api *API) DevicesExist(ctx context.Context, slug string) (exists bool, err error) {
|
||||||
ctx, coll := log.WithQueryCollector(ctx)
|
ctx, coll := log.WithQueryCollector(ctx)
|
||||||
exists, err = models.DeviceExists(ctx, api.DB, slug)
|
exists, err = models.DeviceExists(ctx, api.Executor, slug)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return exists, errs.Wrapw(err, "failed to check device existence",
|
return exists, errs.Wrapw(err, "failed to check device existence",
|
||||||
"slug", slug,
|
"slug", slug,
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
|
|
||||||
func (api *API) GetDevice(ctx context.Context, slug string) (device *models.Device, err error) {
|
func (api *API) GetDevice(ctx context.Context, slug string) (device *models.Device, err error) {
|
||||||
ctx, coll := log.WithQueryCollector(ctx)
|
ctx, coll := log.WithQueryCollector(ctx)
|
||||||
device, err = models.FindDevice(ctx, api.DB, slug)
|
device, err = models.FindDevice(ctx, api.Executor, slug)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err.Error() == "sql: no rows in result set" {
|
if err.Error() == "sql: no rows in result set" {
|
||||||
return device, errs.Wrapw(err, "device not found",
|
return device, errs.Wrapw(err, "device not found",
|
||||||
|
|
|
@ -57,7 +57,7 @@ func queryFromListDeviceRequest(req *device.ListDevicesRequest) (expr []bob.Mod[
|
||||||
|
|
||||||
func (api *API) DevicesList(ctx context.Context, req *device.ListDevicesRequest) (resp *device.ListDevicesResponse, err error) {
|
func (api *API) DevicesList(ctx context.Context, req *device.ListDevicesRequest) (resp *device.ListDevicesResponse, err error) {
|
||||||
resp = &device.ListDevicesResponse{}
|
resp = &device.ListDevicesResponse{}
|
||||||
results, err := models.Devices.Query(ctx, api.DB, queryFromListDeviceRequest(req)...).All()
|
results, err := models.Devices.Query(ctx, api.Executor, queryFromListDeviceRequest(req)...).All()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, errs.Wrapw(err, "failed to list devices", "request", req)
|
return resp, errs.Wrapw(err, "failed to list devices", "request", req)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ func (api *API) DevicesUpdate(ctx context.Context, slug string, update *models.D
|
||||||
target := &models.Device{Slug: slug}
|
target := &models.Device{Slug: slug}
|
||||||
|
|
||||||
api.lockf(func() {
|
api.lockf(func() {
|
||||||
err = models.Devices.Update(ctx, api.DB, update, target)
|
err = models.Devices.Update(ctx, api.Executor, update, target)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if sqlite3Err := new(sqlite3.Error); errors.As(err, &sqlite3Err) {
|
if sqlite3Err := new(sqlite3.Error); errors.As(err, &sqlite3Err) {
|
||||||
|
|
|
@ -15,7 +15,7 @@ func (api *API) SubredditCreate(ctx context.Context, subreddit *models.Subreddit
|
||||||
// TODO: add check to Reddit API to see if subreddit exists.
|
// TODO: add check to Reddit API to see if subreddit exists.
|
||||||
|
|
||||||
api.lockf(func() {
|
api.lockf(func() {
|
||||||
_, err = models.Subreddits.Insert(ctx, api.DB, &models.SubredditSetter{
|
_, err = models.Subreddits.Insert(ctx, api.Executor, &models.SubredditSetter{
|
||||||
Name: omit.From(subreddit.Name),
|
Name: omit.From(subreddit.Name),
|
||||||
DisableScheduler: omit.From(subreddit.DisableScheduler),
|
DisableScheduler: omit.From(subreddit.DisableScheduler),
|
||||||
Type: omit.From(subreddit.Type),
|
Type: omit.From(subreddit.Type),
|
||||||
|
|
53
go/api/subreddits_get.go
Normal file
53
go/api/subreddits_get.go
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"connectrpc.com/connect"
|
||||||
|
"github.com/tigorlazuardi/bluemage/go/gen/jet/model"
|
||||||
|
"github.com/tigorlazuardi/bluemage/go/pkg/errs"
|
||||||
|
"github.com/tigorlazuardi/bluemage/go/pkg/telemetry"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
|
"github.com/go-jet/jet/v2/qrm"
|
||||||
|
|
||||||
|
. "github.com/go-jet/jet/v2/sqlite"
|
||||||
|
. "github.com/tigorlazuardi/bluemage/go/gen/jet/table"
|
||||||
|
)
|
||||||
|
|
||||||
|
var getSubredditMetric, _ = meter.Int64Counter("api.subreddits.get",
|
||||||
|
metric.WithDescription("The number of times a subreddit is retrieved"),
|
||||||
|
)
|
||||||
|
|
||||||
|
func (api *API) GetSubreddit(ctx context.Context, name string) (sub model.Subreddits, err error) {
|
||||||
|
ctx, span := tracer.Start(ctx, "GetSubreddit", trace.WithAttributes(attribute.String("name", name)))
|
||||||
|
defer func() { telemetry.EndWithStatus(span, err) }()
|
||||||
|
|
||||||
|
getSubredditMetric.Add(ctx, 1, metric.WithAttributes(attribute.String("name", name)))
|
||||||
|
|
||||||
|
stmt := SELECT(Subreddits.AllColumns).
|
||||||
|
FROM(Subreddits).
|
||||||
|
WHERE(Subreddits.Name.EQ(String(name)))
|
||||||
|
|
||||||
|
err = stmt.QueryContext(ctx, api.DB, &sub)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, qrm.ErrNoRows) {
|
||||||
|
return sub, errs.
|
||||||
|
Wrapf(err, "subreddit '%s' does not exist", name).
|
||||||
|
Details(
|
||||||
|
"name", name,
|
||||||
|
"query", stmt.DebugSql(),
|
||||||
|
).
|
||||||
|
Code(connect.CodeNotFound)
|
||||||
|
}
|
||||||
|
return sub, errs.Wrapf(err, "failed to get subreddit '%s'", name).
|
||||||
|
Details(
|
||||||
|
"name", name,
|
||||||
|
"query", stmt.DebugSql(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return sub, nil
|
||||||
|
}
|
8
go/api/telemetry.go
Normal file
8
go/api/telemetry.go
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
|
var (
|
||||||
|
tracer = otel.Tracer("github.com/tigorlazuardi/bluemage/go/api")
|
||||||
|
meter = otel.Meter("github.com/tigorlazuardi/bluemage/go/api")
|
||||||
|
)
|
|
@ -77,7 +77,8 @@ var Cmd = &cobra.Command{
|
||||||
db := bob.New(sqldb)
|
db := bob.New(sqldb)
|
||||||
|
|
||||||
api := &api.API{
|
api := &api.API{
|
||||||
DB: db,
|
Executor: db,
|
||||||
|
DB: sqldb,
|
||||||
}
|
}
|
||||||
|
|
||||||
handler := &server.Server{
|
handler := &server.Server{
|
||||||
|
|
Loading…
Reference in a new issue