Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added document endpoint #316

Merged
merged 7 commits into from
Apr 1, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions documents/document.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
## Document

### Create a Document

```java
JSONObject request = new JSONObject();
request.put("file","/Users/your_name/Downloads/sample_uploaded.jpeg");
request.put("purpose","dispute_evidence");

Document document = instance.document.create(request);
```

**Parameters:**

| Name | Type | Description |
|----------|-----------|-----------------------------------------------------------------|
| file* | string | The URL generated once the business proof document is uploaded. |
| purpose | string | Possible value is `dispute_evidence` |

**Response:**
```json
{
"id": "doc_EsyWjHrfzb59Re",
"entity": "document",
"purpose": "dispute_evidence",
"name": "doc_19_12_2020.jpg",
"mime_type": "image/png",
"size": 2863,
"created_at": 1590604200
}
```
-------------------------------------------------------------------------------------------------------

### Fetch Document Information

```java
String documentId = "doc_EsyWjHrfzb59Re";

Document document = instance.document.fetch(documentId);
```

**Parameters:**

| Name | Type | Description |
|-------------|--------|--------------------------------------------------|
| documentId | string | The unique identifier of the document. |

**Response:**
```json
{
"entity": "document",
"id": "doc_00000000000000",
"purpose": "dispute_evidence",
"created_at": 1701701378,
"mime_type": "application/pdf",
"display_name": "ppm_00000000000000",
"size": 404678,
"url": ""
}
```
-------------------------------------------------------------------------------------------------------

