Blazor & WASM in combination to get statistics from Spotify API for performing the song analysis. With separate microservices for auth, Spotify, user data tracking, and application, connected through gRPC with Polly.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

IdentityService.cs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using GrpcShared.DTO;
  2. using GrpcShared.DTO.Db;
  3. using GrpcShared.Interfaces;
  4. using IdentityProvider.Models;
  5. using Microsoft.Extensions.Options;
  6. using MongoDB.Driver;
  7. namespace IdentityProvider.Services
  8. {
  9. public class IdentityService : IIdentityService
  10. {
  11. private readonly IMongoCollection<UserModel> _userCollection;
  12. private readonly IMongoCollection<TrackModel> _trackCollection;
  13. public IdentityService(IOptions<SpotifyDbConfig> spotifyDbConfig)
  14. {
  15. var mongoClient = new MongoClient(spotifyDbConfig.Value.ConnectionString);
  16. var mongoDbContext = mongoClient.GetDatabase(spotifyDbConfig.Value.DatabaseName);
  17. _userCollection = mongoDbContext.GetCollection<UserModel>(spotifyDbConfig.Value.UserCollection);
  18. _trackCollection = mongoDbContext.GetCollection<TrackModel>(spotifyDbConfig.Value.TracksCollection);
  19. }
  20. public async Task<List<UserResponse>> ListUsersAsync(VoidMessage msg)
  21. {
  22. List<UserModel> users = await _userCollection.Find(_ => true).ToListAsync();
  23. //map users to match the grpc response
  24. var usersRes = users.Select(u => new UserResponse
  25. {
  26. Id = u.Id,
  27. Token = u.Token
  28. }).ToList();
  29. return usersRes;
  30. }
  31. public async Task<UserResponse> GetTokenByIdAsync(DbRequestMessage request)
  32. {
  33. UserModel user = await _userCollection.Find(u => u.Id == request.Id).FirstOrDefaultAsync();
  34. return new UserResponse
  35. {
  36. Id = user.Id,
  37. Token = user.Token
  38. };
  39. }
  40. public async Task<TrackResponse> GetTrackByUserAsync(DbRequestMessage request)
  41. {
  42. TrackModel track = await _trackCollection.Find(t => t.UserId == request.Id).FirstOrDefaultAsync();
  43. return new TrackResponse
  44. {
  45. Id = track.Id,
  46. Album = track.Album,
  47. Artist = track.Artist,
  48. Title = track.Title,
  49. TrackId = track.TrackId
  50. };
  51. }
  52. public async Task<VoidMessage> SaveTrackAsync(SaveTrackRequest track)
  53. {
  54. TrackModel trackModel = new()
  55. {
  56. Title = track.Title,
  57. Album = track.Album,
  58. Artist = track.Artist,
  59. UserId = track.UserId,
  60. TrackId = track.TrackId
  61. };
  62. //first check if there's already a song in the db, if yes, update the row
  63. var song = await _trackCollection.Find(x => x.UserId == track.UserId).AnyAsync();
  64. if (song) await _trackCollection.ReplaceOneAsync(x => x.UserId == track.UserId, trackModel);
  65. else await _trackCollection.InsertOneAsync(trackModel);
  66. return new VoidMessage();
  67. }
  68. public async Task<VoidMessage> SaveUserAsync(UserResponse userRequest)
  69. {
  70. bool user = await _userCollection.Find(x => x.Id == userRequest.Id).AnyAsync();
  71. if (!user) await _userCollection.InsertOneAsync(new UserModel
  72. {
  73. Token = userRequest.Token
  74. });
  75. return new VoidMessage();
  76. }
  77. public async Task<VoidMessage> DeleteTrackAsync(DbRequestMessage request)
  78. {
  79. await _trackCollection.DeleteOneAsync(x => x.Id == request.Id);
  80. return new VoidMessage();
  81. }
  82. public async Task<VoidMessage> DeleteUserAsync(DbRequestMessage userRequest)
  83. {
  84. //check if user exists
  85. bool user = await _userCollection.Find(x => x.Id == userRequest.Id).AnyAsync();
  86. //delete track related to him
  87. if (user)
  88. {
  89. await _trackCollection.DeleteManyAsync(x => x.UserId == userRequest.Id);
  90. //delete user
  91. await _userCollection.DeleteOneAsync(x => x.Id == userRequest.Id);
  92. }
  93. return new VoidMessage();
  94. }
  95. }
  96. }