XuqmGroup-Server/tenant-service/src/main/java/com/xuqm/tenant/service/AppService.java

125 行
4.8 KiB
Java

package com.xuqm.tenant.service;
import com.xuqm.common.exception.BusinessException;
import com.xuqm.tenant.dto.CreateAppRequest;
import com.xuqm.tenant.entity.AppEntity;
import com.xuqm.tenant.repository.AppRepository;
import org.springframework.stereotype.Service;
import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Service
public class AppService {
private final AppRepository appRepository;
private final OperationLogService operationLogService;
private static final SecureRandom random = new SecureRandom();
public AppService(AppRepository appRepository, OperationLogService operationLogService) {
this.appRepository = appRepository;
this.operationLogService = operationLogService;
}
public List<AppEntity> listByTenant(String tenantId) {
return appRepository.findByTenantId(tenantId);
}
public AppEntity getByAppKey(String appKey, String tenantId) {
AppEntity app = appRepository.findByAppKey(appKey)
.orElseThrow(() -> new BusinessException(404, "应用不存在"));
if (!app.getTenantId().equals(tenantId)) {
throw new BusinessException(403, "无权访问该应用");
}
return app;
}
public AppEntity create(String tenantId, CreateAppRequest req) {
if (appRepository.existsByPackageNameAndTenantId(req.packageName(), tenantId)) {
throw new BusinessException("该包名下已存在同名应用");
}
AppEntity app = new AppEntity();
app.setId(UUID.randomUUID().toString());
app.setTenantId(tenantId);
app.setPackageName(req.packageName());
app.setIosBundleId(req.iosBundleId());
app.setHarmonyBundleName(req.harmonyBundleName());
app.setName(req.name());
app.setDescription(req.description());
app.setIconUrl(req.iconUrl());
app.setAppKey(generateAppKey());
app.setAppSecret(generateSecret());
app.setCreatedAt(LocalDateTime.now());
AppEntity saved = appRepository.save(app);
operationLogService.record(tenantId, "APP", "APP", saved.getAppKey(), "CREATE_APP", Map.of(
"name", saved.getName(),
"packageName", saved.getPackageName(),
"appKey", saved.getAppKey()
));
return saved;
}
public AppEntity update(String appKey, String tenantId, CreateAppRequest req) {
AppEntity app = getByAppKey(appKey, tenantId);
Map<String, Object> before = new LinkedHashMap<>();
before.put("name", app.getName());
before.put("packageName", app.getPackageName());
before.put("description", app.getDescription());
before.put("iconUrl", app.getIconUrl());
app.setIosBundleId(req.iosBundleId());
app.setHarmonyBundleName(req.harmonyBundleName());
app.setName(req.name());
app.setDescription(req.description());
app.setIconUrl(req.iconUrl());
AppEntity saved = appRepository.save(app);
Map<String, Object> after = new LinkedHashMap<>();
after.put("name", saved.getName());
after.put("packageName", saved.getPackageName());
after.put("description", saved.getDescription());
after.put("iconUrl", saved.getIconUrl());
operationLogService.record(tenantId, "APP", "APP", saved.getAppKey(), "UPDATE_APP", Map.of(
"before", before,
"after", after
));
return saved;
}
public void delete(String appKey, String tenantId) {
AppEntity app = getByAppKey(appKey, tenantId);
appRepository.delete(app);
operationLogService.record(tenantId, "APP", "APP", app.getAppKey(), "DELETE_APP", Map.of(
"name", app.getName(),
"packageName", app.getPackageName(),
"appKey", app.getAppKey()
));
}
public String resetSecret(String appKey, String tenantId) {
AppEntity app = getByAppKey(appKey, tenantId);
String newSecret = generateSecret();
app.setAppSecret(newSecret);
appRepository.save(app);
operationLogService.record(tenantId, "APP", "APP_SECRET", app.getAppKey(), "RESET_APP_SECRET", Map.of(
"name", app.getName(),
"packageName", app.getPackageName(),
"appKey", app.getAppKey()
));
return newSecret;
}
private String generateAppKey() {
return "ak_" + UUID.randomUUID().toString().replace("-", "").substring(0, 24);
}
private String generateSecret() {
byte[] bytes = new byte[32];
random.nextBytes(bytes);
return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
}
}