View Javadoc
1   /*
2    * Copyright 2012-2021 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
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.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.es.config.exentity.ElevateWord;
47  import org.codelibs.fess.exception.FessSystemException;
48  import org.codelibs.fess.helper.PermissionHelper;
49  import org.codelibs.fess.helper.SuggestHelper;
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  public class ApiAdminElevatewordAction extends FessApiAdminAction {
56  
57      @Resource
58      private ElevateWordService elevateWordService;
59  
60      @Resource
61      protected SuggestHelper suggestHelper;
62  
63      // GET /api/admin/elevateword
64      // POST /api/admin/elevateword
65      @Execute
66      public JsonResponse<ApiResult> settings(final SearchBody body) {
67          validateApi(body, messages -> {});
68          final ElevateWordPager pager = copyBeanToNewBean(body, ElevateWordPager.class);
69          final List<ElevateWord> list = elevateWordService.getElevateWordList(pager);
70          return asJson(
71                  new ApiResult.ApiConfigsResponse<EditBody>().settings(list.stream().map(this::createEditBody).collect(Collectors.toList()))
72                          .total(pager.getAllRecordCount()).status(ApiResult.Status.OK).result());
73      }
74  
75      // GET /api/admin/elevateword/{id}
76      @Execute
77      public JsonResponse<ApiResult> get$setting(final String id) {
78  
79          final ElevateWord entity = elevateWordService.getElevateWord(id).orElseGet(() -> {
80              throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
81              return null;
82          });
83  
84          final EditBody body = createEditBody(entity);
85          final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
86          body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
87                  .filter(StringUtil::isNotBlank).distinct().collect(Collectors.joining("\n")));
88          return asJson(new ApiResult.ApiConfigResponse().setting(body).status(ApiResult.Status.OK).result());
89      }
90  
91      // PUT /api/admin/elevateword/setting
92      @Execute
93      public JsonResponse<ApiResult> put$setting(final CreateBody body) {
94          validateApi(body, messages -> {});
95          body.crudMode = CrudMode.CREATE;
96          final ElevateWord entity = getElevateWord(body).orElseGet(() -> {
97              throwValidationErrorApi(messages -> {
98                  messages.addErrorsCrudFailedToCreateInstance(GLOBAL);
99              });
100             return null;
101         });
102         try {
103             elevateWordService.store(entity);
104             suggestHelper.addElevateWord(entity.getSuggestWord(), entity.getReading(), entity.getLabelTypeValues(), entity.getPermissions(),
105                     entity.getBoost(), false);
106         } catch (final Exception e) {
107             throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)));
108         }
109         return asJson(new ApiResult.ApiUpdateResponse().id(entity.getId()).created(true).status(ApiResult.Status.OK).result());
110     }
111 
112     // POST /api/admin/elevateword/setting
113     @Execute
114     public JsonResponse<ApiResult> post$setting(final EditBody body) {
115         validateApi(body, messages -> {});
116         body.crudMode = CrudMode.EDIT;
117         final ElevateWord elevateWord = getElevateWord(body).map(entity -> {
118             try {
119                 elevateWordService.store(entity);
120                 suggestHelper.deleteAllElevateWord(false);
121                 suggestHelper.storeAllElevateWords(false);
122             } catch (final Exception e) {
123                 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)));
124             }
125             return entity;
126         }).orElseGet(() -> {
127             throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, body.id));
128             return null;
129         });
130 
131         return asJson(new ApiUpdateResponse().id(elevateWord.getId()).created(false).status(Status.OK).result());
132     }
133 
134     // DELETE /api/admin/elevateword/setting/{id}
135     @Execute
136     public JsonResponse<ApiResult> delete$setting(final String id) {
137         try {
138             elevateWordService.getElevateWord(id).ifPresent(entity -> {
139                 try {
140                     elevateWordService.delete(entity);
141                     suggestHelper.deleteElevateWord(entity.getSuggestWord(), false);
142                     saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
143                 } catch (final Exception e) {
144                     throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
145                 }
146             }).orElse(() -> {
147                 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
148             });
149         } catch (final Exception e) {
150             throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
151         }
152         return asJson(new ApiResult.ApiUpdateResponse().id(id).created(false).status(ApiResult.Status.OK).result());
153     }
154 
155     // POST /api/admin/elevateword/upload
156     @Execute
157     public JsonResponse<ApiResult> post$upload(final UploadForm body) {
158         validateApi(body, messages -> {});
159         CommonPoolUtil.execute(() -> {
160             try (Reader reader = new BufferedReader(new InputStreamReader(body.elevateWordFile.getInputStream(), getCsvEncoding()))) {
161                 elevateWordService.importCsv(reader);
162                 suggestHelper.storeAllElevateWords(false);
163             } catch (final Exception e) {
164                 throw new FessSystemException("Failed to import data.", e);
165             }
166         });
167         return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result());
168     }
169 
170     // GET /api/admin/elevateword/download
171     @Execute
172     public StreamResponse get$download(final DownloadBody body) {
173         validateApi(body, messages -> {});
174         return asStream("elevate.csv").contentTypeOctetStream().stream(out -> {
175             final Path tempFile = ComponentUtil.getSystemHelper().createTempFile("fess-elevate-", ".csv").toPath();
176             try {
177                 try (Writer writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(tempFile), getCsvEncoding()))) {
178                     elevateWordService.exportCsv(writer);
179                 } catch (final Exception e) {
180                     throwValidationErrorApi(messages -> messages.addErrorsFailedToDownloadElevateFile(GLOBAL));
181                 }
182                 try (InputStream in = Files.newInputStream(tempFile)) {
183                     out.write(in);
184                 }
185             } finally {
186                 Files.delete(tempFile);
187             }
188         });
189     }
190 
191     protected EditBody createEditBody(final ElevateWord entity) {
192         final EditBody body = new EditBody();
193         copyBeanToBean(entity, body, copyOp -> {
194             copyOp.excludeNull();
195             copyOp.exclude(Constants.PERMISSIONS);
196         });
197         final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
198         body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
199                 .filter(StringUtil::isNotBlank).distinct().collect(Collectors.joining("\n")));
200         return body;
201     }
202 
203     private String getCsvEncoding() {
204         return fessConfig.getCsvFileEncoding();
205     }
206 
207 }