Skip to content

Commit 9027344

Browse files
committed
feat(cp): add wedoc doc admin APIs
1 parent f67c2e3 commit 9027344

File tree

7 files changed

+293
-0
lines changed

7 files changed

+293
-0
lines changed

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaWeDocService.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,45 @@ public interface WxCpOaWeDocService {
220220
*/
221221
WxCpDocImageUploadResult docUploadImage(@NonNull File file) throws WxErrorException;
222222

223+
/**
224+
* 添加文档高级功能账号
225+
* 该接口用于为在线文档添加高级功能账号。
226+
* <p>
227+
* 请求方式:POST(HTTPS)
228+
* 请求地址: https://qyapi.weixin.qq.com/cgi-bin/wedoc/add_admin?access_token=ACCESS_TOKEN
229+
*
230+
* @param request 文档高级功能账号请求
231+
* @return wx cp base resp
232+
* @throws WxErrorException the wx error exception
233+
*/
234+
WxCpBaseResp docAddAdmin(@NonNull WxCpDocAdminRequest request) throws WxErrorException;
235+
236+
/**
237+
* 删除文档高级功能账号
238+
* 该接口用于删除在线文档的高级功能账号。
239+
* <p>
240+
* 请求方式:POST(HTTPS)
241+
* 请求地址: https://qyapi.weixin.qq.com/cgi-bin/wedoc/del_admin?access_token=ACCESS_TOKEN
242+
*
243+
* @param request 文档高级功能账号请求
244+
* @return wx cp base resp
245+
* @throws WxErrorException the wx error exception
246+
*/
247+
WxCpBaseResp docDeleteAdmin(@NonNull WxCpDocAdminRequest request) throws WxErrorException;
248+
249+
/**
250+
* 获取文档高级功能账号列表
251+
* 该接口用于获取在线文档的高级功能账号列表。
252+
* <p>
253+
* 请求方式:POST(HTTPS)
254+
* 请求地址: https://qyapi.weixin.qq.com/cgi-bin/wedoc/get_admin_list?access_token=ACCESS_TOKEN
255+
*
256+
* @param docId 文档 docid
257+
* @return 文档高级功能账号列表
258+
* @throws WxErrorException the wx error exception
259+
*/
260+
WxCpDocAdminListResult docGetAdminList(@NonNull String docId) throws WxErrorException;
261+
223262
/**
224263
* 获取智能表格内容权限
225264
* 该接口用于获取智能表格字段/记录等内容权限信息。

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaWeDocServiceImpl.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,29 @@ public WxCpDocImageUploadResult docUploadImage(@NonNull File file) throws WxErro
141141
return WxCpDocImageUploadResult.fromJson(responseContent);
142142
}
143143

144+
@Override
145+
public WxCpBaseResp docAddAdmin(@NonNull WxCpDocAdminRequest request) throws WxErrorException {
146+
String apiUrl = this.cpService.getWxCpConfigStorage().getApiUrl(WEDOC_ADD_ADMIN);
147+
String responseContent = this.cpService.post(apiUrl, request.toJson());
148+
return WxCpBaseResp.fromJson(responseContent);
149+
}
150+
151+
@Override
152+
public WxCpBaseResp docDeleteAdmin(@NonNull WxCpDocAdminRequest request) throws WxErrorException {
153+
String apiUrl = this.cpService.getWxCpConfigStorage().getApiUrl(WEDOC_DEL_ADMIN);
154+
String responseContent = this.cpService.post(apiUrl, request.toJson());
155+
return WxCpBaseResp.fromJson(responseContent);
156+
}
157+
158+
@Override
159+
public WxCpDocAdminListResult docGetAdminList(@NonNull String docId) throws WxErrorException {
160+
String apiUrl = this.cpService.getWxCpConfigStorage().getApiUrl(WEDOC_GET_ADMIN_LIST);
161+
JsonObject jsonObject = new JsonObject();
162+
jsonObject.addProperty("docid", docId);
163+
String responseContent = this.cpService.post(apiUrl, jsonObject.toString());
164+
return WxCpDocAdminListResult.fromJson(responseContent);
165+
}
166+
144167
@Override
145168
public WxCpDocSmartSheetAuth smartSheetGetAuth(@NonNull WxCpDocSmartSheetAuthRequest request) throws WxErrorException {
146169
String apiUrl = this.cpService.getWxCpConfigStorage().getApiUrl(WEDOC_SMARTSHEET_GET_SHEET_AUTH);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package me.chanjar.weixin.cp.bean.oa.doc;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
9+
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
10+
11+
import java.io.Serializable;
12+
import java.util.List;
13+
14+
/**
15+
* 文档高级功能账号列表.
16+
*/
17+
@Data
18+
@EqualsAndHashCode(callSuper = true)
19+
public class WxCpDocAdminListResult extends WxCpBaseResp implements Serializable {
20+
private static final long serialVersionUID = 6293762486917512845L;
21+
22+
@SerializedName("docid")
23+
private String docId;
24+
25+
@SerializedName("admin_list")
26+
private List<Admin> adminList;
27+
28+
public static WxCpDocAdminListResult fromJson(String json) {
29+
return WxCpGsonBuilder.create().fromJson(json, WxCpDocAdminListResult.class);
30+
}
31+
32+
@Override
33+
public String toJson() {
34+
return WxCpGsonBuilder.create().toJson(this);
35+
}
36+
37+
@Getter
38+
@Setter
39+
public static class Admin implements Serializable {
40+
private static final long serialVersionUID = -4984807259145367427L;
41+
42+
@SerializedName("userid")
43+
private String userId;
44+
45+
@SerializedName("open_userid")
46+
private String openUserId;
47+
48+
@SerializedName("type")
49+
private Integer type;
50+
}
51+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package me.chanjar.weixin.cp.bean.oa.doc;
2+
3+
import com.google.gson.JsonElement;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.annotations.SerializedName;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
import lombok.experimental.Accessors;
11+
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
12+
13+
import java.io.Serializable;
14+
import java.util.Map;
15+
16+
/**
17+
* 文档高级功能账号请求.
18+
*/
19+
@Data
20+
@Builder
21+
@NoArgsConstructor
22+
@AllArgsConstructor
23+
@Accessors(chain = true)
24+
public class WxCpDocAdminRequest implements Serializable {
25+
private static final long serialVersionUID = -358307253275446442L;
26+
27+
@SerializedName("docid")
28+
private String docId;
29+
30+
@SerializedName("userid")
31+
private String userId;
32+
33+
@SerializedName("open_userid")
34+
private String openUserId;
35+
36+
@SerializedName("type")
37+
private Integer type;
38+
39+
private transient JsonObject extra;
40+
41+
public static WxCpDocAdminRequest fromJson(String json) {
42+
return WxCpGsonBuilder.create().fromJson(json, WxCpDocAdminRequest.class);
43+
}
44+
45+
public String toJson() {
46+
JsonObject jsonObject = new JsonObject();
47+
jsonObject.addProperty("docid", this.docId);
48+
if (this.userId != null) {
49+
jsonObject.addProperty("userid", this.userId);
50+
}
51+
if (this.openUserId != null) {
52+
jsonObject.addProperty("open_userid", this.openUserId);
53+
}
54+
if (this.type != null) {
55+
jsonObject.addProperty("type", this.type);
56+
}
57+
if (this.extra != null) {
58+
for (Map.Entry<String, JsonElement> entry : this.extra.entrySet()) {
59+
jsonObject.add(entry.getKey(), entry.getValue());
60+
}
61+
}
62+
return WxCpGsonBuilder.create().toJson(jsonObject);
63+
}
64+
65+
public WxCpDocAdminRequest addExtra(String key, String value) {
66+
ensureExtra().addProperty(key, value);
67+
return this;
68+
}
69+
70+
public WxCpDocAdminRequest addExtra(String key, Number value) {
71+
ensureExtra().addProperty(key, value);
72+
return this;
73+
}
74+
75+
public WxCpDocAdminRequest addExtra(String key, Boolean value) {
76+
ensureExtra().addProperty(key, value);
77+
return this;
78+
}
79+
80+
public WxCpDocAdminRequest addExtra(String key, JsonElement value) {
81+
ensureExtra().add(key, value);
82+
return this;
83+
}
84+
85+
private JsonObject ensureExtra() {
86+
if (this.extra == null) {
87+
this.extra = new JsonObject();
88+
}
89+
return this.extra;
90+
}
91+
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,21 @@ interface Oa {
641641
*/
642642
String WEDOC_UPLOAD_DOC_IMAGE = "/cgi-bin/wedoc/upload_doc_image";
643643

644+
/**
645+
* The constant WEDOC_ADD_ADMIN.
646+
*/
647+
String WEDOC_ADD_ADMIN = "/cgi-bin/wedoc/add_admin";
648+
649+
/**
650+
* The constant WEDOC_DEL_ADMIN.
651+
*/
652+
String WEDOC_DEL_ADMIN = "/cgi-bin/wedoc/del_admin";
653+
654+
/**
655+
* The constant WEDOC_GET_ADMIN_LIST.
656+
*/
657+
String WEDOC_GET_ADMIN_LIST = "/cgi-bin/wedoc/get_admin_list";
658+
644659
/**
645660
* The constant WEDOC_SMARTSHEET_GET_SHEET_AUTH.
646661
*/

weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaWeDocServiceImplTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
88
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocData;
99
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocGetDataRequest;
10+
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocAdminListResult;
11+
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocAdminRequest;
1012
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocImageUploadResult;
1113
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocModifyRequest;
1214
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocSmartSheetAuth;
@@ -15,6 +17,7 @@
1517
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocSmartSheetRequest;
1618
import me.chanjar.weixin.cp.bean.oa.doc.WxCpDocSmartSheetResult;
1719
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
20+
import org.mockito.ArgumentCaptor;
1821
import org.testng.annotations.Test;
1922

2023
import java.io.File;
@@ -41,6 +44,9 @@ public void testNewApisUseExpectedPaths() throws WxErrorException {
4144
when(configStorage.getApiUrl(WEDOC_GET_DOC_DATA)).thenReturn("https://api.test/get_doc_data");
4245
when(configStorage.getApiUrl(WEDOC_MOD_DOC)).thenReturn("https://api.test/mod_doc");
4346
when(configStorage.getApiUrl(WEDOC_UPLOAD_DOC_IMAGE)).thenReturn("https://api.test/upload_doc_image");
47+
when(configStorage.getApiUrl(WEDOC_ADD_ADMIN)).thenReturn("https://api.test/add_admin");
48+
when(configStorage.getApiUrl(WEDOC_DEL_ADMIN)).thenReturn("https://api.test/del_admin");
49+
when(configStorage.getApiUrl(WEDOC_GET_ADMIN_LIST)).thenReturn("https://api.test/get_admin_list");
4450
when(configStorage.getApiUrl(WEDOC_SMARTSHEET_GET_SHEET_AUTH)).thenReturn("https://api.test/smartsheet/get_sheet_auth");
4551
when(configStorage.getApiUrl(WEDOC_SMARTSHEET_MOD_SHEET_AUTH)).thenReturn("https://api.test/smartsheet/mod_sheet_auth");
4652
when(configStorage.getApiUrl(WEDOC_SMARTSHEET_GET_SHEET)).thenReturn("https://api.test/smartsheet/get_sheet");
@@ -66,6 +72,12 @@ public void testNewApisUseExpectedPaths() throws WxErrorException {
6672
.thenReturn("{\"errcode\":0,\"errmsg\":\"ok\"}");
6773
when(cpService.upload(eq("https://api.test/upload_doc_image"), any()))
6874
.thenReturn("{\"errcode\":0,\"errmsg\":\"ok\",\"image_url\":\"https://img.test/a.png\",\"media_id\":\"media-1\"}");
75+
when(cpService.post(eq("https://api.test/add_admin"), anyString()))
76+
.thenReturn("{\"errcode\":0,\"errmsg\":\"ok\"}");
77+
when(cpService.post(eq("https://api.test/del_admin"), anyString()))
78+
.thenReturn("{\"errcode\":0,\"errmsg\":\"ok\"}");
79+
when(cpService.post(eq("https://api.test/get_admin_list"), anyString()))
80+
.thenReturn("{\"errcode\":0,\"errmsg\":\"ok\",\"docid\":\"doc1\",\"admin_list\":[{\"userid\":\"zhangsan\",\"type\":1}]}");
6981
when(cpService.post(eq("https://api.test/smartsheet/get_sheet_auth"), anyString()))
7082
.thenReturn("{\"errcode\":0,\"errmsg\":\"ok\",\"docid\":\"doc1\",\"sheet_id\":\"sheet1\"}");
7183
when(cpService.post(eq("https://api.test/smartsheet/mod_sheet_auth"), anyString()))
@@ -132,6 +144,38 @@ public void testNewApisUseExpectedPaths() throws WxErrorException {
132144
assertThat(uploadResult.getMediaId()).isEqualTo("media-1");
133145
verify(cpService).upload(eq("https://api.test/upload_doc_image"), any());
134146

147+
WxCpDocAdminRequest adminRequest = WxCpDocAdminRequest.builder()
148+
.docId("doc1")
149+
.userId("zhangsan")
150+
.type(1)
151+
.build();
152+
WxCpBaseResp addAdminResp = service.docAddAdmin(adminRequest);
153+
assertThat(addAdminResp.getErrcode()).isZero();
154+
ArgumentCaptor<String> addAdminBodyCaptor = ArgumentCaptor.forClass(String.class);
155+
verify(cpService).post(eq("https://api.test/add_admin"), addAdminBodyCaptor.capture());
156+
assertThat(addAdminBodyCaptor.getValue()).contains("\"docid\":\"doc1\"");
157+
assertThat(addAdminBodyCaptor.getValue()).contains("\"userid\":\"zhangsan\"");
158+
assertThat(addAdminBodyCaptor.getValue()).contains("\"type\":1");
159+
160+
WxCpDocAdminRequest deleteAdminRequest = WxCpDocAdminRequest.builder()
161+
.docId("doc1")
162+
.openUserId("ou_zhangsan")
163+
.build();
164+
WxCpBaseResp deleteAdminResp = service.docDeleteAdmin(deleteAdminRequest);
165+
assertThat(deleteAdminResp.getErrcode()).isZero();
166+
ArgumentCaptor<String> deleteAdminBodyCaptor = ArgumentCaptor.forClass(String.class);
167+
verify(cpService).post(eq("https://api.test/del_admin"), deleteAdminBodyCaptor.capture());
168+
assertThat(deleteAdminBodyCaptor.getValue()).contains("\"docid\":\"doc1\"");
169+
assertThat(deleteAdminBodyCaptor.getValue()).contains("\"open_userid\":\"ou_zhangsan\"");
170+
171+
WxCpDocAdminListResult adminListResult = service.docGetAdminList("doc1");
172+
assertThat(adminListResult.getDocId()).isEqualTo("doc1");
173+
assertThat(adminListResult.getAdminList()).hasSize(1);
174+
assertThat(adminListResult.getAdminList().get(0).getUserId()).isEqualTo("zhangsan");
175+
ArgumentCaptor<String> getAdminListBodyCaptor = ArgumentCaptor.forClass(String.class);
176+
verify(cpService).post(eq("https://api.test/get_admin_list"), getAdminListBodyCaptor.capture());
177+
assertThat(getAdminListBodyCaptor.getValue()).isEqualTo("{\"docid\":\"doc1\"}");
178+
135179
WxCpDocSmartSheetAuthRequest authRequest = WxCpDocSmartSheetAuthRequest.builder()
136180
.docId("doc1")
137181
.sheetId("sheet1")

weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/oa/doc/WxCpOaWeDocJsonTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,36 @@ public void testDocUploadImageAndSmartSheetAuthJson() {
249249
assertThat(smartSheetAuth.getEffectiveAuthInfo().getAsJsonObject().get("mode").getAsString()).isEqualTo("custom");
250250
}
251251

252+
@Test
253+
public void testDocAdminJson() {
254+
WxCpDocAdminRequest request = WxCpDocAdminRequest.builder()
255+
.docId("doc456")
256+
.userId("zhangsan")
257+
.type(1)
258+
.build();
259+
assertThat(request.toJson()).contains("\"docid\":\"doc456\"");
260+
assertThat(request.toJson()).contains("\"userid\":\"zhangsan\"");
261+
assertThat(request.toJson()).contains("\"type\":1");
262+
263+
WxCpDocAdminRequest openUserRequest = WxCpDocAdminRequest.builder()
264+
.docId("doc456")
265+
.openUserId("ou_xxx")
266+
.build();
267+
assertThat(openUserRequest.toJson()).contains("\"open_userid\":\"ou_xxx\"");
268+
269+
String json = "{"
270+
+ "\"errcode\":0,"
271+
+ "\"errmsg\":\"ok\","
272+
+ "\"docid\":\"doc456\","
273+
+ "\"admin_list\":[{\"userid\":\"zhangsan\",\"type\":1},{\"open_userid\":\"ou_xxx\",\"type\":2}]"
274+
+ "}";
275+
WxCpDocAdminListResult result = WxCpDocAdminListResult.fromJson(json);
276+
assertThat(result.getDocId()).isEqualTo("doc456");
277+
assertThat(result.getAdminList()).hasSize(2);
278+
assertThat(result.getAdminList().get(0).getUserId()).isEqualTo("zhangsan");
279+
assertThat(result.getAdminList().get(1).getOpenUserId()).isEqualTo("ou_xxx");
280+
}
281+
252282
@Test
253283
public void testSmartSheetCrudJson() {
254284
JsonObject properties = new JsonObject();

0 commit comments

Comments
 (0)