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 }