diff --git a/domain/campaign/service/param.go b/domain/campaign/service/param.go index ecb9a430..10a95c73 100644 --- a/domain/campaign/service/param.go +++ b/domain/campaign/service/param.go @@ -19,3 +19,12 @@ type CreateCampaignRequest struct { DeadlineAt *time.Time `json:"deadline_at,omitempty"` AdminID types.ID `json:"admin_id" validate:"required"` } + +type CompletedCampaignResponse struct { + TotalChecked uint64 `json:"total_checked"` + TotalFinished uint64 `json:"total_finished"` +} + +type FilterRequest struct { + Limit uint32 `json:"total_checked"` +} diff --git a/domain/campaign/service/update-campaign-status.go b/domain/campaign/service/update-campaign-status.go index 90f54a13..15ccb54f 100644 --- a/domain/campaign/service/update-campaign-status.go +++ b/domain/campaign/service/update-campaign-status.go @@ -6,58 +6,59 @@ import ( "time" ) -func (s *CampaignService) MonitorCampaignProgress(ctx context.Context) { +func (s *CampaignService) MonitorCampaignProgress(ctx context.Context, req FilterRequest) { - //c := cron.New() - // - //c.AddFunc("@hourly", func() { - // s.checkAndCompleteCampaigns(context.Background()) - //}) - // - //c.Start() + ticker := time.NewTicker(1 * time.Hour) + defer ticker.Stop() - //ticker := time.NewTicker(1 * time.Hour) // Check every hour - //defer ticker.Stop() - // - //for { - // select { - // case <-ticker.C: - // s.checkAndCompleteCampaigns(ctx) - // case <-ctx.Done(): - // return - // } - //} + for { + select { + case <-ticker.C: + s.CheckAndCompleteCampaigns(ctx, req) + case <-ctx.Done(): + return + } + } } -func (s *CampaignService) checkAndCompleteCampaigns(ctx context.Context) { - activeCampaigns, err := s.repoStatus.FindActiveCampaigns(ctx) // Method to fetch active campaigns +func (s *CampaignService) CheckAndCompleteCampaigns(ctx context.Context, req FilterRequest) (CompletedCampaignResponse, error) { + + now := time.Now() + + //TODO:with filter request later complete + activeCampaigns, err := s.repoStatus.FindActiveCampaigns(ctx) if err != nil { - // Log the error, but don't stop the monitor - return + return CompletedCampaignResponse{}, err } + var totalChecked uint64 + var totalFinished uint64 + for _, campaign := range activeCampaigns { - // Check if deadline has passed - if campaign.DeadlineAt != nil && campaign.DeadlineAt.Before(time.Now()) { - if campaign.Status != types.CampaignFinished { - campaign.Status = types.CampaignFinished - err := s.repoStatus.UpdateStatus(ctx, campaign.ID, types.CampaignFinished) // Method to update status - if err != nil { - // Log error for this specific campaign - } - } - continue // Move to next campaign + + totalChecked++ + + shouldFinish := false + + if campaign.DeadlineAt != nil && campaign.DeadlineAt.Before(now) { + shouldFinish = true } - // Check if goal is met if campaign.RaisedAmount >= campaign.GoalAmount { - if campaign.Status != types.CampaignFinished { - campaign.Status = types.CampaignFinished - err := s.repoStatus.UpdateStatus(ctx, campaign.ID, types.CampaignFinished) // Method to update status - if err != nil { - // Log error for this specific campaign - } + shouldFinish = true + } + + if shouldFinish && campaign.Status != types.CampaignFinished { + if err := s.repoStatus.UpdateStatus(ctx, campaign.ID, types.CampaignFinished); err != nil { + continue } + + totalFinished++ } } + + return CompletedCampaignResponse{ + TotalChecked: totalChecked, + TotalFinished: totalFinished, + }, nil } diff --git a/donate_app/protobuf/campaign.proto b/donate_app/protobuf/campaign.proto new file mode 100644 index 00000000..0c14172d --- /dev/null +++ b/donate_app/protobuf/campaign.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package campaign; + +option go_package = "git.gocasts.ir/ebhomengo/niki/donate_app/protobuf;campaignpb"; + +service CampaignService { + rpc CheckAndCompleteCampaigns (CheckAndCompleteCampaignsRequest) returns (CheckAndCompleteCampaignsResponse); +} + +message CheckAndCompleteCampaignsRequest { + FilterRequest filter = 1; +} + +message CheckAndCompleteCampaignsResponse { + uint64 total_checked = 1; + uint64 total_finished = 2; +} + +message FilterRequest { + uint32 limit = 1; +} \ No newline at end of file diff --git a/donate_app/service/service.go b/donate_app/service/service.go deleted file mode 100644 index 6d43c336..00000000 --- a/donate_app/service/service.go +++ /dev/null @@ -1 +0,0 @@ -package service