forked from ebhomengo/niki
contract protobuf for campaign servic
This commit is contained in:
parent
95be95632c
commit
d564883081
|
|
@ -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"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
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
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
s.CheckAndCompleteCampaigns(ctx, req)
|
||||
case <-ctx.Done():
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
// 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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
package service
|
||||
Loading…
Reference in New Issue