From 0a6dbf42e40b7e2cd56f2e32330aa16f9efa9f2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Andr=C3=A9?= Date: Wed, 24 Mar 2021 18:04:08 +0100 Subject: [PATCH] Implementation to have a favorite DZ by user. --- .../FavoriteDropZone.cs | 9 + .../net5.0/skydiveLogs-api.Domain.deps.json | 23 -- .../DropZoneService.cs | 56 +++- .../Interfaces/IDropZoneService.cs | 6 +- .../IFavoriteDropZoneRepository.cs | 13 + .../skydiveLogs-api.DomainService.csproj | 2 +- .../FavoriteDropZoneRepository.cs | 68 +++++ .../Interfaces/IDataProvider.cs | 2 + .../JumpRepository.cs | 2 +- .../LiteDbProvider.cs | 5 + .../Controllers/DropZoneController.cs | 20 +- Back/skydiveLogs-api/Init/dropZone.json | 243 ++++++------------ 12 files changed, 255 insertions(+), 194 deletions(-) create mode 100644 Back/skydiveLogs-api.Domain/FavoriteDropZone.cs delete mode 100644 Back/skydiveLogs-api.Domain/bin/Release/net5.0/skydiveLogs-api.Domain.deps.json create mode 100644 Back/skydiveLogs-api.DomainService/Repositories/IFavoriteDropZoneRepository.cs create mode 100644 Back/skydiveLogs-api.Infrastructure/FavoriteDropZoneRepository.cs diff --git a/Back/skydiveLogs-api.Domain/FavoriteDropZone.cs b/Back/skydiveLogs-api.Domain/FavoriteDropZone.cs new file mode 100644 index 0000000..de73e10 --- /dev/null +++ b/Back/skydiveLogs-api.Domain/FavoriteDropZone.cs @@ -0,0 +1,9 @@ +namespace skydiveLogs_api.Domain +{ + public class FavoriteDropZone + { + public DropZone DropZone { get; set; } + + public User User { get; set; } + } +} diff --git a/Back/skydiveLogs-api.Domain/bin/Release/net5.0/skydiveLogs-api.Domain.deps.json b/Back/skydiveLogs-api.Domain/bin/Release/net5.0/skydiveLogs-api.Domain.deps.json deleted file mode 100644 index 57aeb33..0000000 --- a/Back/skydiveLogs-api.Domain/bin/Release/net5.0/skydiveLogs-api.Domain.deps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v5.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v5.0": { - "skydiveLogs-api.Domain/1.0.0": { - "runtime": { - "skydiveLogs-api.Domain.dll": {} - } - } - } - }, - "libraries": { - "skydiveLogs-api.Domain/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/Back/skydiveLogs-api.DomainBusiness/DropZoneService.cs b/Back/skydiveLogs-api.DomainBusiness/DropZoneService.cs index 45290f0..51d0623 100644 --- a/Back/skydiveLogs-api.DomainBusiness/DropZoneService.cs +++ b/Back/skydiveLogs-api.DomainBusiness/DropZoneService.cs @@ -4,15 +4,17 @@ using System.Collections.Generic; using skydiveLogs_api.DomainBusiness.Interfaces; using skydiveLogs_api.DomainService.Repositories; using skydiveLogs_api.Domain; - +using System.Linq; namespace skydiveLogs_api.DomainBusiness { public class DropZoneService : IDropZoneService { - public DropZoneService(IDropZoneRepository dropZoneRepository) + public DropZoneService(IDropZoneRepository dropZoneRepository, + IFavoriteDropZoneRepository favoriteDropZoneRepository) { _dropZoneRepository = dropZoneRepository; + _favoriteDropZoneRepository = favoriteDropZoneRepository; } public void AddNewDz(DropZone newdropZone) @@ -25,9 +27,31 @@ namespace skydiveLogs_api.DomainBusiness throw new NotImplementedException(); } - public IEnumerable GetAllDzs() + public IEnumerable GetAllDzs(User connectedUser) { - return _dropZoneRepository.GetAll(); + var results = Enumerable.Empty(); + + var dropzones = _dropZoneRepository.GetAll(); + var favorites = _favoriteDropZoneRepository.GetAll(connectedUser); + + + results = from dropZone in dropzones + join favorite in favorites on dropZone equals favorite.DropZone into tmp + from favoriteDz in tmp.DefaultIfEmpty() + select new DropZone + { + Id = dropZone.Id, + Address = dropZone.Address, + Email = dropZone.Email, + Latitude = dropZone.Latitude, + Longitude = dropZone.Longitude, + Name = dropZone.Name, + Type = dropZone.Type, + Website = dropZone.Website, + IsFavorite = !(favoriteDz == null) + }; + + return results.ToList(); } public DropZone GetDzById(int id) @@ -42,6 +66,30 @@ namespace skydiveLogs_api.DomainBusiness return _dropZoneRepository.Update(dropZone); } + public bool AddToFavorite(int dzId, User connectedUser) + { + var dzToAddToFavorite = GetDzById(dzId); + + var favoriteDz = new FavoriteDropZone + { + DropZone = dzToAddToFavorite, + User = connectedUser + }; + + var result = _favoriteDropZoneRepository.Add(favoriteDz); + + return result > 0; + } + + public bool RemoveToFavorite(int dzId, User connectedUser) + { + var result = _favoriteDropZoneRepository.Delete(dzId, connectedUser.Id); + + return result > 0; + } + private readonly IDropZoneRepository _dropZoneRepository; + + private readonly IFavoriteDropZoneRepository _favoriteDropZoneRepository; } } diff --git a/Back/skydiveLogs-api.DomainBusiness/Interfaces/IDropZoneService.cs b/Back/skydiveLogs-api.DomainBusiness/Interfaces/IDropZoneService.cs index d1656e4..b7eb96f 100644 --- a/Back/skydiveLogs-api.DomainBusiness/Interfaces/IDropZoneService.cs +++ b/Back/skydiveLogs-api.DomainBusiness/Interfaces/IDropZoneService.cs @@ -7,7 +7,7 @@ namespace skydiveLogs_api.DomainBusiness.Interfaces { public interface IDropZoneService { - IEnumerable GetAllDzs(); + IEnumerable GetAllDzs(User connectedUser); DropZone GetDzById(int id); @@ -16,5 +16,9 @@ namespace skydiveLogs_api.DomainBusiness.Interfaces bool UpdateDz(int id, DropZone dropZone); void AddNewDz(DropZone dropZone); + + bool AddToFavorite(int dzId, User connectedUser); + + bool RemoveToFavorite(int dzId, User connectedUser); } } diff --git a/Back/skydiveLogs-api.DomainService/Repositories/IFavoriteDropZoneRepository.cs b/Back/skydiveLogs-api.DomainService/Repositories/IFavoriteDropZoneRepository.cs new file mode 100644 index 0000000..55beb3f --- /dev/null +++ b/Back/skydiveLogs-api.DomainService/Repositories/IFavoriteDropZoneRepository.cs @@ -0,0 +1,13 @@ +using skydiveLogs_api.Domain; +using System.Collections.Generic; + +namespace skydiveLogs_api.DomainService.Repositories +{ + public interface IFavoriteDropZoneRepository : IRepository + { + int Delete(int dropZoneId, int userId); + + IEnumerable GetAll(User user); + + } +} diff --git a/Back/skydiveLogs-api.DomainService/skydiveLogs-api.DomainService.csproj b/Back/skydiveLogs-api.DomainService/skydiveLogs-api.DomainService.csproj index 62ef106..1cd6930 100644 --- a/Back/skydiveLogs-api.DomainService/skydiveLogs-api.DomainService.csproj +++ b/Back/skydiveLogs-api.DomainService/skydiveLogs-api.DomainService.csproj @@ -6,7 +6,7 @@ - + diff --git a/Back/skydiveLogs-api.Infrastructure/FavoriteDropZoneRepository.cs b/Back/skydiveLogs-api.Infrastructure/FavoriteDropZoneRepository.cs new file mode 100644 index 0000000..c7a3b76 --- /dev/null +++ b/Back/skydiveLogs-api.Infrastructure/FavoriteDropZoneRepository.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; + +using LiteDB; + +using skydiveLogs_api.Domain; +using skydiveLogs_api.DomainService.Repositories; +using skydiveLogs_api.Infrastructure.Interfaces; + + +namespace skydiveLogs_api.Infrastructure +{ + public class FavoriteDropZoneRepository : IFavoriteDropZoneRepository + { + public FavoriteDropZoneRepository(IDataProvider dataProvider) + { + _dataProvider = dataProvider; + _col = _dataProvider.CollOfFavoriteDropZone; + } + + public int Delete(int dropZoneId, int userId) + { + return _col.DeleteMany(d => d.DropZone.Id == dropZoneId && d.User.Id == userId); + } + + public int Add(FavoriteDropZone favoriteToAdd) + { + int result; + + try + { + var tmp = _col.Insert(favoriteToAdd); + result = tmp.AsInt32; + } + catch + { + result = 0; + } + + return result; + } + + public IEnumerable GetAll(User user) + { + return _col.Query() + .Where(j => j.User.Id == user.Id) + .ToList(); + } + + public FavoriteDropZone GetById(int id) + { + throw new System.NotImplementedException(); + } + + public bool Update(FavoriteDropZone updated) + { + throw new System.NotImplementedException(); + } + + public IEnumerable GetAll() + { + throw new System.NotImplementedException(); + } + + private readonly IDataProvider _dataProvider; + + private readonly ILiteCollection _col; + } +} diff --git a/Back/skydiveLogs-api.Infrastructure/Interfaces/IDataProvider.cs b/Back/skydiveLogs-api.Infrastructure/Interfaces/IDataProvider.cs index 852c079..0b35dd2 100644 --- a/Back/skydiveLogs-api.Infrastructure/Interfaces/IDataProvider.cs +++ b/Back/skydiveLogs-api.Infrastructure/Interfaces/IDataProvider.cs @@ -24,5 +24,7 @@ namespace skydiveLogs_api.Infrastructure.Interfaces ILiteCollection CollOfUser { get; } ILiteCollection CollOfImage { get; } + + ILiteCollection CollOfFavoriteDropZone { get; } } } diff --git a/Back/skydiveLogs-api.Infrastructure/JumpRepository.cs b/Back/skydiveLogs-api.Infrastructure/JumpRepository.cs index 6804153..ee1ba53 100644 --- a/Back/skydiveLogs-api.Infrastructure/JumpRepository.cs +++ b/Back/skydiveLogs-api.Infrastructure/JumpRepository.cs @@ -23,7 +23,7 @@ namespace skydiveLogs_api.Infrastructure .Include(x => x.DropZone) .Include(x => x.Gear) .Include(x => x.JumpType) - .Include(x => x.User) + //.Include(x => x.User) .Query() .Where(j => j.User.Id == user.Id) .ToList(); diff --git a/Back/skydiveLogs-api.Infrastructure/LiteDbProvider.cs b/Back/skydiveLogs-api.Infrastructure/LiteDbProvider.cs index b10352e..22db661 100644 --- a/Back/skydiveLogs-api.Infrastructure/LiteDbProvider.cs +++ b/Back/skydiveLogs-api.Infrastructure/LiteDbProvider.cs @@ -21,6 +21,9 @@ namespace skydiveLogs_api.Infrastructure BsonMapper.Global.Entity().DbRef(x => x.User, "User"); BsonMapper.Global.Entity().DbRef(x => x.User, "User"); + + BsonMapper.Global.Entity().DbRef(x => x.User, "User"); + BsonMapper.Global.Entity().DbRef(x => x.DropZone, "DropZone"); } public ILiteCollection GetCollection() @@ -48,5 +51,7 @@ namespace skydiveLogs_api.Infrastructure public ILiteCollection CollOfUser => _db.GetCollection(); public ILiteCollection CollOfImage => _db.GetCollection(); + + public ILiteCollection CollOfFavoriteDropZone => _db.GetCollection(); } } diff --git a/Back/skydiveLogs-api/Controllers/DropZoneController.cs b/Back/skydiveLogs-api/Controllers/DropZoneController.cs index aa10bf1..11f3eba 100644 --- a/Back/skydiveLogs-api/Controllers/DropZoneController.cs +++ b/Back/skydiveLogs-api/Controllers/DropZoneController.cs @@ -25,7 +25,7 @@ namespace skydiveLogs_api.Controllers [EnableCors] public IEnumerable Get() { - var result = _dropZoneService.GetAllDzs(); + var result = _dropZoneService.GetAllDzs(ConnectedUser); return _mapper.Map>(result); } @@ -56,7 +56,7 @@ namespace skydiveLogs_api.Controllers return _dropZoneService.UpdateDz(id, _mapper.Map(value)); } - // DELETE: api/ApiWithActions/5 + // DELETE: api/ApiWithActions [HttpDelete("{id}")] [EnableCors] public void Delete(int id) @@ -64,6 +64,22 @@ namespace skydiveLogs_api.Controllers _dropZoneService.DeleteDzById(id); } + // PUT: api/DropZone/AddToFavorite/5 + [HttpPut("{id}")] + [EnableCors] + public bool AddToFavorite(int id) + { + return _dropZoneService.AddToFavorite(id, ConnectedUser); + } + + // PUT: api/DropZone/RemoveToFavorite/15 + [HttpPut("{id}")] + [EnableCors] + public bool RemoveToFavorite(int id) + { + return _dropZoneService.RemoveToFavorite(id, ConnectedUser); + } + private readonly IDropZoneService _dropZoneService; private readonly IMapper _mapper; } diff --git a/Back/skydiveLogs-api/Init/dropZone.json b/Back/skydiveLogs-api/Init/dropZone.json index 24f7a3f..b29f466 100644 --- a/Back/skydiveLogs-api/Init/dropZone.json +++ b/Back/skydiveLogs-api/Init/dropZone.json @@ -9,8 +9,7 @@ "email": "contact@iflyaixmarseille.fr", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 3, @@ -22,8 +21,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 4, @@ -35,8 +33,7 @@ "email": "indoorskydiving@ice-mountain.com", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 5, @@ -48,8 +45,7 @@ "email": "cepnc1@gmail.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 6, @@ -61,8 +57,7 @@ "email": "info@skydivepujaut.com", "type": [ "dz" - ], - "isFavorite": true + ] }, { "id": 7, @@ -74,8 +69,7 @@ "email": null, "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 8, @@ -87,8 +81,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 9, @@ -100,8 +93,7 @@ "email": "contact@rock-drop.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 10, @@ -113,8 +105,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 11, @@ -126,8 +117,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 12, @@ -139,8 +129,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 13, @@ -152,8 +141,7 @@ "email": null, "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 14, @@ -165,8 +153,7 @@ "email": "cepb65@gmail.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 15, @@ -178,8 +165,7 @@ "email": "contact@sauterenparachute.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 16, @@ -189,8 +175,7 @@ "address": "Aéroport de Dijon Bourgogne
1925 Rue de l'aviation
21600 Ouges", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 17, @@ -202,8 +187,7 @@ "email": "info@skydivecorsica.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 18, @@ -215,8 +199,7 @@ "email": "contact@cieldav.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 19, @@ -228,8 +211,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 20, @@ -241,8 +223,7 @@ "email": "contact@paradise64.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 21, @@ -254,8 +235,7 @@ "email": "max@parachutisme.nc", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 22, @@ -267,8 +247,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 23, @@ -280,8 +259,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 24, @@ -293,8 +271,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 25, @@ -306,8 +283,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 26, @@ -319,8 +295,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 27, @@ -332,8 +307,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 28, @@ -345,8 +319,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 29, @@ -358,8 +331,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 30, @@ -371,8 +343,7 @@ "email": "Proflyer@windoor-realfly.com", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 31, @@ -384,8 +355,7 @@ "email": null, "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 32, @@ -397,8 +367,7 @@ "email": "info@weembi.com", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 33, @@ -410,8 +379,7 @@ "email": "info.lyon@iflyworld.com", "type": [ "tunnel" - ], - "isFavorite": true + ] }, { "id": 34, @@ -423,8 +391,7 @@ "email": null, "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 35, @@ -436,8 +403,7 @@ "email": "accueil@parachutisme-vannes.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 36, @@ -449,8 +415,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 37, @@ -462,8 +427,7 @@ "email": "info@alsace-para.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 38, @@ -475,8 +439,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 39, @@ -488,8 +451,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 40, @@ -501,8 +463,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 41, @@ -514,8 +475,7 @@ "email": "info@skydiveroanne.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 42, @@ -527,8 +487,7 @@ "email": "skydive.peronne@gmail.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 43, @@ -540,8 +499,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 44, @@ -553,8 +511,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 45, @@ -566,8 +523,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 46, @@ -579,8 +535,7 @@ "email": "contact@demencielparachutisme.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 47, @@ -592,8 +547,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 48, @@ -605,8 +559,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 49, @@ -618,8 +571,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 50, @@ -631,8 +583,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 51, @@ -644,8 +595,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 52, @@ -657,8 +607,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 53, @@ -670,8 +619,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 54, @@ -683,8 +631,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 55, @@ -696,8 +643,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 56, @@ -709,8 +655,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 57, @@ -722,8 +667,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 58, @@ -735,8 +679,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 59, @@ -748,8 +691,7 @@ "email": "info@efpleblanc.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 60, @@ -761,8 +703,7 @@ "email": "vendeechutelibre@orange.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 61, @@ -774,8 +715,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 62, @@ -787,8 +727,7 @@ "email": "epbaguiscriff@gmail.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 63, @@ -800,8 +739,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 64, @@ -813,8 +751,7 @@ "email": "contact@skydivefretoy.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 65, @@ -826,8 +763,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 66, @@ -839,8 +775,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 67, @@ -851,8 +786,7 @@ "website": "www.parachutisme71.com", "type": [ "dz" - ], - "isFavorite": true + ] }, { "id": 68, @@ -864,8 +798,7 @@ "email": "cep46@wanadoo.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 69, @@ -877,8 +810,7 @@ "email": "infos@air65.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 70, @@ -890,8 +822,7 @@ "email": "accueil@bouloc-skydive.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 71, @@ -903,8 +834,7 @@ "email": "contact@parachutisme-lille.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 72, @@ -916,8 +846,7 @@ "email": "para.besac@wanadoo.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 73, @@ -929,8 +858,7 @@ "email": "info@arcachon-parachutisme.fr", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 74, @@ -942,8 +870,7 @@ "email": "info@parachutisme74.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 75, @@ -955,8 +882,7 @@ "email": "info.paris@iflyworld.com", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 76, @@ -968,8 +894,7 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 77, @@ -981,8 +906,7 @@ "email": "contact@onairtunnel.com", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 78, @@ -994,8 +918,7 @@ "email": "planning@aerokart.com", "type": [ "tunnel" - ], - "isFavorite": false + ] }, { "id": 79, @@ -1008,8 +931,7 @@ "type": [ "dz", "tunnel" - ], - "isFavorite": false + ] }, { "id": 80, @@ -1021,8 +943,7 @@ "email": "cepcaleluc@gmail.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 81, @@ -1034,8 +955,7 @@ "email": "resa@parachutisme-nord.com", "type": [ "dz" - ], - "isFavorite": false + ] }, { "id": 82, @@ -1047,7 +967,6 @@ "email": null, "type": [ "dz" - ], - "isFavorite": false + ] } ] \ No newline at end of file