-
Notifications
You must be signed in to change notification settings - Fork 10
1.2 API process
Marjan Nikolovski edited this page Apr 9, 2021
·
3 revisions
We use api process when we want to expose an endpoint to be consumed from a client. The endpoint path is generated by a convention of folder structure. For example if we have a process in our “Web” project with full class name Web.Processes.AddUser the path will be /api/Processes/AddUser
The api process contains 3 layers:
- Auth
- Validate
- Handle
public class MyData : IDtoData
{
public string Input1 { get; set; }
public int Input2 { get; set; }
/// <summary>
/// Sanitize
/// </summary>
/// <param name="sanitizer"></param>
public void Sanitize(HtmlSanitizer sanitizer)
{
Input1 = sanitizer.Sanitize(Input1);
}
}
[ApiProcess(HttpMethod = ApiProcessMethod.POST)]
public class MyApiProcess : ApiProcess<MyData, VoidResult>
{
/// <summary>
/// Auth process
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public override VoidResult Auth(MyData request)
{
return Ok();
}
/// <summary>
/// Validate process
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public override VoidResult Validate(MyData request)
{
return Ok();
}
/// <summary>
/// Handle process
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public override VoidResult Handle(MyData request)
{
return Ok();
}
}
- 0 or 1 in generic arguments
- VoidResult, MethodResult or ListResult out generic argument
- SignalsAuthorizeProcess and Critical attributes
- Validation with specification pattern
- ApiProcess attribute
- Context.HttpContext property with all http context information
public class UserDtoData : IDtoData
{
public string Username { get; set; }
public string Password { get; set; }
/// <summary>
/// Sanitize
/// </summary>
/// <param name="sanitizer"></param>
public void Sanitize(HtmlSanitizer sanitizer)
{
Username = sanitizer.Sanitize(Username);
Password = sanitizer.Sanitize(Password);
}
}
[ApiProcess(HttpMethod = ApiProcessMethod.POST)]
public class RegisterUser : ApiProcess<UserDtoData, MethodResult<int>>
{
[Import] private IUserRepository UserRepository { get; set; }
/// <summary>
/// Auth process
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public override MethodResult<int> Auth(UserDtoData user)
{
return Ok();
}
/// <summary>
/// Validate process
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public override MethodResult<int> Validate(UserDtoData user)
{
return BeginValidation()
.Validate(new UserHasUsernameAndPassword(), user)
.ReturnResult();
}
/// <summary>
/// Handle process
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public override MethodResult<int> Handle(UserDtoData user)
{
var userId = UserRepository.Register(user);
return userId;
}
}