1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.web.api.admin.elevateword;
17
18 import static org.codelibs.core.stream.StreamUtil.stream;
19 import static org.codelibs.fess.app.web.admin.elevateword.AdminElevatewordAction.getElevateWord;
20
21 import java.io.BufferedReader;
22 import java.io.BufferedWriter;
23 import java.io.InputStream;
24 import java.io.InputStreamReader;
25 import java.io.OutputStreamWriter;
26 import java.io.Reader;
27 import java.io.Writer;
28 import java.nio.file.Files;
29 import java.nio.file.Path;
30 import java.util.List;
31 import java.util.stream.Collectors;
32
33 import javax.annotation.Resource;
34
35 import org.codelibs.core.lang.StringUtil;
36 import org.codelibs.fess.Constants;
37 import org.codelibs.fess.app.pager.ElevateWordPager;
38 import org.codelibs.fess.app.service.ElevateWordService;
39 import org.codelibs.fess.app.web.CrudMode;
40 import org.codelibs.fess.app.web.admin.elevateword.UploadForm;
41 import org.codelibs.fess.app.web.api.ApiResult;
42 import org.codelibs.fess.app.web.api.ApiResult.ApiUpdateResponse;
43 import org.codelibs.fess.app.web.api.ApiResult.Status;
44 import org.codelibs.fess.app.web.api.admin.FessApiAdminAction;
45 import org.codelibs.fess.es.config.exentity.ElevateWord;
46 import org.codelibs.fess.exception.FessSystemException;
47 import org.codelibs.fess.helper.PermissionHelper;
48 import org.codelibs.fess.helper.SuggestHelper;
49 import org.codelibs.fess.util.ComponentUtil;
50 import org.lastaflute.web.Execute;
51 import org.lastaflute.web.response.JsonResponse;
52 import org.lastaflute.web.response.StreamResponse;
53
54 public class ApiAdminElevatewordAction extends FessApiAdminAction {
55
56 @Resource
57 private ElevateWordService elevateWordService;
58
59 @Resource
60 protected SuggestHelper suggestHelper;
61
62
63
64 @Execute
65 public JsonResponse<ApiResult> settings(final SearchBody body) {
66 validateApi(body, messages -> {});
67 final ElevateWordPager pager = copyBeanToNewBean(body, ElevateWordPager.class);
68 final List<ElevateWord> list = elevateWordService.getElevateWordList(pager);
69 return asJson(new ApiResult.ApiConfigsResponse<EditBody>()
70 .settings(list.stream().map(entity -> createEditBody(entity)).collect(Collectors.toList()))
71 .total(pager.getAllRecordCount()).status(ApiResult.Status.OK).result());
72 }
73
74
75 @Execute
76 public JsonResponse<ApiResult> get$setting(final String id) {
77
78 final ElevateWord entity = elevateWordService.getElevateWord(id).orElseGet(() -> {
79 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
80 return null;
81 });
82
83 final EditBody body = createEditBody(entity);
84 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
85 body.permissions =
86 stream(entity.getPermissions()).get(
87 stream -> stream.map(s -> permissionHelper.decode(s)).filter(StringUtil::isNotBlank).distinct()
88 .collect(Collectors.joining("\n")));
89 return asJson(new ApiResult.ApiConfigResponse().setting(body).status(ApiResult.Status.OK).result());
90 }
91
92
93 @Execute
94 public JsonResponse<ApiResult> put$setting(final CreateBody body) {
95 validateApi(body, messages -> {});
96 body.crudMode = CrudMode.CREATE;
97 final ElevateWord entity = getElevateWord(body).orElseGet(() -> {
98 throwValidationErrorApi(messages -> {
99 messages.addErrorsCrudFailedToCreateInstance(GLOBAL);
100 });
101 return null;
102 });
103 try {
104 elevateWordService.store(entity);
105 suggestHelper.addElevateWord(entity.getSuggestWord(), entity.getReading(), entity.getLabelTypeValues(),
106 entity.getPermissions(), entity.getBoost(), false);
107 } catch (final Exception e) {
108 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)));
109 }
110 return asJson(new ApiResult.ApiUpdateResponse().id(entity.getId()).created(true).status(ApiResult.Status.OK).result());
111 }
112
113
114 @Execute
115 public JsonResponse<ApiResult> post$setting(final EditBody body) {
116 validateApi(body, messages -> {});
117 body.crudMode = CrudMode.EDIT;
118 final ElevateWord elevateWord = getElevateWord(body).map(entity -> {
119 try {
120 elevateWordService.store(entity);
121 suggestHelper.deleteAllElevateWord(false);
122 suggestHelper.storeAllElevateWords(false);
123 } catch (final Exception e) {
124 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)));
125 }
126 return entity;
127 }).orElseGet(() -> {
128 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, body.id));
129 return null;
130 });
131
132 return asJson(new ApiUpdateResponse().id(elevateWord.getId()).created(false).status(Status.OK).result());
133 }
134
135
136 @Execute
137 public JsonResponse<ApiResult> delete$setting(final String id) {
138 try {
139 elevateWordService.getElevateWord(id).ifPresent(entity -> {
140 try {
141 elevateWordService.delete(entity);
142 suggestHelper.deleteElevateWord(entity.getSuggestWord(), false);
143 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
144 } catch (final Exception e) {
145 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
146 }
147 }).orElse(() -> {
148 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
149 });
150 } catch (final Exception e) {
151 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
152 }
153 return asJson(new ApiResult.ApiUpdateResponse().id(id).created(false).status(ApiResult.Status.OK).result());
154 }
155
156
157 @Execute
158 public JsonResponse<ApiResult> post$upload(final UploadForm body) {
159 validateApi(body, messages -> {});
160 new Thread(() -> {
161 try (Reader reader = new BufferedReader(new InputStreamReader(body.elevateWordFile.getInputStream(), getCsvEncoding()))) {
162 elevateWordService.importCsv(reader);
163 suggestHelper.storeAllElevateWords(false);
164 } catch (final Exception e) {
165 throw new FessSystemException("Failed to import data.", e);
166 }
167 }).start();
168 return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result());
169 }
170
171
172 @Execute
173 public StreamResponse get$download(final DownloadBody body) {
174 validateApi(body, messages -> {});
175 return asStream("elevate.csv").contentTypeOctetStream().stream(out -> {
176 final Path tempFile = Files.createTempFile(null, null);
177 try {
178 try (Writer writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(tempFile), getCsvEncoding()))) {
179 elevateWordService.exportCsv(writer);
180 } catch (final Exception e) {
181 throwValidationErrorApi(messages -> messages.addErrorsFailedToDownloadElevateFile(GLOBAL));
182 }
183 try (InputStream in = Files.newInputStream(tempFile)) {
184 out.write(in);
185 }
186 } finally {
187 Files.delete(tempFile);
188 }
189 });
190 }
191
192 protected EditBody createEditBody(final ElevateWord entity) {
193 final EditBody body = new EditBody();
194 copyBeanToBean(entity, body, copyOp -> {
195 copyOp.excludeNull();
196 copyOp.exclude(Constants.PERMISSIONS);
197 });
198 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
199 body.permissions =
200 stream(entity.getPermissions()).get(
201 stream -> stream.map(s -> permissionHelper.decode(s)).filter(StringUtil::isNotBlank).distinct()
202 .collect(Collectors.joining("\n")));
203 return body;
204 }
205
206 private String getCsvEncoding() {
207 return fessConfig.getCsvFileEncoding();
208 }
209
210 }