**PN: * indicates mandatory fields**
<br>
<br>
**For reference click [here](https://razorpay.com/docs/api/documents)**
44 changes: 42 additions & 2 deletions src/main/java/com/razorpay/ApiUtils.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.razorpay;

import java.io.File;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
Expand All @@ -23,6 +24,8 @@
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.MultipartBody;
import okhttp3.MediaType;

class ApiUtils {

Expand Down Expand Up @@ -75,8 +78,15 @@ static Response postRequest(String version, String path, JSONObject requestObjec

HttpUrl.Builder builder = getBuilder(version, path, host);

String requestContent = requestObject == null ? "" : requestObject.toString();
RequestBody requestBody = RequestBody.create(Constants.MEDIA_TYPE_JSON, requestContent);
RequestBody requestBody;

if(requestObject != null && requestObject.has("file")){
requestBody = fileRequestBody(requestObject);
}else{
String requestContent = requestObject == null ? "" : requestObject.toString();
requestBody = RequestBody.create(Constants.MEDIA_TYPE_JSON, requestContent);
}

Request request =
createRequest(Method.POST.name(), builder.build().toString(), requestBody, auth);
return processRequest(request);
Expand Down Expand Up @@ -225,4 +235,34 @@ private static X509TrustManager createDefaultTrustManager() throws NoSuchAlgorit
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
return trustManager;
}

private static String getMediaType(String fileName){
int extensionIndex = fileName.lastIndexOf('.');
String extenionName = fileName.substring(extensionIndex + 1);
if(extenionName == "jpg" | extenionName == "jpeg" | extenionName == "png" | extenionName == "jfif"){
return "image/jpg";
}
return "image/pdf";
}

private static RequestBody fileRequestBody(JSONObject requestObject){
File fileToUpload = new File((String) requestObject.get("file"));
String fileName = fileToUpload.getName();

MediaType mediaType = MediaType.parse(getMediaType(fileName));
RequestBody fileBody = RequestBody.create(mediaType, fileToUpload);

MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
multipartBodyBuilder.addFormDataPart("file",fileName, fileBody);

Iterator<?> iterator = requestObject.keys();
while (iterator.hasNext()) {
Object key = iterator.next();
Object value = requestObject.get(key.toString());
multipartBodyBuilder.addFormDataPart((String) key, (String) value);
}

MultipartBody requestBody = multipartBodyBuilder.build();
return requestBody;
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/razorpay/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,7 @@ public class Constants {
static final String TOKEN = "/token";
static final String REVOKE = "/revoke";

static final String DOCUMENTS = "/documents";

static final String DOCUMENT_FETCH = "/documents/%s";
}
10 changes: 10 additions & 0 deletions src/main/java/com/razorpay/Document.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.razorpay;

import org.json.JSONObject;

public class Document extends Entity {

public Document(JSONObject jsonObject) {
super(jsonObject);
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/razorpay/DocumentClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.razorpay;

import org.json.JSONObject;

public class DocumentClient extends ApiClient {

DocumentClient(String auth) {super(auth);}

public Document create(JSONObject request) throws RazorpayException {
return post(Constants.VERSION, Constants.DOCUMENTS, request);
}

public Document fetch(String id) throws RazorpayException {
return get(Constants.VERSION, String.format(Constants.DOCUMENT_FETCH, id), null);
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/razorpay/RazorpayClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class RazorpayClient {
public ProductClient product;
public WebhookClient webhook;
public TncMap tncMap;
public DocumentClient document;
public RazorpayClient(String key, String secret) throws RazorpayException {
this(key, secret, false);
}
Expand Down Expand Up @@ -66,6 +67,7 @@ private void initializeResources(String auth, Boolean enableLogging) throws Razo
stakeholder = new StakeholderClient(auth);
product = new ProductClient(auth);
webhook = new WebhookClient(auth);
document = new DocumentClient(auth);
}

public RazorpayClient addHeaders(Map<String, String> headers) {
Expand Down
72 changes: 72 additions & 0 deletions src/test/java/com/razorpay/DocumentClientTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.razorpay;

import org.json.JSONObject;
import org.junit.Test;
import org.mockito.InjectMocks;
import java.io.IOException;
import static org.junit.Assert.*;

public class DocumentClientTest extends BaseTest{

@InjectMocks
protected DocumentClient documentClient = new DocumentClient(TEST_SECRET_KEY);

private static final String DOCUMENT_ID = "doc_EsyWjHrfzb59Re";

@Test
public void create() throws RazorpayException {
JSONObject request = new JSONObject();
request.put("files","/Users/your_name/Downloads/sample_uploaded.jpeg");
request.put("purpose","dispute_evidence");

JSONObject mockedResponseJson = new JSONObject();
mockedResponseJson.put("id","doc_EsyWjHrfzb59Re");
mockedResponseJson.put("entity","document");
mockedResponseJson.put("purpose","dispute_evidence");
mockedResponseJson.put("name","sample_uploaded.jpg");
mockedResponseJson.put("mime_type","image/png");
mockedResponseJson.put("size","2863");
mockedResponseJson.put("created_at","1590604200");

try {
mockResponseFromExternalClient(mockedResponseJson.toString());
mockResponseHTTPCodeFromExternalClient(200);
Document document = documentClient.create(request);
assertNotNull(document);
assertEquals("document",document.get("entity"));
assertTrue(document.has("name"));
assertTrue(document.has("size"));
String createRequest = getHost(Constants.DOCUMENTS);
verifySentRequest(true, request.toString(), createRequest);
} catch (IOException e) {
assertTrue(false);
}
}

@Test
public void fetch() throws RazorpayException {

JSONObject mockedResponseJson = new JSONObject();
mockedResponseJson.put("id","doc_EsyWjHrfzb59Re");
mockedResponseJson.put("entity","document");
mockedResponseJson.put("purpose","dispute_evidence");
mockedResponseJson.put("name","doc_19_12_2020.jpg");
mockedResponseJson.put("mime_type","image/png");
mockedResponseJson.put("size","2863");
mockedResponseJson.put("created_at","1590604200");

try {
mockResponseFromExternalClient(mockedResponseJson.toString());
mockResponseHTTPCodeFromExternalClient(200);
Document fetch = documentClient.fetch(DOCUMENT_ID);
assertNotNull(fetch);
assertEquals(DOCUMENT_ID,fetch.get("id"));
assertTrue(fetch.has("purpose"));
assertTrue(fetch.has("name"));
String fetchRequest = getHost(String.format(Constants.DOCUMENT_FETCH,DOCUMENT_ID));
verifySentRequest(false, null, fetchRequest);
} catch (IOException e) {
assertTrue(false);
}
}
}
Loading