using GrpcShared.DTO; using GrpcShared.DTO.Db; using GrpcShared.Interfaces; using IdentityProvider.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace IdentityProvider.Services { public class IdentityService : IIdentityService { private readonly IMongoCollection _userCollection; private readonly IMongoCollection _trackCollection; public IdentityService(IOptions spotifyDbConfig) { var mongoClient = new MongoClient(spotifyDbConfig.Value.ConnString); var mongoDbContext = mongoClient.GetDatabase(spotifyDbConfig.Value.DBName); _userCollection = mongoDbContext.GetCollection(spotifyDbConfig.Value.UserCollection); _trackCollection = mongoDbContext.GetCollection(spotifyDbConfig.Value.TrackCollection); } public async Task> ListUsersAsync(VoidMessage msg) { List users = await _userCollection.Find(_ => true).ToListAsync(); //map users to match the grpc response return users.Select(u => new UserResponse { Id = u.Id, Token = u.Token }).ToList(); } public async Task GetTokenByIdAsync(DbRequestMessage request) { UserModel user = await _userCollection.Find(u => u.Id == request.Id).FirstOrDefaultAsync(); return new UserResponse { Id = user.Id, Token = user.Token }; } public async Task GetTrackByUserAsync(DbRequestMessage request) { TrackModel track = await _trackCollection.Find(t => t.UserId == request.Id).FirstOrDefaultAsync(); return new TrackResponse { Id = track.Id, Album = track.Album, Artist = track.Artist, Title = track.Title }; } public async Task SaveTrackAsync(SaveTrackRequest track) { TrackModel trackModel = new() { Title = track.Title, Album = track.Album, Artist = track.Artist, UserId = track.UserId }; //first check if there's already a song in the db, if yes, update the row var song = await _trackCollection.FindAsync(x => x.UserId == track.UserId); if (song != null) await _trackCollection.ReplaceOneAsync(x => x.UserId == track.UserId, trackModel); else await _trackCollection.InsertOneAsync(trackModel); return new VoidMessage(); } public async Task SaveUserAsync(UserResponse user) { await _userCollection.InsertOneAsync(new UserModel { Id = user.Id, Token = user.Token }); return new VoidMessage(); } public async Task DeleteTrackAsync(DbRequestMessage request) { await _trackCollection.DeleteOneAsync(x => x.Id == request.Id); return new VoidMessage(); } public async Task DeleteUserAsync(DbRequestMessage user) { await _userCollection.DeleteOneAsync(x => x.Id == user.Id); return new VoidMessage(); } } }