From 66ff29d36ed788e692b8885622e77a5bec676de7 Mon Sep 17 00:00:00 2001 From: Akhilesh Pandey Date: Mon, 13 Nov 2023 18:37:53 +0000 Subject: [PATCH] feat: introduce new event for repo deletion and refactor existing pullreqevents to repoevents (#736) --- app/api/controller/repo/controller.go | 4 +++ app/api/controller/repo/delete.go | 7 ++++ app/api/controller/repo/wire.go | 24 ++++++++++---- app/events/repo/category.go | 20 ++++++++++++ app/events/repo/events_repo.go | 47 +++++++++++++++++++++++++++ app/events/repo/reader.go | 38 ++++++++++++++++++++++ app/events/repo/reporter.go | 37 +++++++++++++++++++++ app/events/repo/wire.go | 35 ++++++++++++++++++++ cmd/gitness/wire.go | 2 ++ cmd/gitness/wire_gen.go | 35 +++++++++++--------- 10 files changed, 228 insertions(+), 21 deletions(-) create mode 100644 app/events/repo/category.go create mode 100644 app/events/repo/events_repo.go create mode 100644 app/events/repo/reader.go create mode 100644 app/events/repo/reporter.go create mode 100644 app/events/repo/wire.go diff --git a/app/api/controller/repo/controller.go b/app/api/controller/repo/controller.go index 6043f5725..7ff268393 100644 --- a/app/api/controller/repo/controller.go +++ b/app/api/controller/repo/controller.go @@ -24,6 +24,7 @@ import ( "github.com/harness/gitness/app/api/usererror" "github.com/harness/gitness/app/auth" "github.com/harness/gitness/app/auth/authz" + repoevents "github.com/harness/gitness/app/events/repo" "github.com/harness/gitness/app/services/codeowners" "github.com/harness/gitness/app/services/importer" "github.com/harness/gitness/app/services/protection" @@ -51,6 +52,7 @@ type Controller struct { gitRPCClient gitrpc.Interface importer *importer.Repository codeOwners *codeowners.Service + eventReporter *repoevents.Reporter } func NewController( @@ -68,6 +70,7 @@ func NewController( gitRPCClient gitrpc.Interface, importer *importer.Repository, codeOwners *codeowners.Service, + eventReporter *repoevents.Reporter, ) *Controller { return &Controller{ defaultBranch: defaultBranch, @@ -84,6 +87,7 @@ func NewController( gitRPCClient: gitRPCClient, importer: importer, codeOwners: codeOwners, + eventReporter: eventReporter, } } diff --git a/app/api/controller/repo/delete.go b/app/api/controller/repo/delete.go index 84e6feff9..62ec4c55b 100644 --- a/app/api/controller/repo/delete.go +++ b/app/api/controller/repo/delete.go @@ -21,6 +21,7 @@ import ( apiauth "github.com/harness/gitness/app/api/auth" "github.com/harness/gitness/app/api/controller" "github.com/harness/gitness/app/auth" + repoevents "github.com/harness/gitness/app/events/repo" "github.com/harness/gitness/gitrpc" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" @@ -63,6 +64,12 @@ func (c *Controller) DeleteNoAuth(ctx context.Context, session *auth.Session, re return fmt.Errorf("failed to delete repo from db: %w", err) } + c.eventReporter.Deleted( + ctx, + &repoevents.DeletedPayload{ + RepoID: repo.ID, + }, + ) return nil } diff --git a/app/api/controller/repo/wire.go b/app/api/controller/repo/wire.go index 8a26c269b..fddc3845e 100644 --- a/app/api/controller/repo/wire.go +++ b/app/api/controller/repo/wire.go @@ -16,6 +16,7 @@ package repo import ( "github.com/harness/gitness/app/auth/authz" + repoevents "github.com/harness/gitness/app/events/repo" "github.com/harness/gitness/app/services/codeowners" "github.com/harness/gitness/app/services/importer" "github.com/harness/gitness/app/services/protection" @@ -34,15 +35,26 @@ var WireSet = wire.NewSet( ProvideController, ) -func ProvideController(config *types.Config, tx dbtx.Transactor, urlProvider url.Provider, - uidCheck check.PathUID, authorizer authz.Authorizer, repoStore store.RepoStore, - spaceStore store.SpaceStore, pipelineStore store.PipelineStore, - principalStore store.PrincipalStore, ruleStore store.RuleStore, protectionManager *protection.Manager, - rpcClient gitrpc.Interface, importer *importer.Repository, codeOwners *codeowners.Service, +func ProvideController( + config *types.Config, + tx dbtx.Transactor, + urlProvider url.Provider, + uidCheck check.PathUID, + authorizer authz.Authorizer, + repoStore store.RepoStore, + spaceStore store.SpaceStore, + pipelineStore store.PipelineStore, + principalStore store.PrincipalStore, + ruleStore store.RuleStore, + protectionManager *protection.Manager, + rpcClient gitrpc.Interface, + importer *importer.Repository, + codeOwners *codeowners.Service, + reporeporter *repoevents.Reporter, ) *Controller { return NewController(config.Git.DefaultBranch, tx, urlProvider, uidCheck, authorizer, repoStore, spaceStore, pipelineStore, principalStore, ruleStore, protectionManager, - rpcClient, importer, codeOwners) + rpcClient, importer, codeOwners, reporeporter) } diff --git a/app/events/repo/category.go b/app/events/repo/category.go new file mode 100644 index 000000000..c86a29030 --- /dev/null +++ b/app/events/repo/category.go @@ -0,0 +1,20 @@ +// Copyright 2023 Harness, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package events + +const ( + // category defines the event category used for this package. + category = "repo" +) diff --git a/app/events/repo/events_repo.go b/app/events/repo/events_repo.go new file mode 100644 index 000000000..8c82247e4 --- /dev/null +++ b/app/events/repo/events_repo.go @@ -0,0 +1,47 @@ +// Copyright 2023 Harness, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package events + +import ( + "context" + + "github.com/harness/gitness/events" + + "github.com/rs/zerolog/log" +) + +const DeletedEvent events.EventType = "deleted" + +type DeletedPayload struct { + RepoID int64 `json:"repo_id"` +} + +func (r *Reporter) Deleted(ctx context.Context, payload *DeletedPayload) { + if payload == nil { + return + } + eventID, err := events.ReporterSendEvent(r.innerReporter, ctx, DeletedEvent, payload) + if err != nil { + log.Ctx(ctx).Err(err).Msgf("failed to send repo deleted event") + return + } + + log.Ctx(ctx).Debug().Msgf("reported repo deleted event with id '%s'", eventID) +} + +func (r *Reader) RegisterRepoDeleted(fn events.HandlerFunc[*DeletedPayload], + opts ...events.HandlerOption) error { + return events.ReaderRegisterEvent(r.innerReader, DeletedEvent, fn, opts...) +} diff --git a/app/events/repo/reader.go b/app/events/repo/reader.go new file mode 100644 index 000000000..27b39a9c5 --- /dev/null +++ b/app/events/repo/reader.go @@ -0,0 +1,38 @@ +// Copyright 2023 Harness, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package events + +import ( + "github.com/harness/gitness/events" +) + +func NewReaderFactory(eventsSystem *events.System) (*events.ReaderFactory[*Reader], error) { + readerFactoryFunc := func(innerReader *events.GenericReader) (*Reader, error) { + return &Reader{ + innerReader: innerReader, + }, nil + } + + return events.NewReaderFactory(eventsSystem, category, readerFactoryFunc) +} + +// Reader is the event reader for this package. +type Reader struct { + innerReader *events.GenericReader +} + +func (r *Reader) Configure(opts ...events.ReaderOption) { + r.innerReader.Configure(opts...) +} diff --git a/app/events/repo/reporter.go b/app/events/repo/reporter.go new file mode 100644 index 000000000..68fdecaad --- /dev/null +++ b/app/events/repo/reporter.go @@ -0,0 +1,37 @@ +// Copyright 2023 Harness, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package events + +import ( + "errors" + + "github.com/harness/gitness/events" +) + +// Reporter is the event reporter for this package. +type Reporter struct { + innerReporter *events.GenericReporter +} + +func NewReporter(eventsSystem *events.System) (*Reporter, error) { + innerReporter, err := events.NewReporter(eventsSystem, category) + if err != nil { + return nil, errors.New("failed to create new GenericReporter from event system") + } + + return &Reporter{ + innerReporter: innerReporter, + }, nil +} diff --git a/app/events/repo/wire.go b/app/events/repo/wire.go new file mode 100644 index 000000000..215800d79 --- /dev/null +++ b/app/events/repo/wire.go @@ -0,0 +1,35 @@ +// Copyright 2023 Harness, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package events + +import ( + "github.com/harness/gitness/events" + + "github.com/google/wire" +) + +// WireSet provides a wire set for this package. +var WireSet = wire.NewSet( + ProvideReaderFactory, + ProvideReporter, +) + +func ProvideReaderFactory(eventsSystem *events.System) (*events.ReaderFactory[*Reader], error) { + return NewReaderFactory(eventsSystem) +} + +func ProvideReporter(eventsSystem *events.System) (*Reporter, error) { + return NewReporter(eventsSystem) +} diff --git a/cmd/gitness/wire.go b/cmd/gitness/wire.go index adce61759..d3a940a22 100644 --- a/cmd/gitness/wire.go +++ b/cmd/gitness/wire.go @@ -35,6 +35,7 @@ import ( "github.com/harness/gitness/app/bootstrap" gitevents "github.com/harness/gitness/app/events/git" pullreqevents "github.com/harness/gitness/app/events/pullreq" + repoevents "github.com/harness/gitness/app/events/repo" "github.com/harness/gitness/app/pipeline/canceler" "github.com/harness/gitness/app/pipeline/commit" "github.com/harness/gitness/app/pipeline/file" @@ -110,6 +111,7 @@ func initSystem(ctx context.Context, config *types.Config) (*cliserver.System, e authz.WireSet, gitevents.WireSet, pullreqevents.WireSet, + repoevents.WireSet, cliserver.ProvideGitRPCServerConfig, gitrpcserver.WireSet, cliserver.ProvideGitRPCClientConfig, diff --git a/cmd/gitness/wire_gen.go b/cmd/gitness/wire_gen.go index 04dff891e..a3de630dc 100644 --- a/cmd/gitness/wire_gen.go +++ b/cmd/gitness/wire_gen.go @@ -32,8 +32,9 @@ import ( "github.com/harness/gitness/app/auth/authn" "github.com/harness/gitness/app/auth/authz" "github.com/harness/gitness/app/bootstrap" - events3 "github.com/harness/gitness/app/events/git" - events2 "github.com/harness/gitness/app/events/pullreq" + events4 "github.com/harness/gitness/app/events/git" + events3 "github.com/harness/gitness/app/events/pullreq" + events2 "github.com/harness/gitness/app/events/repo" "github.com/harness/gitness/app/pipeline/canceler" "github.com/harness/gitness/app/pipeline/commit" "github.com/harness/gitness/app/pipeline/file" @@ -154,7 +155,16 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro } codeownersConfig := server.ProvideCodeOwnerConfig(config) codeownersService := codeowners.ProvideCodeOwners(gitrpcInterface, repoStore, codeownersConfig, principalStore) - repoController := repo.ProvideController(config, transactor, provider, pathUID, authorizer, repoStore, spaceStore, pipelineStore, principalStore, ruleStore, protectionManager, gitrpcInterface, repository, codeownersService) + eventsConfig := server.ProvideEventsConfig(config) + eventsSystem, err := events.ProvideSystem(eventsConfig, universalClient) + if err != nil { + return nil, err + } + reporter, err := events2.ProvideReporter(eventsSystem) + if err != nil { + return nil, err + } + repoController := repo.ProvideController(config, transactor, provider, pathUID, authorizer, repoStore, spaceStore, pipelineStore, principalStore, ruleStore, protectionManager, gitrpcInterface, repository, codeownersService, reporter) executionStore := database.ProvideExecutionStore(db) checkStore := database.ProvideCheckStore(db, principalInfoCache) stageStore := database.ProvideStageStore(db) @@ -192,31 +202,26 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro pullReqReviewStore := database.ProvidePullReqReviewStore(db) pullReqReviewerStore := database.ProvidePullReqReviewerStore(db, principalInfoCache) pullReqFileViewStore := database.ProvidePullReqFileViewStore(db) - eventsConfig := server.ProvideEventsConfig(config) - eventsSystem, err := events.ProvideSystem(eventsConfig, universalClient) - if err != nil { - return nil, err - } - reporter, err := events2.ProvideReporter(eventsSystem) + eventsReporter, err := events3.ProvideReporter(eventsSystem) if err != nil { return nil, err } migrator := codecomments.ProvideMigrator(gitrpcInterface) - readerFactory, err := events3.ProvideReaderFactory(eventsSystem) + readerFactory, err := events4.ProvideReaderFactory(eventsSystem) if err != nil { return nil, err } - eventsReaderFactory, err := events2.ProvideReaderFactory(eventsSystem) + eventsReaderFactory, err := events3.ProvideReaderFactory(eventsSystem) if err != nil { return nil, err } repoGitInfoView := database.ProvideRepoGitInfoView(db) repoGitInfoCache := cache.ProvideRepoGitInfoCache(repoGitInfoView) - pullreqService, err := pullreq.ProvideService(ctx, config, readerFactory, eventsReaderFactory, reporter, gitrpcInterface, repoGitInfoCache, repoStore, pullReqStore, pullReqActivityStore, codeCommentView, migrator, pullReqFileViewStore, pubSub, provider, streamer) + pullreqService, err := pullreq.ProvideService(ctx, config, readerFactory, eventsReaderFactory, eventsReporter, gitrpcInterface, repoGitInfoCache, repoStore, pullReqStore, pullReqActivityStore, codeCommentView, migrator, pullReqFileViewStore, pubSub, provider, streamer) if err != nil { return nil, err } - pullreqController := pullreq2.ProvideController(transactor, provider, authorizer, pullReqStore, pullReqActivityStore, codeCommentView, pullReqReviewStore, pullReqReviewerStore, repoStore, principalStore, pullReqFileViewStore, membershipStore, checkStore, gitrpcInterface, reporter, mutexManager, migrator, pullreqService, protectionManager, streamer, codeownersService) + pullreqController := pullreq2.ProvideController(transactor, provider, authorizer, pullReqStore, pullReqActivityStore, codeCommentView, pullReqReviewStore, pullReqReviewerStore, repoStore, principalStore, pullReqFileViewStore, membershipStore, checkStore, gitrpcInterface, eventsReporter, mutexManager, migrator, pullreqService, protectionManager, streamer, codeownersService) webhookConfig := server.ProvideWebhookConfig(config) webhookStore := database.ProvideWebhookStore(db) webhookExecutionStore := database.ProvideWebhookExecutionStore(db) @@ -225,11 +230,11 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro return nil, err } webhookController := webhook2.ProvideController(webhookConfig, authorizer, webhookStore, webhookExecutionStore, repoStore, webhookService, encrypter) - eventsReporter, err := events3.ProvideReporter(eventsSystem) + reporter2, err := events4.ProvideReporter(eventsSystem) if err != nil { return nil, err } - githookController := githook.ProvideController(authorizer, principalStore, repoStore, eventsReporter, pullReqStore, provider, protectionManager) + githookController := githook.ProvideController(authorizer, principalStore, repoStore, reporter2, pullReqStore, provider, protectionManager) serviceaccountController := serviceaccount.NewController(principalUID, authorizer, principalStore, spaceStore, repoStore, tokenStore) principalController := principal.ProvideController(principalStore) checkController := check2.ProvideController(transactor, authorizer, repoStore, checkStore, gitrpcInterface)