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.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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. }