1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.web.api.admin.fileconfig;
17
18 import static org.codelibs.core.stream.StreamUtil.stream;
19 import static org.codelibs.fess.app.web.admin.fileconfig.AdminFileconfigAction.getFileConfig;
20
21 import java.util.List;
22 import java.util.stream.Collectors;
23
24 import org.apache.logging.log4j.LogManager;
25 import org.apache.logging.log4j.Logger;
26 import org.codelibs.core.lang.StringUtil;
27 import org.codelibs.fess.Constants;
28 import org.codelibs.fess.app.pager.FileConfigPager;
29 import org.codelibs.fess.app.service.FileConfigService;
30 import org.codelibs.fess.app.web.CrudMode;
31 import org.codelibs.fess.app.web.api.ApiResult;
32 import org.codelibs.fess.app.web.api.ApiResult.ApiConfigResponse;
33 import org.codelibs.fess.app.web.api.ApiResult.ApiResponse;
34 import org.codelibs.fess.app.web.api.ApiResult.ApiUpdateResponse;
35 import org.codelibs.fess.app.web.api.ApiResult.Status;
36 import org.codelibs.fess.app.web.api.admin.FessApiAdminAction;
37 import org.codelibs.fess.helper.PermissionHelper;
38 import org.codelibs.fess.opensearch.config.exentity.FileConfig;
39 import org.codelibs.fess.util.ComponentUtil;
40 import org.lastaflute.web.Execute;
41 import org.lastaflute.web.response.JsonResponse;
42
43 import jakarta.annotation.Resource;
44
45
46
47
48
49
50
51 public class ApiAdminFileconfigAction extends FessApiAdminAction {
52
53 private static final Logger logger = LogManager.getLogger(ApiAdminFileconfigAction.class);
54
55
56
57
58
59
60
61 public ApiAdminFileconfigAction() {
62 super();
63 }
64
65
66
67
68
69 @Resource
70 private FileConfigService fileConfigService;
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 @Execute
86 public JsonResponse<ApiResult> settings(final SearchBody body) {
87 validateApi(body, messages -> {});
88 final FileConfigPager pager = copyBeanToNewBean(body, FileConfigPager.class);
89 final List<FileConfig> list = fileConfigService.getFileConfigList(pager);
90 return asJson(
91 new ApiResult.ApiConfigsResponse<EditBody>().settings(list.stream().map(this::createEditBody).collect(Collectors.toList()))
92 .total(pager.getAllRecordCount())
93 .status(ApiResult.Status.OK)
94 .result());
95 }
96
97
98
99
100
101
102
103
104 @Execute
105 public JsonResponse<ApiResult> get$setting(final String id) {
106 return asJson(new ApiConfigResponse().setting(fileConfigService.getFileConfig(id).map(this::createEditBody).orElseGet(() -> {
107 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
108 return null;
109 })).status(Status.OK).result());
110 }
111
112
113
114
115
116
117
118
119 @Execute
120 public JsonResponse<ApiResult> post$setting(final CreateBody body) {
121 validateApi(body, messages -> {});
122 body.crudMode = CrudMode.CREATE;
123 final FileConfig fileConfig = getFileConfig(body).map(entity -> {
124 try {
125 fileConfigService.store(entity);
126 } catch (final Exception e) {
127 logger.warn("Failed to process a request.", e);
128 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)));
129 }
130 return entity;
131 }).orElseGet(() -> {
132 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL));
133 return null;
134 });
135
136 return asJson(new ApiUpdateResponse().id(fileConfig.getId()).created(true).status(Status.OK).result());
137 }
138
139
140
141
142
143
144
145
146 @Execute
147 public JsonResponse<ApiResult> put$setting(final EditBody body) {
148 validateApi(body, messages -> {});
149 body.crudMode = CrudMode.EDIT;
150 final FileConfig fileConfig = getFileConfig(body).map(entity -> {
151 try {
152 fileConfigService.store(entity);
153 } catch (final Exception e) {
154 logger.warn("Failed to process a request.", e);
155 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)));
156 }
157 return entity;
158 }).orElseGet(() -> {
159 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, body.id));
160 return null;
161 });
162 return asJson(new ApiUpdateResponse().id(fileConfig.getId()).created(false).status(Status.OK).result());
163 }
164
165
166
167
168
169
170
171
172 @Execute
173 public JsonResponse<ApiResult> delete$setting(final String id) {
174 fileConfigService.getFileConfig(id).ifPresent(entity -> {
175 try {
176 fileConfigService.delete(entity);
177 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
178 } catch (final Exception e) {
179 logger.warn("Failed to process a request.", e);
180 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
181 }
182 }).orElse(() -> {
183 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
184 });
185 return asJson(new ApiResponse().status(Status.OK).result());
186 }
187
188
189
190
191
192
193
194
195 protected EditBody createEditBody(final FileConfig entity) {
196 final EditBody body = new EditBody();
197 copyBeanToBean(entity, body, copyOp -> {
198 copyOp.excludeNull();
199 copyOp.exclude(Constants.PERMISSIONS, Constants.VIRTUAL_HOSTS);
200 });
201 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
202 body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
203 .filter(StringUtil::isNotBlank)
204 .distinct()
205 .collect(Collectors.joining("\n")));
206 body.virtualHosts = stream(entity.getVirtualHosts())
207 .get(stream -> stream.filter(StringUtil::isNotBlank).distinct().map(String::trim).collect(Collectors.joining("\n")));
208 return body;
209 }
210 }