Skip to content

Commit

Permalink
#222 #205 more ! Started getting the settings out
Browse files Browse the repository at this point in the history
  • Loading branch information
tidusjar committed May 20, 2016
1 parent cbfe88c commit 915459a
Show file tree
Hide file tree
Showing 8 changed files with 388 additions and 63 deletions.
72 changes: 71 additions & 1 deletion PlexRequests.UI.Tests/ApiModuleTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;

using FluentValidation;

Expand All @@ -44,6 +45,7 @@

using PlexRequests.Core;
using PlexRequests.Core.SettingModels;
using PlexRequests.Helpers;
using PlexRequests.Store;
using PlexRequests.Store.Repository;
using PlexRequests.UI.Models;
Expand All @@ -68,6 +70,7 @@ public void Setup()
var settingsMock = new Mock<ISettingsService<PlexRequestSettings>>();
var userRepoMock = new Mock<IRepository<UsersModel>>();
var mapperMock = new Mock<ICustomUserMapper>();
var authSettingsMock = new Mock<ISettingsService<AuthenticationSettings>>();

var userModels = fixture.CreateMany<UsersModel>().ToList();
userModels.Add(new UsersModel
Expand All @@ -87,13 +90,21 @@ public void Setup()
mapperMock.Setup(x => x.ValidateUser("user1", It.IsAny<string>())).Returns(Guid.NewGuid());
mapperMock.Setup(x => x.UpdatePassword("user1", "password", "newpassword")).Returns(true);

authSettingsMock.Setup(x => x.SaveSettings(It.Is<AuthenticationSettings>(c => c.PlexAuthToken.Equals("abc")))).Returns(true);

Bootstrapper = new ConfigurableBootstrapper(with =>
{
with.Module<ApiModule>();
with.Module<ApiRequestModule>();
with.Module<ApiUserModule>();
with.Module<ApiSettingsModule>();

with.Dependency(requestMock.Object);
with.Dependency(settingsMock.Object);
with.Dependency(userRepoMock.Object);
with.Dependency(mapperMock.Object);
with.Dependency(authSettingsMock.Object);


with.RootPathProvider<TestRootPathProvider>();
with.ModelValidatorLocator(
new DefaultValidatorLocator(
Expand Down Expand Up @@ -364,5 +375,64 @@ public void GetApiKeyWithBadCredentials()
Assert.That(body.Error, Is.True);
Assert.That(body.ErrorMessage, Is.Not.Null.Or.Empty);
}


[Test]
public void SaveNewAuthSettings()
{
var model = new AuthenticationSettings
{
Id = 1,
PlexAuthToken = "abc",
DeniedUsers = "abc",
UsePassword = false,
UserAuthentication = true
};
var browser = new Browser(Bootstrapper);
var result = browser.Post("api/settings/authentication", with =>
{
with.HttpRequest();
with.Header("Accept", "application/json");
with.Query("apikey", "api");
with.JsonBody(model);
});

Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode));

var body = JsonConvert.DeserializeObject<ApiModel<string>>(result.Body.AsString());
Assert.That(body.Data, Is.Not.Null.Or.Empty);
Assert.That(body.Error, Is.False);
Assert.That(body.ErrorMessage, Is.Null.Or.Empty);
}

[TestCaseSource(nameof(AuthSettingsData))]
public object SaveNewAuthSettings(object model)
{

var browser = new Browser(Bootstrapper);
var result = browser.Post("api/settings/authentication", with =>
{
with.HttpRequest();
with.Header("Accept", "application/json");
with.Query("apikey", "api");
with.JsonBody(model);
});

Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode));
var body = JsonConvert.DeserializeObject<ApiModel<bool>>(result.Body.AsString());

var retVal = new List<string> { body.ErrorMessage, body.Error.ToString(), body.Data.ToString() };
return retVal;
}

