删本地哑管道,加 yh-appearance-spring-boot-starter(BOM 管版本,YschOpenCall 走聚合包)。端点同 URL /api/appearance 同语义:三态 proxy/local/off,503 直写 铁律内置(f84ce9c 线上修复的等价实现)。工作区他人 WIP(application.yml/ ServiceApplyFlowSubmitTest)未混入,择迹提交。
This commit is contained in:
@@ -50,6 +50,14 @@
|
||||
<groupId>com.yunhai.platform</groupId>
|
||||
<artifactId>yh-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
<!-- 外观偏好同源读端点 GET /api/appearance(三态 proxy/local/off,默认 proxy 经 YschOpenCall
|
||||
代理 UserHome /oapi/appearance,userhome 地址走平台 application-platform.yml 兜底)。
|
||||
平台件不进聚合包:本地同名控制器已删(2026-10-12 任务 E 收敛,starter 端点同 URL 同语义,
|
||||
含「503 改 sendError 直写」线上修复的等价实现) -->
|
||||
<dependency>
|
||||
<groupId>com.yunhai.platform</groupId>
|
||||
<artifactId>yh-appearance-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 流程中心回调接收端 starter(2026-09-20 迁移):X-Flw 验签 + 幂等/乱序门/同事务推进
|
||||
+ 登记注册器组件化,业务映射见 SvcFlowCallbackHandler -->
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
package com.yunhai.svchall.controller.api;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.yunhai.platform.openapi.core.YschOpenCall;
|
||||
import com.yunhai.platform.utils.model.BoaUser;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 外观偏好同源读代理(oapi 代理轮 2026-10-08,全端统一形态)。
|
||||
*
|
||||
* <p>浏览器(通道 init 异步段)只与本应用【同源】取数——CAS 会话天然有效,无需 iframe 引导;
|
||||
* 后端经 open-gateway 签名直调 UserHome(target=userhome,寻址走 yh.open.services,
|
||||
* 勿写死 host)。设置入口收敛在 UserHome 设置中心,本端点【只读不写】。</p>
|
||||
*
|
||||
* <p>契约 = UserHome /oapi/appearance 出参【整体透传】(JsonNode 哑管道):字段加减只在
|
||||
* UserHome + 通道 init 两端演进,本应用零改动。现行字段 {@code {theme, avatar, logoUrl}}——
|
||||
* theme/avatar 为服务端合成后的【生效值】(个人→学校→平台级联,不拆 my/sch);
|
||||
* null=未配置,init 侧清对应本地键回落默认观感。</p>
|
||||
*
|
||||
* <p>降级铁律:UserHome/网关不可达时【必须】以非 2xx 返回(503),绝不能伪装成 200+全 null——
|
||||
* init 会把全 null 收敛成清键,等于 UserHome 停服一次就清空全员本地观感。</p>
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping(value = "/api")
|
||||
public class AppearanceProxyController {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AppearanceProxyController.class);
|
||||
|
||||
/** open_api_target 注册表中的 userhome;寻址 yh.call.targets → yh.open.services → 枚举兜底 */
|
||||
private static final String TARGET_USERHOME = "userhome";
|
||||
|
||||
private final YschOpenCall openCall;
|
||||
|
||||
public AppearanceProxyController(YschOpenCall openCall) {
|
||||
this.openCall = openCall;
|
||||
}
|
||||
|
||||
@GetMapping("appearance")
|
||||
public JsonNode appearance(BoaUser authUserWithDept, HttpServletResponse response) throws IOException {
|
||||
try {
|
||||
Map<String, String> q = new HashMap<>();
|
||||
q.put("userId", String.valueOf(authUserWithDept.getId())); // 服务端取登录人,不收前端参数
|
||||
return openCall.get(TARGET_USERHOME, "/oapi/appearance", q, JsonNode.class);
|
||||
} catch (Exception e) {
|
||||
// 降级铁律:sendError 直写 503 绕过 GlobalExceptionHandler(否则被兜成 200+code:6 信封)
|
||||
log.warn("[appearance] UserHome 外观偏好不可达(503,init 侧静默不动本地键)userId={}:{}",
|
||||
authUserWithDept.getId(), e.toString());
|
||||
response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "appearance unavailable");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user