using ForumContracts.BindingModels; using ForumContracts.SearchModels; using ForumContracts.StorageContracts; using ForumContracts.ViewModels; using ForumDatabaseImplement.Models; using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ForumMongoDataBase.Implements { public class UserStorage : IUserStorage { private readonly IMongoCollection _collection; public MongoClient context; public UserStorage() { context = ForumMongoDataBase.getInstance().client; _collection = context.GetDatabase("forum").GetCollection("users"); } public UserViewModel? Delete(UserBindingModel model) { var filter = Builders.Filter.Eq(u => u.Id, model.Id); var user = _collection.FindOneAndDelete(filter); if (user == null) { return null; } return user.GetViewModel(); } public UserViewModel? GetElement(UserSearchModel model) { var filter = Builders.Filter.Empty; if (model.Id.HasValue) { filter &= Builders.Filter.Eq(u => u.Id, model.Id.Value); } if (!string.IsNullOrEmpty(model.Nickname) && !string.IsNullOrEmpty(model.Password)) { filter &= Builders.Filter.Eq(u => u.Nickname, model.Nickname) & Builders.Filter.Eq(u => u.Password, model.Password); } if (!string.IsNullOrEmpty(model.Email)) { filter &= Builders.Filter.Eq(u => u.Email, model.Email); } var user = _collection.Find(filter) .FirstOrDefault(); if (user == null) { return null; } return user.GetViewModel(); } public List GetFilteredList(UserSearchModel model) { if (string.IsNullOrEmpty(model.Nickname)) { return new List(); } var filter = Builders.Filter.Regex(u => u.Nickname, new BsonRegularExpression(model.Nickname, "i")); var users = _collection.Find(filter) .ToList() .Select(u => u.GetViewModel()) .ToList(); return users; } public List GetFullList() { var users = _collection.Find(_ => true) .ToList() .Select(u => u.GetViewModel()) .ToList(); return users; } public UserViewModel? Insert(UserBindingModel model) { var user = User.Create(model); if (user == null) { return null; } _collection.InsertOne(user); return user.GetViewModel(); } public UserViewModel? Update(UserBindingModel model) { var filter = Builders.Filter.Eq(u => u.Id, model.Id); var user = _collection.Find(filter).FirstOrDefault(); if (user == null) { return null; } user.Update(model); _collection.ReplaceOne(filter, user); return user.GetViewModel(); } } }