package jnpf.base.controller; import cn.dev33.satoken.same.SaSameUtil; import cn.dev33.satoken.stp.StpUtil; import jnpf.base.ActionResult; import jnpf.base.UserInfo; import jnpf.base.model.uploadedit.UploadEditLease; import jnpf.base.model.uploadedit.UploadEditSaveCommand; import jnpf.base.service.UploadEditDraftService; import jnpf.database.util.TenantDataSourceUtil; import jnpf.exception.DataException; import jnpf.onlinedev.UploadEditApi; import jnpf.util.NoDataSourceBind; import jnpf.util.UserProvider; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.function.Supplier; @RestController @RequestMapping("/Internal/visualdev/upload-edit") @RequiredArgsConstructor public class UploadEditInternalController implements UploadEditApi { private final UploadEditDraftService service; @Override @PostMapping("/status-access") @NoDataSourceBind public ActionResult canReadStatus(@RequestParam("tenantId") String tenantId, @RequestParam("ownerId") String ownerId, @RequestParam("leaseId") String leaseId) { return asOwner(tenantId, ownerId, () -> ActionResult.success(service.canReadStatus(tenantId, ownerId, leaseId))); } @Override @PostMapping("/lease") @NoDataSourceBind public ActionResult lease(@RequestParam("tenantId") String tenantId, @RequestParam("ownerId") String ownerId, @RequestParam("leaseId") String leaseId) { return asOwner(tenantId, ownerId, () -> ActionResult.success(service.lease(tenantId, ownerId, leaseId))); } @Override @PostMapping("/save") @NoDataSourceBind public ActionResult save(@RequestBody UploadEditSaveCommand command) { return asOwner(command.getTenantId(), command.getOwnerId(), () -> ActionResult.success(service.save(command))); } private T asOwner(String tenantId, String ownerId, Supplier work) { SaSameUtil.checkCurrentRequestToken(); if (tenantId == null || tenantId.isBlank() || ownerId == null || ownerId.isBlank()) throw new DataException("缺少编辑租约归属"); UserInfo previous = UserProvider.getLocalLoginUser(); boolean switched = false; try { TenantDataSourceUtil.switchTenant(tenantId); UserInfo owner = new UserInfo(); owner.setUserId(ownerId); owner.setTenantId(tenantId); UserProvider.setLocalLoginUser(owner); StpUtil.switchTo(UserProvider.splicingLoginId(ownerId)); switched = true; return work.get(); } finally { if (switched) StpUtil.endSwitch(); UserProvider.clearLocalUser(); if (previous != null) UserProvider.setLocalLoginUser(previous); TenantDataSourceUtil.clearLocalTenantInfo(); } } }