memory.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package repository
  2. import (
  3. "sync"
  4. "time"
  5. "job-cheng-xing/model"
  6. )
  7. type MemoryRepo struct {
  8. mu sync.RWMutex
  9. orders map[string]*model.Order
  10. }
  11. func NewMemoryRepo() *MemoryRepo {
  12. return &MemoryRepo{orders: make(map[string]*model.Order)}
  13. }
  14. func (r *MemoryRepo) Create(order *model.Order) error {
  15. r.mu.Lock()
  16. defer r.mu.Unlock()
  17. if _, exists := r.orders[order.ID]; exists {
  18. return model.NewAppError("conflict", "订单已存在", 409)
  19. }
  20. clone := *order
  21. r.orders[order.ID] = &clone
  22. return nil
  23. }
  24. func (r *MemoryRepo) FindByID(id string) (*model.Order, error) {
  25. r.mu.RLock()
  26. defer r.mu.RUnlock()
  27. order, ok := r.orders[id]
  28. if !ok {
  29. return nil, model.ErrNotFound
  30. }
  31. clone := *order
  32. return &clone, nil
  33. }
  34. func (r *MemoryRepo) Update(id string, oldStatus model.OrderStatus, newOrder *model.Order) error {
  35. r.mu.Lock()
  36. defer r.mu.Unlock()
  37. current, ok := r.orders[id]
  38. if !ok {
  39. return model.ErrNotFound
  40. }
  41. if current.Status != oldStatus {
  42. return model.ErrStatusConflict
  43. }
  44. current.Status = newOrder.Status
  45. if newOrder.ProviderID != nil {
  46. current.ProviderID = newOrder.ProviderID
  47. }
  48. current.UpdatedAt = time.Now()
  49. return nil
  50. }