test commit

This commit is contained in:
danmo 2024-04-16 10:31:14 +08:00
parent 84b3cb6fc0
commit 093d9e4f98
14 changed files with 521 additions and 14 deletions

View File

@ -0,0 +1,93 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DyResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.query.AppletTemplateQuery;
import com.dyj.web.domain.query.CreateAppletTemplateQuery;
import com.dyj.web.domain.query.SaveRetainConsultCardQuery;
import com.dyj.web.domain.vo.*;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
class BusinessTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
//创建/更新留资卡片
@Test
void saveRetainConsultCard() {
SaveRetainConsultCardVo consultCard = DyWebClient.getInstance().saveRetainConsultCard(SaveRetainConsultCardQuery.builder().build());
System.out.println(JSONObject.toJSONString(consultCard));
}
//查询留资卡片
@Test
void getRetainConsultCard() {
RetainConsultCardVo consultCard = DyWebClient.getInstance().getRetainConsultCard(openId);
System.out.println(JSONObject.toJSONString(consultCard));
}
//删除留资卡片
@Test
void deleteRetainConsultCard() {
SaveRetainConsultCardVo consultCard = DyWebClient.getInstance().deleteRetainConsultCard(SaveRetainConsultCardQuery.builder().build());
System.out.println(JSONObject.toJSONString(consultCard));
}
//创建/更新小程序引导卡片模板
@Test
void setAppletTemplate() {
DyResult<CreateAppletTemplateVo> dyResult = DyWebClient.getInstance().setAppletTemplate(CreateAppletTemplateQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
//查询小程序引导卡片模板
@Test
void getAppletTemplate() {
DyResult<AppletTemplateVo> dyResult = DyWebClient.getInstance().getAppletTemplate(AppletTemplateQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
//删除小程序引导卡片模板
@Test
void delAppletTemplate() {
DyResult<BaseVo> dyResult = DyWebClient.getInstance().delAppletTemplate(AppletTemplateQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传图片
@Test
void imageClientUpload() {
byte[] bytes = {};
ImageClientUploadVo dyResult = DyWebClient.getInstance().imageClientUpload(bytes);
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传图片
@Test
void testImageClientUpload() {
ImageClientUploadVo dyResult = DyWebClient.getInstance().imageClientUpload(new File(""));
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传图片
@Test
void testImageClientUpload1() throws IOException {
FileInputStream fileInputStream = FileUtils.openInputStream(new File(""));
ImageClientUploadVo dyResult = DyWebClient.getInstance().imageClientUpload(fileInputStream);
System.out.println(JSONObject.toJSONString(dyResult));
}
}

View File

@ -0,0 +1,53 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DyResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.query.CommentQuery;
import com.dyj.web.domain.vo.BaseVo;
import com.dyj.web.domain.vo.CommentListVo;
import com.dyj.web.domain.vo.CommentReplyVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
class CommentTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
private final String itemId = "";
private final String commentId = "";
//评论置顶
@Test
void commentTop() {
DyResult<BaseVo> dyResult = DyWebClient.getInstance().commentTop(CommentQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
//查询评论列表
@Test
void queryCommentList() {
DyResult<CommentListVo> dyResult = DyWebClient.getInstance().queryCommentList(openId, itemId, "time", 100, 0);
System.out.println(JSONObject.toJSONString(dyResult));
}
//查询评论回复列表
@Test
void queryCommentReplyList() {
DyResult<CommentListVo> dyResult = DyWebClient.getInstance().queryCommentReplyList(openId, itemId, commentId,"time", 100, 0);
System.out.println(JSONObject.toJSONString(dyResult));
}
//发表评论回复
@Test
void commentReply() {
DyResult<CommentReplyVo> dyResult = DyWebClient.getInstance().commentReply(CommentQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
}

View File

@ -0,0 +1,31 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DyResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.query.IntentionLogQuery;
import com.dyj.web.domain.vo.IntentionLogVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author danmo
* @date 2024-04-16 09:51
**/
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
public class IntentionTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
//互动用户记录查询
@Test
public void intentionLog() {
DyResult<IntentionLogVo> dyResult = DyWebClient.getInstance().intentionLog(IntentionLogQuery.builder().openId(openId).build());
System.out.println(JSONObject.toJSONString(dyResult));
}
}

View File

@ -0,0 +1,83 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DyResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.vo.BaseVo;
import com.dyj.web.domain.vo.MaterialListVo;
import com.dyj.web.domain.vo.UploadMaterialVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
class MediaTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
private final String mediaId = "";
//上传素材
@Test
void uploadMaterial() throws IOException {
DyResult<UploadMaterialVo> dyResult = DyWebClient.getInstance().uploadMaterial(new File(""));
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传素材
@Test
void testUploadMaterial() throws IOException {
InputStream inputStream = Files.newInputStream(new File("").toPath());
DyResult<UploadMaterialVo> dyResult = DyWebClient.getInstance().uploadMaterial(inputStream);
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传素材
@Test
void testUploadMaterial1() {
DyResult<UploadMaterialVo> dyResult = DyWebClient.getInstance().uploadMaterial(new byte[]{});
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传临时素材
@Test
void uploadTemporaryMaterial() throws IOException {
DyResult<UploadMaterialVo> dyResult = DyWebClient.getInstance().uploadTemporaryMaterial(new File(""));
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传临时素材
@Test
void testUploadTemporaryMaterial() {
DyResult<UploadMaterialVo> dyResult = DyWebClient.getInstance().uploadTemporaryMaterial(new byte[]{});
System.out.println(JSONObject.toJSONString(dyResult));
}
//上传临时素材
@Test
void testUploadTemporaryMaterial1() throws IOException {
DyResult<UploadMaterialVo> dyResult = DyWebClient.getInstance().uploadTemporaryMaterial(Files.newInputStream(new File("").toPath()));
System.out.println(JSONObject.toJSONString(dyResult));
}
//素材列表接口
@Test
void queryMaterialList() {
DyResult<MaterialListVo> dyResult = DyWebClient.getInstance().queryMaterialList(openId, 0, 10);
System.out.println(JSONObject.toJSONString(dyResult));
}
//删除素材
@Test
void deleteMaterial() {
DyResult<BaseVo> dyResult = DyWebClient.getInstance().deleteMaterial(openId, mediaId);
System.out.println(JSONObject.toJSONString(dyResult));
}
}

View File

@ -0,0 +1,58 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DyResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.query.ConfirmPostingTaskQuery;
import com.dyj.web.domain.query.CreatePostingTaskQuery;
import com.dyj.web.domain.query.PostingTaskQuery;
import com.dyj.web.domain.query.VideoDataQuery;
import com.dyj.web.domain.vo.BaseVo;
import com.dyj.web.domain.vo.ConfirmPostingTaskVo;
import com.dyj.web.domain.vo.PostingTaskVo;
import com.dyj.web.domain.vo.VideoBasicListVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
class PostingTaskTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
private final String itemId = "";
//创建投稿任务
@Test
void createPostingTask() {
DyResult<PostingTaskVo> postingTask = DyWebClient.getInstance().createPostingTask(CreatePostingTaskQuery.builder()
.taskName("")
.build());
System.out.println(JSONObject.toJSONString(postingTask));
}
//绑定视频
@Test
void postingTaskBindVideo() {
DyResult<BaseVo> dyResult = DyWebClient.getInstance().postingTaskBindVideo(PostingTaskQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
//核销投稿任务
@Test
void confirmPostingTask() {
DyResult<ConfirmPostingTaskVo> dyResult = DyWebClient.getInstance().confirmPostingTask(ConfirmPostingTaskQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
//查询视频基础信息
@Test
void queryVideoBasicInfo() {
DyResult<VideoBasicListVo> dyResult = DyWebClient.getInstance().queryVideoBasicInfo(VideoDataQuery.builder().build());
System.out.println(JSONObject.toJSONString(dyResult));
}
}

View File

@ -0,0 +1,58 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DySimpleResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.query.GetH5ShareQuery;
import com.dyj.web.domain.vo.SchemaShareVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
class SchemaTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
private final String itemId = "";
//H5分享跳转链接获取
@Test
void getH5Share() {
DySimpleResult<SchemaShareVo> dySimpleResult = DyWebClient.getInstance().getH5Share(GetH5ShareQuery.builder().build());
System.out.println(JSONObject.toJSONString(dySimpleResult));
}
//个人页跳转链接获取
@Test
void getUserProfile() {
DySimpleResult<SchemaShareVo> dySimpleResult = DyWebClient.getInstance().getUserProfile(openId, "", 1000L);
System.out.println(JSONObject.toJSONString(dySimpleResult));
}
//个人会话页跳转链接获取
@Test
void getUserChat() {
DySimpleResult<SchemaShareVo> dySimpleResult = DyWebClient.getInstance().getUserChat(openId, "", 1000L);
System.out.println(JSONObject.toJSONString(dySimpleResult));
}
//视频详情页跳转链接获取
@Test
void getItem() {
DySimpleResult<SchemaShareVo> dySimpleResult = DyWebClient.getInstance().getItem(itemId, "", 1000L);
System.out.println(JSONObject.toJSONString(dySimpleResult));
}
//直播间页跳转链接获取
@Test
void getLive() {
DySimpleResult<SchemaShareVo> dySimpleResult = DyWebClient.getInstance().getLive(openId, "", 1000L);
System.out.println(JSONObject.toJSONString(dySimpleResult));
}
}

View File

@ -0,0 +1,68 @@
package com.dyj.examples;
import com.alibaba.fastjson.JSONObject;
import com.dyj.common.domain.DyResult;
import com.dyj.web.DyWebClient;
import com.dyj.web.domain.EventSubscribe;
import com.dyj.web.domain.query.UpdateEventSubscribeQuery;
import com.dyj.web.domain.vo.BaseVo;
import com.dyj.web.domain.vo.EventSubscribeVo;
import com.dyj.web.domain.vo.MicAppDevtoolLegalVo;
import com.dyj.web.domain.vo.TicketVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Collections;
@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DyJavaExamplesApplication.class)
class ToolsTest {
private final String openId = "_000PVg69T4BivjAuETIkxHls3cNlJs2CVXm";
//小程序接口能力
@Test
void micAppDevtoolLegal() {
DyResult<MicAppDevtoolLegalVo> dyResult = DyWebClient.getInstance().micAppDevtoolLegal("micAppId");
System.out.println(JSONObject.toJSONString(dyResult));
}
//模拟webhook事件
@Test
void webhookEventSend() {
DyResult<BaseVo> dyResult = DyWebClient.getInstance().webhookEventSend("eventType");
System.out.println(JSONObject.toJSONString(dyResult));
}
//获取jsb_ticket
@Test
void getJsbTicket() {
DyResult<TicketVo> dyResult = DyWebClient.getInstance().getJsbTicket();
System.out.println(JSONObject.toJSONString(dyResult));
}
//获取 open_ticket
@Test
void getOpenTicket() {
DyResult<TicketVo> dyResult = DyWebClient.getInstance().getOpenTicket();
System.out.println(JSONObject.toJSONString(dyResult));
}
//获取事件订阅状态
@Test
void getEventSubscribeStatus() {
DyResult<EventSubscribeVo> dyResult = DyWebClient.getInstance().getEventSubscribeStatus();
System.out.println(JSONObject.toJSONString(dyResult));
}
//更新事件订阅状态
@Test
void updateEventSubscribeStatus() {
DyResult<BaseVo> dyResult = DyWebClient.getInstance().updateEventSubscribeStatus(UpdateEventSubscribeQuery.builder().list(Collections.singletonList(EventSubscribe.builder().build())).build());
}
}

View File

@ -507,7 +507,7 @@ public class DyWebClient {
* @param bytes 图片文件字节数组
* @return 返回上传图片结果
*/
public ImageClientUploadVo imageClientUpload(Byte[] bytes) {
public ImageClientUploadVo imageClientUpload(byte[] bytes) {
return new BusinessHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).imageClientUpload(bytes);
}
@ -526,7 +526,7 @@ public class DyWebClient {
* @param query
* @return
*/
public DyResult<BaseVo> commentTop(@JSONBody CommentQuery query) {
public DyResult<BaseVo> commentTop(CommentQuery query) {
return new CommentHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).commentTop(query);
}
@ -565,7 +565,7 @@ public class DyWebClient {
* @param query 包含评论信息的查询参数
* @return 返回评论回复的结果包含评论回复的详细信息
*/
public DyResult<CommentReplyVo> commentReply(@JSONBody CommentQuery query) {
public DyResult<CommentReplyVo> commentReply(CommentQuery query) {
// 通过租户ID和客户端密钥加载代理配置创建评论处理器并发表评论回复
return new CommentHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).commentReply(query);
}
@ -595,7 +595,7 @@ public class DyWebClient {
* @param expireAt 生成短链过期时间
* @return DySimpleResult<SchemaShareVo>
*/
DySimpleResult<SchemaShareVo> getUserChat(String openId,String account, Long expireAt){
public DySimpleResult<SchemaShareVo> getUserChat(String openId, String account, Long expireAt){
return new SchemaHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).getUserChat(openId, account, expireAt);
}
/**

View File

@ -75,7 +75,7 @@ public interface BusinessClient {
@Post(value = "${imageClientUpload}",contentType = ContentType.MULTIPART_FORM_DATA ,interceptor = ClientTokenInterceptor.class)
ImageClientUploadVo imageClientUpload(@Var("query") BaseQuery query, @DataFile(value = "image",fileName = "image") InputStream inputStream);
@Post(value = "${imageClientUpload}",contentType = ContentType.MULTIPART_FORM_DATA ,interceptor = ClientTokenInterceptor.class)
ImageClientUploadVo imageClientUpload(@Var("query") BaseQuery query, @DataFile(value = "image",fileName = "image") Byte[] bytes);
ImageClientUploadVo imageClientUpload(@Var("query") BaseQuery query, @DataFile(value = "image",fileName = "image") byte[] bytes);

View File

@ -15,4 +15,43 @@ public class EventSubscribe {
* 事件订阅状态 * `0` - 未订阅 * `1` - 已订阅
*/
private Integer status;
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public static EventSubscribeBuild builder() {
return new EventSubscribeBuild();
}
public static class EventSubscribeBuild {
private String event;
private Integer status;
public EventSubscribeBuild event(String event) {
this.event = event;
return this;
}
public EventSubscribeBuild status(Integer status) {
this.status = status;
return this;
}
public EventSubscribe build() {
EventSubscribe eventSubscribe = new EventSubscribe();
eventSubscribe.setEvent(event);
eventSubscribe.setStatus(status);
return eventSubscribe;
}
}
}

View File

@ -19,4 +19,23 @@ public class UpdateEventSubscribeQuery extends BaseQuery{
public void setList(List<EventSubscribe> list) {
this.list = list;
}
public static UpdateEventSubscribeQueryBuild builder() {
return new UpdateEventSubscribeQueryBuild();
}
public static class UpdateEventSubscribeQueryBuild {
private List<EventSubscribe> list;
public UpdateEventSubscribeQueryBuild list(List<EventSubscribe> list) {
this.list = list;
return this;
}
public UpdateEventSubscribeQuery build() {
UpdateEventSubscribeQuery updateEventSubscribeQuery = new UpdateEventSubscribeQuery();
updateEventSubscribeQuery.setList(list);
return updateEventSubscribeQuery;
}
}
}

View File

@ -73,7 +73,7 @@ public class BusinessHandler extends AbstractWebHandler{
return getBusinessClient().imageClientUpload(query, inputStream);
}
public ImageClientUploadVo imageClientUpload(Byte[] bytes) {
public ImageClientUploadVo imageClientUpload(byte[] bytes) {
BaseQuery query = new BaseQuery();
query.setClientKey(agentConfiguration.getClientKey());
query.setTenantId(agentConfiguration.getTenantId());

View File

@ -19,7 +19,7 @@ public class CommentHandler extends AbstractWebHandler {
super(agentConfiguration);
}
public DyResult<BaseVo> commentTop(@JSONBody CommentQuery query) {
public DyResult<BaseVo> commentTop(CommentQuery query) {
query.setTenantId(agentConfiguration.getTenantId());
query.setClientKey(agentConfiguration.getClientKey());
return getCommentClient().commentTop(query);
@ -41,7 +41,7 @@ public class CommentHandler extends AbstractWebHandler {
return getCommentClient().queryCommentReplyList(query, itemId,commentId, sortType, count, cursor);
}
public DyResult<CommentReplyVo> commentReply(@JSONBody CommentQuery query) {
public DyResult<CommentReplyVo> commentReply(CommentQuery query) {
query.setTenantId(agentConfiguration.getTenantId());
query.setClientKey(agentConfiguration.getClientKey());
return getCommentClient().commentReply(query);

View File

@ -1,6 +1,5 @@
package com.dyj.web.handler;
import com.dtflys.forest.annotation.JSONBody;
import com.dyj.common.config.AgentConfiguration;
import com.dyj.common.domain.DyResult;
import com.dyj.web.domain.query.ConfirmPostingTaskQuery;
@ -16,7 +15,7 @@ import com.dyj.web.domain.vo.VideoBasicListVo;
* @author danmo
* @date 2024-04-11 14:18
**/
public class PostingTaskHandler extends AbstractWebHandler{
public class PostingTaskHandler extends AbstractWebHandler {
public PostingTaskHandler(AgentConfiguration agentConfiguration) {
super(agentConfiguration);
@ -28,34 +27,40 @@ public class PostingTaskHandler extends AbstractWebHandler{
* @param query 入参
* @return DyResult<PostingTaskVo>
*/
public DyResult<PostingTaskVo> createPostingTask(CreatePostingTaskQuery query){
public DyResult<PostingTaskVo> createPostingTask(CreatePostingTaskQuery query) {
baseQuery(query);
return getPostingTaskClient().createPostingTask(query);
}
/**
* 绑定视频
*
* @param query 入参
* @return DyResult<BaseVo>
*/
public DyResult<BaseVo> postingTaskBindVideo(PostingTaskQuery query){
public DyResult<BaseVo> postingTaskBindVideo(PostingTaskQuery query) {
baseQuery(query);
return getPostingTaskClient().postingTaskBindVideo(query);
}
/**
* 核销投稿任务
*
* @param query 入参
* @return DyResult<ConfirmPostingTaskVo>
*/
public DyResult<ConfirmPostingTaskVo> confirmPostingTask(ConfirmPostingTaskQuery query){
public DyResult<ConfirmPostingTaskVo> confirmPostingTask(ConfirmPostingTaskQuery query) {
baseQuery(query);
return getPostingTaskClient().postingTaskConfirm(query);
}
/**
* 查询视频基础信息
*
* @param query 入参
* @return DyResult<VideoBasicListVo>
*/
public DyResult<VideoBasicListVo> queryVideoBasicInfo(VideoDataQuery query){
public DyResult<VideoBasicListVo> queryVideoBasicInfo(VideoDataQuery query) {
baseQuery(query);
return getPostingTaskClient().queryVideoBasicInfo(query);
}