contract protobuf for campaign servic

This commit is contained in:
matina 2026-05-06 02:38:22 -07:00
parent 95be95632c
commit d564883081
4 changed files with 72 additions and 41 deletions

View File

@ -19,3 +19,12 @@ type CreateCampaignRequest struct {
DeadlineAt *time.Time `json:"deadline_at,omitempty"` DeadlineAt *time.Time `json:"deadline_at,omitempty"`
AdminID types.ID `json:"admin_id" validate:"required"` 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"`
}

View File

@ -6,58 +6,59 @@ import (
"time" "time"
) )
func (s *CampaignService) MonitorCampaignProgress(ctx context.Context) { func (s *CampaignService) MonitorCampaignProgress(ctx context.Context, req FilterRequest) {
//c := cron.New() ticker := time.NewTicker(1 * time.Hour)
// defer ticker.Stop()
//c.AddFunc("@hourly", func() {
// s.checkAndCompleteCampaigns(context.Background())
//})
//
//c.Start()
//ticker := time.NewTicker(1 * time.Hour) // Check every hour for {
//defer ticker.Stop() select {
// case <-ticker.C:
//for { s.CheckAndCompleteCampaigns(ctx, req)
// select { case <-ctx.Done():
// case <-ticker.C:
// s.checkAndCompleteCampaigns(ctx)
// case <-ctx.Done():
// return
// }
//}
}
func (s *CampaignService) checkAndCompleteCampaigns(ctx context.Context) {
activeCampaigns, err := s.repoStatus.FindActiveCampaigns(ctx) // Method to fetch active campaigns
if err != nil {
// Log the error, but don't stop the monitor
return return
} }
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
}
// 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
}
}
}
} }
} }
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 {
return CompletedCampaignResponse{}, err
}
var totalChecked uint64
var totalFinished uint64
for _, campaign := range activeCampaigns {
totalChecked++
shouldFinish := false
if campaign.DeadlineAt != nil && campaign.DeadlineAt.Before(now) {
shouldFinish = true
}
if campaign.RaisedAmount >= campaign.GoalAmount {
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
}

View File

@ -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;
}

View File

@ -1 +0,0 @@
package service