diff --git a/go/api/subreddits_update.go b/go/api/subreddits_update.go new file mode 100644 index 0000000..9585984 --- /dev/null +++ b/go/api/subreddits_update.go @@ -0,0 +1,33 @@ +package api + +import ( + "context" + + "github.com/tigorlazuardi/bluemage/go/gen/models" + "github.com/tigorlazuardi/bluemage/go/pkg/errs" + "github.com/tigorlazuardi/bluemage/go/pkg/log" + "github.com/tigorlazuardi/bluemage/go/pkg/telemetry" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" +) + +func (api *API) UpdateSubreddit(ctx context.Context, name string, set *models.SubredditSetter) (err error) { + ctx, span := tracer.Start(ctx, "UpdateSubreddit", trace.WithAttributes(attribute.String("name", name))) + defer func() { telemetry.EndWithStatus(span, err) }() + + ctx, coll := log.WithQueryCollector(ctx) + + api.lockf(func() { + err = models.Subreddits.Update(ctx, api.Executor, set, &models.Subreddit{Name: name}) + }) + if err != nil { + err = errs.Wrapw( + err, "failed to update subreddit", + "name", name, + "set", set, + "query", coll, + ) + return err + } + return nil +} diff --git a/go/converts/subreddit.go b/go/converts/subreddit.go index 958305e..7ba0149 100644 --- a/go/converts/subreddit.go +++ b/go/converts/subreddit.go @@ -48,6 +48,9 @@ type SubredditConverter interface { // goverter:useZeroValueOnPointerInconsistency ProtoListSubredditsRequestToAPIListSubredditsRequest(*subreddits.ListSubredditsRequest) api.ListSubredditsRequest + + // goverter:ignore Name Type CoverImageID CreatedAt UpdatedAt + ProtoSubredditSetterToBobSubredditSetter(*subreddits.SubredditSetter) *models.SubredditSetter } func SubredditTypeToString(subType subreddits.SubredditType) string { diff --git a/go/server/subreddit_handlers.go b/go/server/subreddit_handlers.go index 8be3993..6a95f8c 100644 --- a/go/server/subreddit_handlers.go +++ b/go/server/subreddit_handlers.go @@ -86,8 +86,16 @@ func (su *SubredditHandler) ListSubreddits(ctx context.Context, request *connect // Only the fields that are set in the request will be updated. // // Returns error with connect.CodeNotFound if subreddit does not exist. -func (su *SubredditHandler) UpdateSubreddit(_ context.Context, _ *connect.Request[subreddits.UpdateSubredditRequest]) (*connect.Response[subreddits.UpdateSubredditResponse], error) { - panic("not implemented") // TODO: Implement +func (su *SubredditHandler) UpdateSubreddit(ctx context.Context, request *connect.Request[subreddits.UpdateSubredditRequest]) (*connect.Response[subreddits.UpdateSubredditResponse], error) { + set := subredditConverter.ProtoSubredditSetterToBobSubredditSetter(request.Msg.Set) + err := su.API.UpdateSubreddit(ctx, request.Msg.Name, set) + if err != nil { + return nil, errs.IntoConnectError(err) + } + resp := &subreddits.UpdateSubredditResponse{ + Name: request.Msg.Name, + } + return connect.NewResponse(resp), nil } // DeleteSubreddit deletes a subreddit. diff --git a/schemas/proto/subreddits/v1/update.proto b/schemas/proto/subreddits/v1/update.proto index f94a2a4..4c65510 100644 --- a/schemas/proto/subreddits/v1/update.proto +++ b/schemas/proto/subreddits/v1/update.proto @@ -13,7 +13,7 @@ message UpdateSubredditRequest { } message SubredditSetter { - optional bool disable_scheduler = 1; + optional bool disabled = 1; optional string schedule = 2 [(buf.validate.field).string.min_len = 1]; optional int64 countback = 3 [(buf.validate.field).int64.gt = 0]; }