@ -10,17 +10,19 @@ namespace NzbDrone.Api.REST
public abstract class RestModule < TResource > : NancyModule
public abstract class RestModule < TResource > : NancyModule
where TResource : RestResource , new ( )
where TResource : RestResource , new ( )
{
{
protected ResourceValidator < TResource > PostValidator { get ; private set ; }
protected ResourceValidator < TResource > PutValidator { get ; private set ; }
protected ResourceValidator < TResource > SharedValidator { get ; private set ; }
private const string ROOT_ROUTE = "/" ;
private const string ROOT_ROUTE = "/" ;
private const string ID_ROUTE = "/{id}" ;
private const string ID_ROUTE = "/{id}" ;
protected RestModule ( )
private Action < int > _deleteResource ;
: this ( new TResource ( ) . ResourceName )
private Func < int , TResource > _getResourceById ;
{
private Func < List < TResource > > _getResourceAll ;
private Func < TResource , TResource > _createResource ;
private Func < TResource , TResource > _updateResource ;
protected ResourceValidator < TResource > PostValidator { get ; private set ; }
protected ResourceValidator < TResource > PutValidator { get ; private set ; }
protected ResourceValidator < TResource > SharedValidator { get ; private set ; }
}
protected RestModule ( string modulePath )
protected RestModule ( string modulePath )
: base ( modulePath )
: base ( modulePath )
@ -29,61 +31,81 @@ namespace NzbDrone.Api.REST
PostValidator = new ResourceValidator < TResource > ( ) ;
PostValidator = new ResourceValidator < TResource > ( ) ;
PutValidator = new ResourceValidator < TResource > ( ) ;
PutValidator = new ResourceValidator < TResource > ( ) ;
SharedValidator = new ResourceValidator < TResource > ( ) ;
SharedValidator = new ResourceValidator < TResource > ( ) ;
}
Get [ ROOT_ROUTE ] = options = >
protected Action < int > DeleteResource
{
private get { return _deleteResource ; }
set
{
{
EnsureImplementation ( GetResourceAll ) ;
_deleteResource = value ;
var resource = GetResourceAll ( ) ;
Delete [ ID_ROUTE ] = options = >
return resource . AsResponse ( ) ;
{
} ;
DeleteResource ( ( int ) options . Id ) ;
return new Response { StatusCode = HttpStatusCode . OK } ;
} ;
}
}
Get [ ID_ROUTE ] = options = >
protected Func < int , TResource > GetResourceById
{
private get { return _getResourceById ; }
set
{
{
EnsureImplementation ( GetResourceById ) ;
_getResourceById = value ;
var resource = GetResourceById ( ( int ) options . Id ) ;
Get [ ID_ROUTE ] = options = >
return resource . AsResponse ( ) ;
{
} ;
var resource = GetResourceById ( ( int ) options . Id ) ;
return resource . AsResponse ( ) ;
} ;
}
}
Post [ ROOT_ROUTE ] = options = >
protected Func < List < TResource > > GetResourceAll
{
private get { return _getResourceAll ; }
set
{
{
EnsureImplementation ( CreateResource ) ;
_getResourceAll = value ;
var resource = CreateResource ( ReadFromRequest ( ) ) ;
return resource . AsResponse ( HttpStatusCode . Created ) ;
} ;
Put [ ROOT_ROUTE ] = options = >
Get [ ROOT_ROUTE ] = options = >
{
{
EnsureImplementation ( UpdateResource ) ;
var resource = GetResourceAll ( ) ;
var resource = UpdateResource ( ReadFromRequest ( ) ) ;
return resource . AsResponse ( ) ;
return resource . AsResponse ( HttpStatusCode . Accepted ) ;
} ;
} ;
}
}
Delete [ ID_ROUTE ] = options = >
protected Func < TResource , TResource > CreateResource
{
private get { return _createResource ; }
set
{
{
EnsureImplementation ( DeleteResource ) ;
_createResource = value ;
DeleteResource ( ( int ) options . Id ) ;
Post [ ROOT_ROUTE ] = options = >
return new Response { StatusCode = HttpStatusCode . OK } ;
{
} ;
var resource = CreateResource ( ReadFromRequest ( ) ) ;
return resource . AsResponse ( HttpStatusCode . Created ) ;
} ;
}
}
}
protected Action < int > DeleteResource { get ; set ; }
protected Func < TResource , TResource > UpdateResource
protected Func < int , TResource > GetResourceById { get ; set ; }
protected Func < List < TResource > > GetResourceAll { get ; set ; }
protected Func < TResource , TResource > CreateResource { get ; set ; }
protected Func < TResource , TResource > UpdateResource { get ; set ; }
private void EnsureImplementation ( Delegate implementation )
{
{
if ( implementation = = null )
private get { return _updateResource ; }
set
{
{
throw new NotImplementedException ( ) ;
_updateResource = value ;
Put [ ROOT_ROUTE ] = options = >
{
var resource = UpdateResource ( ReadFromRequest ( ) ) ;
return resource . AsResponse ( HttpStatusCode . Accepted ) ;
} ;
}
}
}
}
private TResource ReadFromRequest ( )
private TResource ReadFromRequest ( )
{
{
var resource = Request . Body . FromJson < TResource > ( ) ;
var resource = Request . Body . FromJson < TResource > ( ) ;