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.
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

IdentityService.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. if (user != null)
  35. return new UserResponse
  36. {
  37. Id = user.Id,
  38. Token = user.Token
  39. };
  40. else return new UserResponse();
  41. }
  42. public async Task<TrackResponse> GetTrackByUserAsync(DbRequestMessage request)
  43. {
  44. TrackModel track = await _trackCollection.Find(t => t.UserId == request.Id).FirstOrDefaultAsync();
  45. return new TrackResponse
  46. {
  47. Id = track.Id,
  48. Album = track.Album,
  49. Artist = track.Artist,
  50. Title = track.Title,
  51. TrackId = track.TrackId
  52. };
  53. }
  54. public async Task<VoidMessage> SaveTrackAsync(SaveTrackRequest track)
  55. {
  56. TrackModel trackModel = new()
  57. {
  58. Id = track.Id,
  59. Title = track.Title,
  60. Album = track.Album,
  61. Artist = track.Artist,
  62. UserId = track.UserId,
  63. TrackId = track.TrackId
  64. };
  65. //first check if there's already a song in the db, if yes, update the row
  66. bool song = await _trackCollection.Find(x => x.UserId == track.UserId).AnyAsync();
  67. if (song) await _trackCollection.DeleteOneAsync(s => s.UserId == track.UserId);
  68. await _trackCollection.InsertOneAsync(trackModel);
  69. return new VoidMessage() { InsertedId = trackModel.Id };
  70. }
  71. public async Task<VoidMessage> SaveUserAsync(UserResponse userRequest)
  72. {
  73. bool user = await _userCollection.Find(x => x.Id == userRequest.Id).AnyAsync();
  74. UserModel tempUser = new()
  75. {
  76. Token = userRequest.Token,
  77. RefreshToken = userRequest.RefreshToken
  78. };
  79. if (!user) await _userCollection.InsertOneAsync(tempUser);
  80. return new VoidMessage() { InsertedId = tempUser.Id };
  81. }
  82. public async Task<VoidMessage> DeleteTrackAsync(DbRequestMessage request)
  83. {
  84. await _trackCollection.DeleteOneAsync(x => x.Id == request.Id);
  85. return new VoidMessage();
  86. }
  87. public async Task<VoidMessage> DeleteUserAsync(DbRequestMessage userRequest)
  88. {
  89. //check if user exists
  90. bool user = await _userCollection.Find(x => x.Id == userRequest.Id).AnyAsync();
  91. //delete track related to him
  92. if (user)
  93. {
  94. await _trackCollection.DeleteManyAsync(x => x.UserId == userRequest.Id);
  95. //delete user
  96. await _userCollection.DeleteOneAsync(x => x.Id == userRequest.Id);
  97. }
  98. return new VoidMessage();
  99. }
  100. public async Task<VoidMessage> UpdateTokenAsync(UserResponse user)
  101. {
  102. UserModel dbUser = await _userCollection.Find(x => x.Id == user.Id).FirstOrDefaultAsync();
  103. if (dbUser.Id != null)
  104. {
  105. dbUser.Token = user.Token;
  106. dbUser.RefreshToken = user.RefreshToken;
  107. await _userCollection.ReplaceOneAsync(x => x.Id == user.Id, dbUser);
  108. }
  109. return new VoidMessage
  110. {
  111. InsertedId = dbUser.Id
  112. };
  113. }
  114. }
  115. }