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 org.apache.logging.log4j.LogManager;
34 import org.apache.logging.log4j.Logger;
35 import org.codelibs.core.concurrent.CommonPoolUtil;
36 import org.codelibs.core.lang.StringUtil;
37 import org.codelibs.fess.Constants;
38 import org.codelibs.fess.app.pager.ElevateWordPager;
39 import org.codelibs.fess.app.service.ElevateWordService;
40 import org.codelibs.fess.app.web.CrudMode;
41 import org.codelibs.fess.app.web.admin.elevateword.UploadForm;
42 import org.codelibs.fess.app.web.api.ApiResult;
43 import org.codelibs.fess.app.web.api.ApiResult.ApiUpdateResponse;
44 import org.codelibs.fess.app.web.api.ApiResult.Status;
45 import org.codelibs.fess.app.web.api.admin.FessApiAdminAction;
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.opensearch.config.exentity.ElevateWord;
50 import org.codelibs.fess.util.ComponentUtil;
51 import org.lastaflute.web.Execute;
52 import org.lastaflute.web.response.JsonResponse;
53 import org.lastaflute.web.response.StreamResponse;
54
55 import jakarta.annotation.Resource;
56
57
58
59
60
61
62 public class ApiAdminElevatewordAction extends FessApiAdminAction {
63
64 private static final Logger logger = LogManager.getLogger(ApiAdminElevatewordAction.class);
65
66
67
68
69
70
71
72
73 public ApiAdminElevatewordAction() {
74 super();
75 }
76
77
78
79
80
81
82 @Resource
83 private ElevateWordService elevateWordService;
84
85
86 @Resource
87 protected SuggestHelper suggestHelper;
88
89
90
91
92
93
94
95
96
97
98 @Execute
99 public JsonResponse<ApiResult> settings(final SearchBody body) {
100 validateApi(body, messages -> {});
101 final ElevateWordPager pager = copyBeanToNewBean(body, ElevateWordPager.class);
102 final List<ElevateWord> list = elevateWordService.getElevateWordList(pager);
103 return asJson(
104 new ApiResult.ApiConfigsResponse<EditBody>().settings(list.stream().map(this::createEditBody).collect(Collectors.toList()))
105 .total(pager.getAllRecordCount())
106 .status(ApiResult.Status.OK)
107 .result());
108 }
109
110
111
112
113
114
115
116
117 @Execute
118 public JsonResponse<ApiResult> get$setting(final String id) {
119
120 final ElevateWord entity = elevateWordService.getElevateWord(id).orElseGet(() -> {
121 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
122 return null;
123 });
124
125 final EditBody body = createEditBody(entity);
126 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
127 body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
128 .filter(StringUtil::isNotBlank)
129 .distinct()
130 .collect(Collectors.joining("\n")));
131 return asJson(new ApiResult.ApiConfigResponse().setting(body).status(ApiResult.Status.OK).result());
132 }
133
134
135
136
137
138
139
140
141
142 @Execute
143 public JsonResponse<ApiResult> post$setting(final CreateBody body) {
144 validateApi(body, messages -> {});
145 body.crudMode = CrudMode.CREATE;
146 final ElevateWord entity = getElevateWord(body).orElseGet(() -> {
147 throwValidationErrorApi(messages -> {
148 messages.addErrorsCrudFailedToCreateInstance(GLOBAL);
149 });
150 return null;
151 });
152 try {
153 elevateWordService.store(entity);
154 suggestHelper.addElevateWord(entity.getSuggestWord(), entity.getReading(), entity.getLabelTypeValues(), entity.getPermissions(),
155 entity.getBoost(), false);
156 } catch (final Exception e) {
157 logger.warn("Failed to process a request.", e);
158 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)));
159 }
160 return asJson(new ApiResult.ApiUpdateResponse().id(entity.getId()).created(true).status(ApiResult.Status.OK).result());
161 }
162
163
164
165
166
167
168
169
170
171 @Execute
172 public JsonResponse<ApiResult> put$setting(final EditBody body) {
173 validateApi(body, messages -> {});
174 body.crudMode = CrudMode.EDIT;
175 final ElevateWord elevateWord = getElevateWord(body).map(entity -> {
176 try {
177 elevateWordService.store(entity);
178 suggestHelper.deleteAllElevateWord(false);
179 suggestHelper.storeAllElevateWords(false);
180 } catch (final Exception e) {
181 logger.warn("Failed to process a request.", e);
182 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)));
183 }
184 return entity;
185 }).orElseGet(() -> {
186 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, body.id));
187 return null;
188 });
189
190 return asJson(new ApiUpdateResponse().id(elevateWord.getId()).created(false).status(Status.OK).result());
191 }
192
193
194
195
196
197
198
199
200
201 @Execute
202 public JsonResponse<ApiResult> delete$setting(final String id) {
203 try {
204 elevateWordService.getElevateWord(id).ifPresent(entity -> {
205 try {
206 elevateWordService.delete(entity);
207 suggestHelper.deleteElevateWord(entity.getSuggestWord(), false);
208 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
209 } catch (final Exception e) {
210 logger.warn("Failed to process a request.", e);
211 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
212 }
213 }).orElse(() -> {
214 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
215 });
216 } catch (final Exception e) {
217 logger.warn("Failed to process a request.", e);
218 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
219 }
220 return asJson(new ApiResult.ApiUpdateResponse().id(id).created(false).status(ApiResult.Status.OK).result());
221 }
222
223
224
225
226
227
228
229
230
231 @Execute
232 public JsonResponse<ApiResult> put$upload(final UploadForm body) {
233 validateApi(body, messages -> {});
234 CommonPoolUtil.execute(() -> {
235 try (Reader reader = new BufferedReader(new InputStreamReader(body.elevateWordFile.getInputStream(), getCsvEncoding()))) {
236 elevateWordService.importCsv(reader);
237 suggestHelper.storeAllElevateWords(false);
238 } catch (final Exception e) {
239 throw new FessSystemException("Failed to import data.", e);
240 }
241 });
242 return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result());
243 }
244
245
246
247
248
249
250
251
252
253 @Execute
254 public StreamResponse get$download(final DownloadBody body) {
255 validateApi(body, messages -> {});
256 return asStream("elevate.csv").contentTypeOctetStream().stream(out -> {
257 final Path tempFile = ComponentUtil.getSystemHelper().createTempFile("fess-elevate-", ".csv").toPath();
258 try {
259 try (Writer writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(tempFile), getCsvEncoding()))) {
260 elevateWordService.exportCsv(writer);
261 } catch (final Exception e) {
262 logger.warn("Failed to process a request.", e);
263 throwValidationErrorApi(messages -> messages.addErrorsFailedToDownloadElevateFile(GLOBAL));
264 }
265 try (InputStream in = Files.newInputStream(tempFile)) {
266 out.write(in);
267 }
268 } finally {
269 Files.delete(tempFile);
270 }
271 });
272 }
273
274
275
276
277
278
279
280
281 protected EditBody createEditBody(final ElevateWord entity) {
282 final EditBody body = new EditBody();
283 copyBeanToBean(entity, body, copyOp -> {
284 copyOp.excludeNull();
285 copyOp.exclude(Constants.PERMISSIONS);
286 });
287 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
288 body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
289 .filter(StringUtil::isNotBlank)
290 .distinct()
291 .collect(Collectors.joining("\n")));
292 return body;
293 }
294
295
296
297
298
299
300 private String getCsvEncoding() {
301 return fessConfig.getCsvFileEncoding();
302 }
303
304 }