profileShare

rasmusjy / splitapp-backend-microservices

Read-only snapshot

No repository description.

main default branch 501 files Expires Sep 13, 2026, 9:06 AM
WishlistService.cs 5,549 bytes
1 using SplitApp.WebApp.Application.DTO;
2 using SplitApp.WebApp.Application.Mappers;
3 using SplitApp.Modules.Trips.Domain.Entities;
4 using SplitApp.Modules.Trips.Domain.Enums;
5 using SplitApp.Modules.Expenses.Domain.Entities;
6 using SplitApp.Modules.Expenses.Domain.Enums;
7 using SplitApp.WebApp.Application.Contracts;
8
9 namespace SplitApp.WebApp.Application.Services;
10
11 public class WishlistService : IWishlistService
12 {
13 private readonly IAppUnitOfWork _uow;
14
15 public WishlistService(IAppUnitOfWork uow)
16 {
17 _uow = uow;
18 }
19
20 public async Task<List<TripWishlistItemBllDto>> GetByTripIdAsync(Guid tripId, Guid userId)
21 {
22 if (!await _uow.TripParticipants.IsParticipantAsync(tripId, userId))
23 return new List<TripWishlistItemBllDto>();
24 var items = await _uow.TripWishlistItems.GetByTripIdAsync(tripId);
25 return WishlistBllDtoFactory.CreateList(items);
26 }
27
28 public async Task<TripWishlistItemBllDto?> GetByIdAsync(Guid id, Guid userId)
29 {
30 var item = await _uow.TripWishlistItems.GetByIdAsync(id);
31 if (item == null) return null;
32 if (!await _uow.TripParticipants.IsParticipantAsync(item.TripId, userId)) return null;
33 return WishlistBllDtoFactory.Create(item);
34 }
35
36 public async Task<TripWishlistItemBllDto?> GetByIdRawAsync(Guid id)
37 {
38 var item = await _uow.TripWishlistItems.GetByIdAsync(id);
39 return item == null ? null : WishlistBllDtoFactory.Create(item);
40 }
41
42 public async Task<(TripWishlistItemBllDto? item, string? errorCode)> CreateAsync(TripWishlistItemBllDto item, Guid userId)
43 {
44 if (!await _uow.TripParticipants.IsParticipantAsync(item.TripId, userId))
45 return (null, "forbidden");
46
47 var entity = WishlistBllDtoFactory.ToEntity(item);
48 if (entity.Id == Guid.Empty) entity.Id = Guid.NewGuid();
49 entity.AddedByUserId = userId;
50 _uow.TripWishlistItems.Add(entity);
51 await _uow.SaveChangesAsync();
52
53 var reloaded = await _uow.TripWishlistItems.GetByIdAsync(entity.Id);
54 return (reloaded == null ? null : WishlistBllDtoFactory.Create(reloaded), null);
55 }
56
57 public async Task<(bool success, string? errorCode)> UpdateAsync(Guid id, TripWishlistItemBllDto incoming, Guid userId)
58 {
59 var existing = await _uow.TripWishlistItems.GetByIdAsync(id);
60 if (existing == null) return (false, "notfound");
61
62 if (!await _uow.TripParticipants.IsParticipantAsync(existing.TripId, userId))
63 return (false, "forbidden");
64
65 if (existing.AddedByUserId != userId) return (false, "forbidden");
66
67 existing.Title = incoming.Title;
68 existing.Description = incoming.Description;
69 existing.Category = incoming.Category;
70 existing.Priority = incoming.Priority;
71 existing.EstimatedCost = incoming.EstimatedCost;
72 existing.Url = incoming.Url;
73 existing.Location = incoming.Location;
74
75 _uow.TripWishlistItems.Update(existing);
76 await _uow.SaveChangesAsync();
77 return (true, null);
78 }
79
80 public async Task<(bool success, string? errorCode)> DeleteAsync(Guid id, Guid userId)
81 {
82 var existing = await _uow.TripWishlistItems.GetByIdAsync(id);
83 if (existing == null) return (false, "notfound");
84
85 if (!await _uow.TripParticipants.IsParticipantAsync(existing.TripId, userId))
86 return (false, "forbidden");
87
88 if (existing.AddedByUserId != userId) return (false, "forbidden");
89
90 var voteRepo = _uow.GetRepository<TripWishlistVote>();
91 var allVotes = (await voteRepo.GetAllAsync()).Where(v => v.WishlistItemId == id).ToList();
92 foreach (var vote in allVotes)
93 {
94 await voteRepo.RemoveAsync(vote.Id);
95 }
96
97 await _uow.TripWishlistItems.RemoveAsync(id);
98 await _uow.SaveChangesAsync();
99 return (true, null);
100 }
101
102 public async Task<(bool success, string? errorCode)> ToggleVoteAsync(Guid id, Guid userId)
103 {
104 var existing = await _uow.TripWishlistItems.GetByIdAsync(id);
105 if (existing == null) return (false, "notfound");
106
107 if (!await _uow.TripParticipants.IsParticipantAsync(existing.TripId, userId))
108 return (false, "forbidden");
109
110 var voteRepo = _uow.GetRepository<TripWishlistVote>();
111 var allVotes = (await voteRepo.GetAllAsync()).ToList();
112 var existingVote = allVotes.FirstOrDefault(v => v.WishlistItemId == id && v.UserId == userId);
113
114 if (existingVote != null)
115 {
116 await voteRepo.RemoveAsync(existingVote.Id);
117 }
118 else
119 {
120 voteRepo.Add(new TripWishlistVote
121 {
122 Id = Guid.NewGuid(),
123 WishlistItemId = id,
124 UserId = userId,
125 IsInterested = true
126 });
127 }
128
129 await _uow.SaveChangesAsync();
130 return (true, null);
131 }
132
133 public async Task<(bool success, string? errorCode)> ToggleCompleteAsync(Guid id, Guid userId)
134 {
135 var existing = await _uow.TripWishlistItems.GetByIdAsync(id);
136 if (existing == null) return (false, "notfound");
137
138 if (!await _uow.TripParticipants.IsParticipantAsync(existing.TripId, userId))
139 return (false, "forbidden");
140
141 existing.IsCompleted = !existing.IsCompleted;
142 existing.CompletedAt = existing.IsCompleted ? DateTime.UtcNow : null;
143
144 _uow.TripWishlistItems.Update(existing);
145 await _uow.SaveChangesAsync();
146 return (true, null);
147 }
148 }
149