private static IEnumerable<TestCaseData> AuthSettingsData
{
get
{
yield return
new TestCaseData(new AuthenticationSettings { Id = 1, PlexAuthToken = "abc", DeniedUsers = "abc", UsePassword = false, UserAuthentication = true })
.Returns(new List<string> { null, false.ToString(), true.ToString() });
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2016 Jamie Rees
// File: ApiMetadataModule.cs
// File: ApiRequestMetadataModule.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
Expand Down Expand Up @@ -34,9 +34,9 @@

namespace PlexRequests.UI.Modules
{
public class ApiMetadataModule: MetadataModule<SwaggerRouteData>
public class ApiRequestMetadataModule: MetadataModule<SwaggerRouteData>
{
public ApiMetadataModule()
public ApiRequestMetadataModule()
{
Describe["GetRequests"] = description => description.AsSwagger(with =>
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2016 Jamie Rees
// File: ApiModule.cs
// File: ApiRequestModule.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
Expand Down Expand Up @@ -37,28 +37,23 @@

namespace PlexRequests.UI.Modules
{
public class ApiModule : BaseApiModule
public class ApiRequestModule : BaseApiModule
{
public ApiModule(IRequestService service, ISettingsService<PlexRequestSettings> pr, ICustomUserMapper m) : base("api", pr)
public ApiRequestModule(IRequestService service, ISettingsService<PlexRequestSettings> pr) : base("api", pr)
{
Get["GetRequests","/requests"] = x => GetRequests();
Get["GetRequest","/requests/{id}"] = x => GetSingleRequests(x);
Post["PostRequests", "/requests"] = x => CreateRequest();
Put["PutRequests", "/requests"] = x => UpdateRequest();
Delete["DeleteRequests", "/requests/{id}"] = x => DeleteRequest(x);

Get["GetApiKey", "/apikey"] = x => GetApiKey();

Put["PutCredentials", "/credentials/{username}"] = x => ChangePassword(x);


RequestService = service;
SettingsService = pr;
UserMapper = m;
}

private IRequestService RequestService { get; }
private ISettingsService<PlexRequestSettings> SettingsService { get; }
private ICustomUserMapper UserMapper { get; }

public Response GetRequests()
{
Expand Down Expand Up @@ -164,54 +159,6 @@ public Response DeleteRequest(dynamic x)
}
}

public Response GetApiKey()
{
var user = Request.Query["username"];
var password = Request.Query["password"];
var result = UserMapper.ValidateUser(user, password);
var model = new ApiModel<string>();
if (result == null)
{
model.Error = true;
model.ErrorMessage = "Incorrect username or password";
return ReturnReponse(model);
}

var settings = SettingsService.GetSettings();
model.Data = settings.ApiKey;

return ReturnReponse(model);
}

public Response ChangePassword(dynamic x)
{
var username = (string)x.username;
var userModel = this.BindAndValidate<UserUpdateViewModel>();

if (!ModelValidationResult.IsValid)
{
return ReturnValidationReponse(ModelValidationResult);
}

var valid = UserMapper.ValidateUser(username, userModel.CurrentPassword);
if (valid == null)
{
var errorModel = new ApiModel<string> { Error = true, ErrorMessage = "Incorrect username or password" };
return ReturnReponse(errorModel);
}
var result = UserMapper.UpdatePassword(username, userModel.CurrentPassword, userModel.NewPassword);

if (!result)
{
var errorModel = new ApiModel<string> { Error = true, ErrorMessage = "Could not update the password. " };
return ReturnReponse(errorModel);
}


var model = new ApiModel<string> { Data = "Successfully updated the password"};
return ReturnReponse(model);
}


}
}
60 changes: 60 additions & 0 deletions PlexRequests.UI/Modules/ApiSettingsMetadataModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2016 Jamie Rees
// File: ApiSettingsMetadataModule.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/
#endregion
using Nancy.Metadata.Modules;
using Nancy.Swagger;

using PlexRequests.Core.SettingModels;

namespace PlexRequests.UI.Modules
{
public class ApiSettingsMetadataModule: MetadataModule<SwaggerRouteData>
{
public ApiSettingsMetadataModule()
{
Describe["GetAuthSettings"] = description => description.AsSwagger(with =>
{
with.ResourcePath("/settings/authentication");
with.Summary("Gets the authentication settings saved in the application");
with.Model<ApiModel<AuthenticationSettings>>();
with.Notes("Gets the authentication settings saved in the application");

with.QueryParam<string>("apikey", "The Api Key found in the settings", true);
});

Describe["PostAuthSettings"] = description => description.AsSwagger(with =>
{
with.ResourcePath("/settings/authentication");
with.Summary("Saves the authentication settings saved in the application");
with.Model<ApiModel<bool>>();
with.QueryParam<string>("apikey", "The Api Key found in the settings", true);
with.BodyParam<AuthenticationSettings>("Authentication settings", true);
with.Notes("Saves the authentication settings saved in the application");
});

}
}
}
79 changes: 79 additions & 0 deletions PlexRequests.UI/Modules/ApiSettingsModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2016 Jamie Rees
// File: ApiModule.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/
#endregion
using Nancy;
using Nancy.ModelBinding;

using PlexRequests.Core;
using PlexRequests.Core.SettingModels;

namespace PlexRequests.UI.Modules
{
public class ApiSettingsModule : BaseApiModule
{
public ApiSettingsModule(ISettingsService<PlexRequestSettings> pr, ISettingsService<AuthenticationSettings> auth) : base("api", pr)
{
Get["GetAuthSettings","/settings/authentication"] = x => GetAuthSettings();
Post["PostAuthSettings","/settings/authentication"] = x => PostAuthSettings();

SettingsService = pr;
AuthSettings = auth;
}

private ISettingsService<PlexRequestSettings> SettingsService { get; }
private ISettingsService<AuthenticationSettings> AuthSettings { get; }

public Response GetAuthSettings()
{
var model = new ApiModel<AuthenticationSettings>();
var settings = AuthSettings.GetSettings();
model.Data = settings;
return ReturnReponse(model);
}

public Response PostAuthSettings()
{
var newSettings = this.BindAndValidate<AuthenticationSettings>();
if (!ModelValidationResult.IsValid)
{
return ReturnValidationReponse(ModelValidationResult);
}

var model = new ApiModel<bool>();
var settings = AuthSettings.SaveSettings(newSettings);
if (settings)
{
model.Data = true;
return ReturnReponse(model);
}

model.Error = true;
model.ErrorMessage = "Could not update the settings";
return ReturnReponse(model);
}

}
}
Loading

0 comments on commit 915459a

Please sign in to comment.