repo.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package repository
  2. import (
  3. "gorm.io/gorm"
  4. "wails-app/internal/dao"
  5. )
  6. // ParkingSessionRepository persists the parking-session aggregate in the
  7. // existing vehicle_record table. The table remains the historical parking
  8. // ledger while this module owns its active-session semantics.
  9. type ParkingSessionRepository struct{}
  10. func (r *ParkingSessionRepository) CreateTx(db *gorm.DB, session *dao.VehicleRecord) error {
  11. return db.Create(session).Error
  12. }
  13. func (r *ParkingSessionRepository) FindByIDTx(db *gorm.DB, id uint) (*dao.VehicleRecord, error) {
  14. var session dao.VehicleRecord
  15. if err := db.First(&session, id).Error; err != nil {
  16. return nil, err
  17. }
  18. return &session, nil
  19. }
  20. func (r *ParkingSessionRepository) FindActiveByIDTx(db *gorm.DB, id uint) (*dao.VehicleRecord, error) {
  21. var session dao.VehicleRecord
  22. if err := db.Where("id = ? AND exit_time IS NULL", id).First(&session).Error; err != nil {
  23. return nil, err
  24. }
  25. return &session, nil
  26. }
  27. func (r *ParkingSessionRepository) FindActiveByPlateTx(db *gorm.DB, plateNumber string) ([]dao.VehicleRecord, error) {
  28. var sessions []dao.VehicleRecord
  29. err := db.Where("plate_number = ? AND exit_time IS NULL", plateNumber).
  30. Order("entry_time DESC, id DESC").Find(&sessions).Error
  31. return sessions, err
  32. }
  33. func (r *ParkingSessionRepository) FindActiveByRFIDTx(db *gorm.DB, rfidTag string) ([]dao.VehicleRecord, error) {
  34. var sessions []dao.VehicleRecord
  35. err := db.Where("rfid_tag = ? AND exit_time IS NULL", rfidTag).
  36. Order("entry_time DESC, id DESC").Find(&sessions).Error
  37. return sessions, err
  38. }
  39. func (r *ParkingSessionRepository) FindActiveByExactIdentityTx(db *gorm.DB, plateNumber, rfidTag string) (*dao.VehicleRecord, error) {
  40. var session dao.VehicleRecord
  41. if err := db.Where("plate_number = ? AND rfid_tag = ? AND exit_time IS NULL", plateNumber, rfidTag).
  42. First(&session).Error; err != nil {
  43. return nil, err
  44. }
  45. return &session, nil
  46. }
  47. func (r *ParkingSessionRepository) UpdateActiveTx(db *gorm.DB, id uint, updates map[string]interface{}) (int64, error) {
  48. result := db.Model(&dao.VehicleRecord{}).Where("id = ? AND exit_time IS NULL", id).Updates(updates)
  49. return result.RowsAffected, result.Error
  50. }
  51. func (r *ParkingSessionRepository) UpdateUnpaidActiveTx(db *gorm.DB, id uint, updates map[string]interface{}) (int64, error) {
  52. result := db.Model(&dao.VehicleRecord{}).
  53. Where("id = ? AND exit_time IS NULL AND COALESCE(payment_status, '') <> ?", id, "paid").
  54. Updates(updates)
  55. return result.RowsAffected, result.Error
  56. }