private void InternalCreditDebitPot(Pot pot, int userId, Action <Pot> potHandler, Action <Pot> potRollbackHandler, Action <PotUser> potUserHandler) { Errors.Clear(); using (var scope = new TransactionScope()) { try { // 1 - Update pot user var potUser = _potUserRepository.GetPotUser(pot.Id, userId); if (potUser == null || _potUserRepository.HasErrors) { Errors.Add("Unable to find user in the pot"); MergeErrors(_potUserRepository); return; } potUserHandler(potUser); _potUserRepository.UpdatePotUser(potUser); if (_potUserRepository.HasErrors) { Errors.Add("Unable to update the pot"); MergeErrors(_potUserRepository); return; } // 2 - Update pot potHandler(pot); _potRepository.UpdatePot(pot); if (_potRepository.HasErrors) { potRollbackHandler(pot); Errors.Add("Unable to debit pot"); MergeErrors(_potRepository); return; } scope.Complete(); } catch (Exception ex) { HandleException(ex); } } }
public void Quit(Trip trip, int userId, string userPseudo) { //TODO : Handle Repayment //TODO : Handle Fees for us //TODO : No need to go in DB for PotUser and TripParticipant //TODO : Notification Errors.Clear(); using (var scope = new TransactionScope()) { try { // 1 - Delete trip participant var participant = _participantRepository.GetTripParticipant(trip.Id, userPseudo); if (participant == null || _participantRepository.HasErrors) { Errors.Add("Unable to find participant"); MergeErrors(_participantRepository); return; } _participantRepository.DeleteTripParticipant(participant); if (_participantRepository.HasErrors) { Errors.Add("Unable to delete participant"); MergeErrors(_participantRepository); return; } // 2 - Delete user trip information var userTrip = _userTripRepository.GetUserTrip(userId, trip.TripName); if (userTrip == null || _userTripRepository.HasErrors) { Errors.Add("Unable to find user's trip"); MergeErrors(_userTripRepository); return; } _userTripRepository.DeleteUserTrip(userTrip); if (_userTripRepository.HasErrors) { Errors.Add("Unable to delete user's trip"); MergeErrors(_userTripRepository); return; } // 3 - Delete pot user information var potUser = _potUserRepository.GetPotUser(trip.TripPot.Id, userId); if (potUser == null || _potUserRepository.HasErrors) { Errors.Add("Unable to find user in the trip's pot"); MergeErrors(_potUserRepository); return; } _potUserRepository.DeletePotUser(potUser); if (_potUserRepository.HasErrors) { Errors.Add("Unable to delete user from pot"); MergeErrors(_potUserRepository); return; } // 4 - Update pot target amount if needed if (potUser.Amount > 0) { trip.TripPot.CurrentAmount -= potUser.Amount; _potRepository.UpdatePot(trip.TripPot); if (_potRepository.HasErrors) { trip.TripPot.CurrentAmount += potUser.Amount; Errors.Add("Unable to update trip's pot"); MergeErrors(_potRepository); return; } } trip.DeleteParticipant(participant); trip.TripPot.DeleteParticipant(potUser); scope.Complete(); } catch (Exception ex) { HandleException(ex); } } }