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"`
|
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"`
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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