@ -1,71 +1,137 @@
using System ;
#region Copyright
using PlexRequests.UI.Modules ;
// /************************************************************************
// 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 System ;
using System.Collections.Generic ;
using Nancy ;
using Nancy ;
using Nancy.Extensions ;
using Nancy.ModelBinding ;
using Nancy.ModelBinding ;
using Nancy.Responses.Negotiation ;
using Nancy.Validation ;
using Nancy.Validation ;
using PlexRequests.Core ;
using PlexRequests.Core ;
using System.Collections.Generic ;
using PlexRequests.Store ;
using PlexRequests.Store ;
using PlexRequests.Core.SettingModels ;
namespace PlexRequests.UI.Modules
namespace PlexRequests.UI.Modules
{
{
public class ApiModule : BaseModule
public class ApiModule : Base Api Module
{
{
public ApiModule ( IRequestService service , ISettingsService < PlexRequestSettings > settings ) : base ( "api" )
public ApiModule ( IRequestService service ) : base ( "api /v1/ ")
{
{
Get [ "/requests" ] = x = > GetRequests ( ) ;
Get [ "/requests" ] = x = > GetRequests ( ) ;
Post [ "/requests" ] = x = > CreateRequest ( ) ;
Put [ "/requests" ] = x = > UpdateRequest ( ) ;
Delete [ "/requests" ] = x = > DeleteRequest ( ) ;
RequestService = service ;
RequestService = service ;
Settings = settings ;
}
}
private IRequestService RequestService { get ; }
private IRequestService RequestService { get ; }
private ISettingsService < PlexRequestSettings > Settings { get ; }
public Response GetRequests ( )
public Response GetRequests ( )
{
{
var apiModel = new ApiModel < List < RequestedModel > > { Data = new List < RequestedModel > ( ) } ;
var apiModel = new ApiModel < List < RequestedModel > > { Data = new List < RequestedModel > ( ) } ;
if ( ! Authenticated ( ) ) {
apiModel . Error = true ;
var requests = RequestService . GetAll ( ) ;
apiModel . ErrorMessage = "ApiKey is invalid or not present, Please use 'apikey' in the querystring." ;
apiModel . Data . AddRange ( requests ) ;
return ReturnReponse ( apiModel ) ;
return ReturnReponse ( apiModel ) ;
}
}
var requests = RequestService . GetAll ( ) ;
apiModel . Data . AddRange ( requests ) ;
return ReturnReponse ( apiModel ) ;
public Response CreateRequest ( )
{
var request = this . Bind < RequestedModel > ( ) ;
var valid = this . Validate ( request ) ;
if ( ! valid . IsValid )
{
return ReturnValidationReponse ( valid ) ;
}
}
private Response ReturnReponse ( object result )
var apiModel = new ApiModel < bool > ( ) ;
var result = RequestService . AddRequest ( request ) ;
if ( result = = - 1 )
{
{
var queryString = ( DynamicDictionary ) Context . Request . Query ;
apiModel . Error = true ;
dynamic value ;
apiModel . ErrorMessage = "Could not insert the new request into the database. Internal error." ;
if ( queryString . TryGetValue ( "xml" , out value ) ) {
return ReturnReponse ( apiModel ) ;
if ( ( bool ) value ) {
return Response . AsXml ( result ) ;
}
}
apiModel . Data = true ;
return ReturnReponse ( apiModel ) ;
}
}
return Response . AsJson ( result ) ;
public Response UpdateRequest ( )
{
var request = this . Bind < RequestedModel > ( ) ;
var valid = this . Validate ( request ) ;
if ( ! valid . IsValid )
{
return ReturnValidationReponse ( valid ) ;
}
}
private bool Authenticated ( ) {
var query = ( DynamicDictionary ) Context . Request . Query ;
var apiModel = new ApiModel < bool > ( ) ;
dynamic key ;
var result = RequestService . UpdateRequest ( request ) ;
if ( ! query . TryGetValue ( "apikey" , out key ) ) {
return false ;
if ( ! result )
{
apiModel . Error = true ;
apiModel . ErrorMessage = "Could not update the request into the database. Internal error." ;
return ReturnReponse ( apiModel ) ;
}
}
var settings = Settings . GetSettings ( ) ;
apiModel . Data = true ;
if ( ( string ) key = = settings . ApiKey ) {
return true ;
return ReturnReponse ( apiModel ) ;
}
}
return false ;
public Response DeleteRequest ( )
{
var request = this . Bind < RequestedModel > ( ) ;
var valid = this . Validate ( request ) ;
if ( ! valid . IsValid )
{
return ReturnValidationReponse ( valid ) ;
}
var apiModel = new ApiModel < bool > ( ) ;
try
{
RequestService . DeleteRequest ( request ) ;
apiModel . Data = true ;
return ReturnReponse ( apiModel ) ;
}
catch ( Exception )
{
apiModel . Error = true ;
apiModel . ErrorMessage = "Could not delete the request from the database. Internal error." ;
return ReturnReponse ( apiModel ) ;
}
}
}
}
}
}
}