feat: add oauth2 app api

This commit is contained in:
vran
2022-03-02 20:00:12 +08:00
parent 7303d4d840
commit 57fbdbbd22
20 changed files with 322 additions and 21 deletions

View File

@@ -24,7 +24,8 @@ public enum DomainErrors implements DatabasirErrors {
CANNOT_UPDATE_SELF_ROLE("A_10009", "无法对自己执行角色变更的操作"),
UPDATE_PASSWORD_CONFIRM_FAILED("A_10010", "两次密码输入不一致"),
ORIGIN_PASSWORD_NOT_CORRECT("A_10011", "原密码不正确"),
INVALID_CRON_EXPRESSION("A_10012", "不合法的 cron 表达式");
INVALID_CRON_EXPRESSION("A_10012", "不合法的 cron 表达式"),
REGISTRATION_ID_DUPLICATE("A_10013", "应用注册 ID 不能重复");
private final String errCode;

View File

@@ -1,18 +1,27 @@
package com.databasir.core.infrastructure.oauth2;
package com.databasir.core.domain.app;
import com.databasir.core.domain.DomainErrors;
import com.databasir.core.domain.app.converter.OAuthAppPojoConverter;
import com.databasir.core.domain.app.converter.OAuthAppResponseConverter;
import com.databasir.core.domain.app.data.*;
import com.databasir.core.domain.app.handler.OAuthHandler;
import com.databasir.core.domain.app.handler.OAuthProcessContext;
import com.databasir.core.domain.app.handler.OAuthProcessResult;
import com.databasir.core.domain.user.data.UserCreateRequest;
import com.databasir.core.domain.user.data.UserDetailResponse;
import com.databasir.core.domain.user.service.UserService;
import com.databasir.core.infrastructure.oauth2.converter.OAuthAppResponseConverter;
import com.databasir.core.infrastructure.oauth2.data.OAuthAppResponse;
import com.databasir.dao.impl.OAuthAppDao;
import com.databasir.dao.tables.pojos.OauthAppPojo;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -28,6 +37,8 @@ public class OAuthAppService {
private final OAuthAppResponseConverter oAuthAppResponseConverter;
private final OAuthAppPojoConverter oAuthAppPojoConverter;
public UserDetailResponse oauthCallback(String registrationId, Map<String, String[]> params) {
// match handler
@@ -66,4 +77,35 @@ public class OAuthAppService {
.collect(Collectors.toList());
}
public void deleteById(Integer id) {
if (oAuthAppDao.existsById(id)) {
oAuthAppDao.deleteById(id);
}
}
public void updateById(OAuthAppUpdateRequest request) {
OauthAppPojo pojo = oAuthAppPojoConverter.of(request);
try {
oAuthAppDao.updateById(pojo);
} catch (DuplicateKeyException e) {
throw DomainErrors.REGISTRATION_ID_DUPLICATE.exception();
}
}
public Integer create(OAuthAppCreateRequest request) {
OauthAppPojo pojo = oAuthAppPojoConverter.of(request);
try {
return oAuthAppDao.insertAndReturnId(pojo);
} catch (DuplicateKeyException e) {
throw DomainErrors.REGISTRATION_ID_DUPLICATE.exception();
}
}
public Page<OAuthAppPageResponse> listPage(Pageable page, OAuthAppPageCondition condition) {
return oAuthAppDao.selectByPage(page, condition.toCondition()).map(oAuthAppPojoConverter::toPageResponse);
}
public Optional<OAuthAppDetailResponse> getOne(Integer id) {
return oAuthAppDao.selectOptionalById(id).map(oAuthAppPojoConverter::toDetailResponse);
}
}

View File

@@ -0,0 +1,26 @@
package com.databasir.core.domain.app.converter;
import com.databasir.core.domain.app.data.OAuthAppCreateRequest;
import com.databasir.core.domain.app.data.OAuthAppDetailResponse;
import com.databasir.core.domain.app.data.OAuthAppPageResponse;
import com.databasir.core.domain.app.data.OAuthAppUpdateRequest;
import com.databasir.dao.tables.pojos.OauthAppPojo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring")
public interface OAuthAppPojoConverter {
@Mapping(target = "id", ignore = true)
@Mapping(target = "createAt", ignore = true)
@Mapping(target = "updateAt", ignore = true)
OauthAppPojo of(OAuthAppCreateRequest request);
@Mapping(target = "createAt", ignore = true)
@Mapping(target = "updateAt", ignore = true)
OauthAppPojo of(OAuthAppUpdateRequest request);
OAuthAppPageResponse toPageResponse(OauthAppPojo pojo);
OAuthAppDetailResponse toDetailResponse(OauthAppPojo pojo);
}

View File

@@ -1,6 +1,6 @@
package com.databasir.core.infrastructure.oauth2.converter;
package com.databasir.core.domain.app.converter;
import com.databasir.core.infrastructure.oauth2.data.OAuthAppResponse;
import com.databasir.core.domain.app.data.OAuthAppResponse;
import com.databasir.dao.tables.pojos.OauthAppPojo;
import org.mapstruct.Mapper;

View File

@@ -0,0 +1,35 @@
package com.databasir.core.domain.app.data;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class OAuthAppCreateRequest {
@NotNull
private String registrationId;
@NotBlank
private String appName;
@NotBlank
private String appType;
private String appIcon;
@NotBlank
private String authUrl;
@NotBlank
private String resourceUrl;
@NotBlank
private String clientId;
@NotBlank
private String clientSecret;
private String scope;
}

View File

@@ -0,0 +1,31 @@
package com.databasir.core.domain.app.data;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class OAuthAppDetailResponse {
private Integer id;
private String appName;
private String appIcon;
private String appType;
private String registrationId;
private String clientId;
private String clientSecret;
private String authUrl;
private String resourceUrl;
private LocalDateTime updateAt;
private LocalDateTime createAt;
}

View File

@@ -0,0 +1,30 @@
package com.databasir.core.domain.app.data;
import com.databasir.dao.Tables;
import lombok.Data;
import org.jooq.Condition;
import org.jooq.impl.DSL;
import java.util.ArrayList;
import java.util.List;
@Data
public class OAuthAppPageCondition {
private String appNameContains;
private String appType;
public Condition toCondition() {
List<Condition> conditions = new ArrayList<>();
if (appNameContains != null && !appNameContains.trim().equals("")) {
conditions.add(Tables.OAUTH_APP.APP_NAME.contains(appNameContains));
}
if (appType != null) {
conditions.add(Tables.OAUTH_APP.APP_TYPE.eq(appType));
}
return conditions.stream()
.reduce(Condition::and)
.orElse(DSL.trueCondition());
}
}

View File

@@ -0,0 +1,30 @@
package com.databasir.core.domain.app.data;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class OAuthAppPageResponse {
private Integer id;
private String appName;
private String appIcon;
private String appType;
private String registrationId;
private String clientId;
private String authUrl;
private String resourceUrl;
private LocalDateTime updateAt;
private LocalDateTime createAt;
}

View File

@@ -1,4 +1,4 @@
package com.databasir.core.infrastructure.oauth2.data;
package com.databasir.core.domain.app.data;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@@ -0,0 +1,39 @@
package com.databasir.core.domain.app.data;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class OAuthAppUpdateRequest {
@NotNull
private Integer id;
@NotBlank
private String registrationId;
@NotBlank
private String appName;
@NotBlank
private String appType;
private String appIcon;
@NotBlank
private String authUrl;
@NotBlank
private String resourceUrl;
@NotBlank
private String clientId;
@NotBlank
private String clientSecret;
private String scope;
}

View File

@@ -1,4 +1,4 @@
package com.databasir.core.infrastructure.oauth2.exception;
package com.databasir.core.domain.app.exception;
import com.databasir.common.DatabasirException;
import org.springframework.security.core.AuthenticationException;

View File

@@ -1,8 +1,8 @@
package com.databasir.core.infrastructure.oauth2;
package com.databasir.core.domain.app.handler;
import com.databasir.core.domain.DomainErrors;
import com.databasir.core.infrastructure.oauth2.exception.DatabasirAuthenticationException;
import com.databasir.core.domain.app.exception.DatabasirAuthenticationException;
import com.databasir.core.infrastructure.remote.github.GithubRemoteService;
import com.databasir.dao.enums.OAuthAppType;
import com.databasir.dao.impl.OAuthAppDao;

View File

@@ -1,4 +1,4 @@
package com.databasir.core.infrastructure.oauth2;
package com.databasir.core.domain.app.handler;
public interface OAuthHandler {

View File

@@ -1,4 +1,4 @@
package com.databasir.core.infrastructure.oauth2;
package com.databasir.core.domain.app.handler;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@@ -1,4 +1,4 @@
package com.databasir.core.infrastructure.oauth2;
package com.databasir.core.domain.app.handler;
import lombok.Data;