Skip to content

1.2 API process

Marjan Nikolovski edited this page Apr 9, 2021 · 3 revisions

Purpose

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

How to use

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();
    }
}

Configuration

  • 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

Examples

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;
    }
}
Clone this wiki locally