public string SetAccessToken(DbUserModel user, string token)
 {
     var dbUser = this.users.FindOneByIdAs<DbUserModel>(user.Id);
     dbUser.AccessToken = token;
     this.users.Save(dbUser, SafeMode.True);
     return dbUser.AccessToken;
 }
        public HttpResponseMessage RegisterUser(UserModel model)
        {
            return this.ExecuteOperationAndHandleExceptions(() =>
            {
                this.ValidateUser(model);

                var data = new UserRepository(
                ConfigurationManager.AppSettings["MongoConnectionString"],
                ConfigurationManager.AppSettings["Database"]);

                var dbUser = data.All().FirstOrDefault(u => u.Username.ToLower() == model.Username.ToLower());
                if (dbUser != null)
                {
                    throw new InvalidOperationException("This user already exists in the database");
                }

                dbUser = new DbUserModel()
                {
                    Username = model.Username,
                    AuthCode = model.AuthCode
                };

                data.Add(dbUser);

                var responseModel = new RegisterUserResponseModel()
                {
                    Id = dbUser.Id,
                    Username = dbUser.Username,
                };

                var response = this.Request.CreateResponse(HttpStatusCode.Created, responseModel);
                return response;
            });
        }
        public DbUserModel GetLoggedUser(DbUserModel user)
        {
            DbUserModel resultUser = this.users.AsQueryable<DbUserModel>()
                .FirstOrDefault(u => u.Username.ToLower() == user.Username.ToLower() 
                    && u.AuthCode == user.AuthCode);

            return resultUser;
        }
        public HttpResponseMessage LoginUser(UserModel model)
        {
            return this.ExecuteOperationAndHandleExceptions(() =>
            {
                this.ValidateUser(model);

                var data = new UserRepository(
                ConfigurationManager.AppSettings["MongoConnectionString"],
                ConfigurationManager.AppSettings["Database"]);

                var dbUser = new DbUserModel()
                {
                    Username = model.Username,
                    AuthCode = model.AuthCode
                };

                var user = data.GetLoggedUser(dbUser);

                if (user == null)
                {
                    throw new FormatException("Invalid username or password");
                }

                string token = null;

                if (user.AccessToken == null)
                {
                    token = data.SetAccessToken(user, this.GenerateAccessToken(user.Id));
                }
                else
                {
                    token = user.AccessToken;
                }

                var responseModel = new LoginResponseModel()
                {
                    Id = user.Id,
                    Username = user.Username,
                    AccessToken = token
                };

                var response = this.Request.CreateResponse(HttpStatusCode.OK, responseModel);
                return response;
            });
        }
 public IQueryable<DbMessageModel> GetTrash(DbUserModel user)
 {
     return this.trash.AsQueryable<DbMessageModel>().Where(m => m.Username.ToLower() == user.Username.ToLower());
 }
 public IQueryable<DbMessageModel> GetSentItems(DbUserModel user)
 {
     return this.sentMessages.AsQueryable<DbMessageModel>().Where(m => m.Username.ToLower() == user.Username.ToLower());
 }
 public IQueryable<DbMessageModel> GetInbox(DbUserModel user)
 {
     return this.receivedMessages.AsQueryable<DbMessageModel>().Where(m => m.Username.ToLower() == user.Username.ToLower());
 }
 public void Add(DbUserModel user)
 {
     this.users.Insert(user);
 }