package com.paymill.services; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.paymill.models.Client; import com.paymill.models.PaymillList; import com.paymill.utils.HttpClient; import com.paymill.utils.ParameterMap; /** * The {@link ClientService} is used to list, create, edit, delete and update PAYMILL {@link Client}s. * @author Vassil Nikolov * @since 3.0.0 */ public class ClientService extends AbstractService { private ClientService( HttpClient httpClient ) { super( httpClient ); } private final static String PATH = "/clients"; /** * This function returns a {@link List} of PAYMILL {@link Client} objects. * @return {@link PaymillList} which contains a {@link List} of PAYMILL {@link Client}s and their total count. */ public PaymillList<Client> list() { return this.list( null, null, null, null ); } /** * This function returns a {@link List} of PAYMILL {@link Client} objects, overriding the default count and offset. * @param count * Max {@link Integer} of returned objects in the {@link PaymillList} * @param offset * {@link Integer} to start from. * @return {@link PaymillList} which contains a {@link List} of PAYMILL {@link Client}s and their total count. */ public PaymillList<Client> list( Integer count, Integer offset ) { return this.list( null, null, count, offset ); } /** * This function returns a {@link List} of PAYMILL {@link Client} objects. In which order this list is returned depends on the * optional parameters. If <code>null</code> is given, no filter or order will be applied. * @param filter * {@link com.paymill.models.Client.Filter} or <code>null</code> * @param order * {@link com.paymill.models.Client.Order} or <code>null</code> * @return {@link PaymillList} which contains a {@link List} of PAYMILL {@link Client}s and their total count. */ public PaymillList<Client> list( Client.Filter filter, Client.Order order ) { return this.list( filter, order, null, null ); } /** * This function returns a {@link List} of PAYMILL {@link Client} objects. In which order this list is returned depends on the * optional parameters. If <code>null</code> is given, no filter or order will be applied, overriding the default count and * offset. * @param filter * {@link com.paymill.models.Client.Filter} or <code>null</code> * @param order * {@link com.paymill.models.Client.Order} or <code>null</code> * @param count * Max {@link Integer} of returned objects in the {@link PaymillList} * @param offset * {@link Integer} to start from. * @return {@link PaymillList} which contains a {@link List} of PAYMILL {@link Client}s and their total count. */ public PaymillList<Client> list( Client.Filter filter, Client.Order order, Integer count, Integer offset ) { return RestfulUtils.list( ClientService.PATH, filter, order, count, offset, Client.class, super.httpClient ); } /** * Get and refresh the details of an existing PAYMILL {@link Client}. * @param client * A {@link Client} with Id. * @return Refreshed instance of the given {@link Client}. */ public Client get( Client client ) { return RestfulUtils.show( ClientService.PATH, client, Client.class, super.httpClient ); } /** * Get and refresh the details of an existing PAYMILL {@link Client}. * @param clientId * Id of the {@link Client} * @return Refreshed instance of the given {@link Client}. */ public Client get( String clientId ) { return this.get( new Client( clientId ) ); } /** * Creates a {@link Client} object. * @return {@link Client} object, which represents a PAYMILL client. */ public Client create() { return this.createWithEmailAndDescription( null, null ); } /** * Creates a {@link Client} object with the given email. * @param email * Mail address for the {@link Client} * @return {@link Client} object, which represents a PAYMILL client. */ public Client createWithEmail( String email ) { return this.createWithEmailAndDescription( email, null ); } /** * Creates a {@link Client} object with the given description. * @param description * Description for the {@link Client} * @return {@link Client} object, which represents a PAYMILL client. */ public Client createWithDescription( String description ) { return this.createWithEmailAndDescription( null, description ); } /** * Creates a {@link Client} object. * @param email * Mail address for the {@link Client} or <code>null</code> * @param description * Description for the client or <code>null</code> * @return {@link Client} object, which represents a PAYMILL client. */ public Client createWithEmailAndDescription( String email, String description ) { ParameterMap<String, String> params = new ParameterMap<String, String>(); if( StringUtils.isNotBlank( email ) ) params.add( "email", email ); if( StringUtils.isNotBlank( description ) ) params.add( "description", description ); return RestfulUtils.create( ClientService.PATH, params, Client.class, super.httpClient ); } /** * This function updates the data of a client. To change only a specific attribute you can set this attribute in the update * request. All other attributes that should not be edited are not inserted. You can only edit the description, email and credit * card. The subscription can not be changed by updating the client data. This has to be done in the subscription call. * @param client * A {@link Client} with Id. */ public void update( Client client ) { RestfulUtils.update( ClientService.PATH, client, Client.class, super.httpClient ); } /** * This function deletes a client, but its transactions are not deleted. * @param client * A {@link Client} with Id. */ public void delete( Client client ) { RestfulUtils.delete( ClientService.PATH, client, Client.class, super.httpClient ); } /** * This function deletes a client, but its transactions are not deleted. * @param clientId * Id of the {@link Client} */ public void delete( String clientId ) { this.delete( new Client( clientId ) ); } }