94 lines
2.5 KiB
Go
94 lines
2.5 KiB
Go
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"sync"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Donation struct {
|
||
|
|
Name string `json:"name"`
|
||
|
|
Amount int `json:"amount"`
|
||
|
|
Message string `json:"message"`
|
||
|
|
Timestamp time.Time `json:"timestamp"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type CampaignStats struct {
|
||
|
|
TotalDonors int `json:"totalDonors"`
|
||
|
|
TotalAmount int `json:"totalAmount"`
|
||
|
|
ReleasedFish int `json:"releasedFish"` // 마리
|
||
|
|
CollectedWaste int `json:"collectedWaste"` // kg
|
||
|
|
PurifiedArea int `json:"purifiedArea"` // m²
|
||
|
|
}
|
||
|
|
|
||
|
|
type CampaignService struct {
|
||
|
|
mu sync.Mutex
|
||
|
|
donations []Donation
|
||
|
|
stats CampaignStats
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewCampaignService() *CampaignService {
|
||
|
|
// 기본 통계치 설정
|
||
|
|
return &CampaignService{
|
||
|
|
donations: []Donation{
|
||
|
|
{Name: "김어부", Amount: 50000, Message: "바다가 다시 풍요로워지길 바랍니다.", Timestamp: time.Now().Add(-10 * time.Minute)},
|
||
|
|
{Name: "이바다", Amount: 30000, Message: "깨끗한 바다를 우리 아이들에게!", Timestamp: time.Now().Add(-1 * time.Hour)},
|
||
|
|
{Name: "박수협", Amount: 100000, Message: "어업인 여러분 힘내세요!", Timestamp: time.Now().Add(-3 * time.Hour)},
|
||
|
|
},
|
||
|
|
stats: CampaignStats{
|
||
|
|
TotalDonors: 12543,
|
||
|
|
TotalAmount: 627150000, // 6억 2천만원
|
||
|
|
ReleasedFish: 4200000, // 420만 마리
|
||
|
|
CollectedWaste: 185000, // 185,000 kg (185톤)
|
||
|
|
PurifiedArea: 95000, // 95,000 m²
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CampaignService) GetStats() CampaignStats {
|
||
|
|
c.mu.Lock()
|
||
|
|
defer c.mu.Unlock()
|
||
|
|
return c.stats
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CampaignService) GetRecentDonations() []Donation {
|
||
|
|
c.mu.Lock()
|
||
|
|
defer c.mu.Unlock()
|
||
|
|
|
||
|
|
// 최근 10개만 반환
|
||
|
|
n := len(c.donations)
|
||
|
|
if n > 10 {
|
||
|
|
return c.donations[n-10:]
|
||
|
|
}
|
||
|
|
return c.donations
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CampaignService) Donate(name string, amount int, message string) CampaignStats {
|
||
|
|
c.mu.Lock()
|
||
|
|
defer c.mu.Unlock()
|
||
|
|
|
||
|
|
if name == "" {
|
||
|
|
name = "익명의 기부자"
|
||
|
|
}
|
||
|
|
|
||
|
|
newDonation := Donation{
|
||
|
|
Name: name,
|
||
|
|
Amount: amount,
|
||
|
|
Message: message,
|
||
|
|
Timestamp: time.Now(),
|
||
|
|
}
|
||
|
|
c.donations = append(c.donations, newDonation)
|
||
|
|
|
||
|
|
// 기부로 인한 통계치 상승 효과 시뮬레이션
|
||
|
|
c.stats.TotalDonors += 1
|
||
|
|
c.stats.TotalAmount += amount
|
||
|
|
|
||
|
|
// 기부금에 비례하여 환경 개선 지표 증가
|
||
|
|
// 10,000원 당: 종자 2마리 방류, 0.5kg 쓰레기 수거, 0.2m² 정화
|
||
|
|
multiplier := float64(amount) / 10000.0
|
||
|
|
c.stats.ReleasedFish += int(multiplier * 2)
|
||
|
|
c.stats.CollectedWaste += int(multiplier * 0.5)
|
||
|
|
c.stats.PurifiedArea += int(multiplier * 0.2)
|
||
|
|
|
||
|
|
return c.stats
|
||
|
|
}
|