Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.67 KB | None | 0 0
  1. namespace MusicHub.DataProcessor
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel.DataAnnotations;
  6. using System.Globalization;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Xml.Serialization;
  11. using Data;
  12. using MusicHub.Data.Models;
  13. using MusicHub.Data.Models.Enums;
  14. using MusicHub.DataProcessor.ImportDtos;
  15. using Newtonsoft.Json;
  16.  
  17. public class Deserializer
  18. {
  19. private const string ErrorMessage = "Invalid data";
  20.  
  21. private const string SuccessfullyImportedWriter
  22. = "Imported {0}";
  23. private const string SuccessfullyImportedProducerWithPhone
  24. = "Imported {0} with phone: {1} produces {2} albums";
  25. private const string SuccessfullyImportedProducerWithNoPhone
  26. = "Imported {0} with no phone number produces {1} albums";
  27. private const string SuccessfullyImportedSong
  28. = "Imported {0} ({1} genre) with duration {2}";
  29. private const string SuccessfullyImportedPerformer
  30. = "Imported {0} ({1} songs)";
  31.  
  32. public static string ImportWriters(MusicHubDbContext context, string jsonString)
  33. {
  34. var writersDtos = JsonConvert.DeserializeObject<Writer[]>(jsonString);
  35.  
  36. var sb = new StringBuilder();
  37.  
  38. var writers = new List<Writer>();
  39.  
  40. foreach (var writerDto in writersDtos)
  41. {
  42. if (!IsValid(writerDto))
  43. {
  44. sb.AppendLine(ErrorMessage);
  45. continue;
  46. }
  47.  
  48. var writer = new Writer
  49. {
  50. Name = writerDto.Name,
  51. Pseudonym = writerDto.Pseudonym
  52. };
  53.  
  54. writers.Add(writer);
  55.  
  56. sb.AppendLine(string.Format(SuccessfullyImportedWriter, writerDto.Name));
  57. }
  58.  
  59. context.Writers.AddRange(writers);
  60. context.SaveChanges();
  61. return sb.ToString();
  62. }
  63.  
  64. public static string ImportProducersAlbums(MusicHubDbContext context, string jsonString)
  65. {
  66. var producersDtos = JsonConvert.DeserializeObject<ImportProducersAlbumsDto[]>(jsonString);
  67.  
  68. var sb = new StringBuilder();
  69.  
  70. var producers = new List<Producer>();
  71. var albums = new List<Album>();
  72.  
  73. foreach (var producerDto in producersDtos)
  74. {
  75. var isValidProducer = IsValid(producerDto);
  76. var isValidAlbum = producerDto.Albums.All(IsValid);
  77.  
  78. if(!isValidProducer || !isValidAlbum)
  79. {
  80. sb.AppendLine(ErrorMessage);
  81. continue;
  82. }
  83.  
  84. var producer = new Producer
  85. {
  86. Name = producerDto.Name,
  87. Pseudonym = producerDto.Pseudonym,
  88. PhoneNumber = producerDto.PhoneNumber
  89. };
  90.  
  91. foreach (var albumDto in producerDto.Albums)
  92. {
  93. producer.Albums.Add(new Album
  94. {
  95. Name = albumDto.Name,
  96. ReleaseDate = DateTime.ParseExact(albumDto.ReleaseDate, "dd/MM/yyyy", CultureInfo.InvariantCulture)
  97. });
  98. }
  99.  
  100. producers.Add(producer);
  101.  
  102. string message = producer.PhoneNumber == null
  103. ? string.Format(SuccessfullyImportedProducerWithNoPhone, producer.Name, producer.Albums.Count)
  104. : string.Format(SuccessfullyImportedProducerWithPhone, producer.Name, producer.PhoneNumber, producer.Albums.Count);
  105.  
  106. sb.AppendLine(message);
  107. }
  108.  
  109. context.Producers.AddRange(producers);
  110. context.Albums.AddRange(albums);
  111. context.SaveChanges();
  112.  
  113. return sb.ToString().TrimEnd();
  114. }
  115.  
  116. public static string ImportSongs(MusicHubDbContext context, string xmlString)
  117. {
  118. var xmlSerializer = new XmlSerializer(typeof(ImportSongsDto[]),
  119. new XmlRootAttribute("Songs"));
  120.  
  121. var songsDtos = (ImportSongsDto[])xmlSerializer
  122. .Deserialize(new StringReader(xmlString));
  123.  
  124. var sb = new StringBuilder();
  125.  
  126. var songs = new List<Song>();
  127.  
  128. foreach (var songDto in songsDtos)
  129. {
  130. if (!IsValid(songDto))
  131. {
  132. sb.AppendLine(ErrorMessage);
  133. continue;
  134. }
  135.  
  136. var genre = Enum.TryParse(songDto.Genre, out Genre genreResult);
  137. var album = context.Albums.Find(songDto.AlbumId);
  138. var writer = context.Writers.Find(songDto.WriterId);
  139. var songTitle = songs.Any(s => s.Name == songDto.Name);
  140.  
  141. if (!genre || album == null || writer == null || songTitle)
  142. {
  143. sb.AppendLine(ErrorMessage);
  144. continue;
  145. }
  146.  
  147. var song = AutoMapper.Mapper.Map<Song>(songDto);
  148. songs.Add(song);
  149.  
  150. sb.AppendLine(string.Format(SuccessfullyImportedSong, songDto.Name, songDto.Genre, songDto.Duration));
  151. }
  152.  
  153. context.Songs.AddRange(songs);
  154. context.SaveChanges();
  155.  
  156. return sb.ToString().TrimEnd();
  157. }
  158.  
  159. public static string ImportSongPerformers(MusicHubDbContext context, string xmlString)
  160. {
  161. var xmlSerializer = new XmlSerializer(typeof(ImportPerformersDto[]), new XmlRootAttribute("Performers"));
  162.  
  163. var performersDtos = (ImportPerformersDto[])xmlSerializer.Deserialize(new StringReader(xmlString));
  164.  
  165. var sb = new StringBuilder();
  166.  
  167. var performers = new List<Performer>();
  168.  
  169.  
  170. foreach (var performerDto in performersDtos)
  171. {
  172. if (!IsValid(performerDto))
  173. {
  174. sb.AppendLine(ErrorMessage);
  175. continue;
  176. }
  177.  
  178. var validSongsCount = context.Songs.Count(s => performerDto.PerformerSongs.Any(i => i.Id == s.Id));
  179.  
  180. if (validSongsCount != performerDto.PerformerSongs.Length)
  181. {
  182. sb.AppendLine(ErrorMessage);
  183. continue;
  184. }
  185.  
  186. var performer = new Performer
  187. {
  188. FirstName = performerDto.FirstName,
  189. LastName = performerDto.LastName,
  190. Age = performerDto.Age,
  191. NetWorth = performerDto.NetWorth
  192. };
  193.  
  194. foreach (var songPerf in performerDto.PerformerSongs)
  195. {
  196. performer.PerformerSongs.Add(new SongPerformer
  197. {
  198. SongId = songPerf.Id
  199. });
  200. }
  201.  
  202. performers.Add(performer);
  203.  
  204. sb.AppendLine(string.Format(SuccessfullyImportedPerformer, performer.FirstName, performer.PerformerSongs.Count));
  205. }
  206.  
  207. context.Performers.AddRange(performers);
  208. context.SaveChanges();
  209.  
  210. return sb.ToString().TrimEnd();
  211. }
  212.  
  213. private static bool IsValid(object dto)
  214. {
  215. var validationContext = new ValidationContext(dto);
  216. var validationResult = new List<ValidationResult>();
  217.  
  218. return Validator.TryValidateObject(dto, validationContext, validationResult, true);
  219. }
  220. }
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement