Skip to content

Commit

Permalink
refactor: auth provider sorting logic for better maintainability and …
Browse files Browse the repository at this point in the history
…clarity
  • Loading branch information
guqing committed Oct 12, 2024
1 parent 6d149ae commit f18c389
Show file tree
Hide file tree
Showing 8 changed files with 281 additions and 100 deletions.
13 changes: 9 additions & 4 deletions api/src/main/java/run/halo/app/core/extension/AuthProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.springframework.lang.NonNull;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK;

Expand Down Expand Up @@ -55,19 +57,22 @@ public static class AuthProviderSpec {
/**
* Auth type: form or oauth2.
*/
private AuthType authType;
@Getter(onMethod_ = @NonNull)
private AuthType authType = AuthType.OTHER;

private String bindingUrl;

private String unbindUrl;

private int priority;

@Schema(requiredMode = NOT_REQUIRED)
private SettingRef settingRef;

@Schema(requiredMode = NOT_REQUIRED)
private ConfigMapRef configMapRef;

public void setAuthType(AuthType authType) {
this.authType = (authType == null ? AuthType.OTHER : authType);
}
}

@Data
Expand All @@ -90,6 +95,6 @@ public static class ConfigMapRef {
public enum AuthType {
FORM,
OAUTH2,
;
OTHER;
}
}
61 changes: 59 additions & 2 deletions api/src/main/java/run/halo/app/infra/SystemSetting.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package run.halo.app.infra;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.List;
import java.util.Objects;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.boot.convert.ApplicationConversionService;
import org.springframework.util.Assert;
import run.halo.app.extension.ConfigMap;
import run.halo.app.infra.utils.JsonUtils;

Expand Down Expand Up @@ -113,7 +117,60 @@ public static class Menu {
@Data
public static class AuthProvider {
public static final String GROUP = "authProvider";
private Set<String> enabled;
private List<GroupedAuthProviderState> groupedStates;

/**
* Update provider enabled state by group name and provider name.
*/
public void updateProviderState(String groupName, String name, boolean enabled) {
if (groupedStates == null) {
groupedStates = new ArrayList<>();
}
var groupedState = groupedStates.stream()
.filter(grouped -> Objects.equals(grouped.group(), groupName))
.findFirst()
.orElseGet(() -> {
var newGroup = new GroupedAuthProviderState(groupName, new ArrayList<>());
groupedStates.add(newGroup);
return newGroup;
});

var providerStateOpt = groupedState.providers().stream()
.filter(providerState -> Objects.equals(providerState.getName(), name))
.findFirst();

if (providerStateOpt.isPresent()) {
providerStateOpt.get().setEnabled(enabled);
} else {
groupedState.providers().add(AuthProviderState.of(name, enabled));
}
}
}

public record GroupedAuthProviderState(String group, List<AuthProviderState> providers) {
/**
* Ensure group name is uppercase.
*/
public GroupedAuthProviderState {
Assert.notNull(group, "Group must not be null");
group = group.toUpperCase();
if (providers == null) {
providers = new ArrayList<>();
}
}
}

@Data
@Accessors(chain = true)
public static class AuthProviderState {
private String name;
private boolean enabled;

public static AuthProviderState of(String name, boolean enabled) {
return new AuthProviderState()
.setName(name)
.setEnabled(enabled);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import run.halo.app.core.extension.AuthProvider;
import run.halo.app.extension.ConfigMap;
import run.halo.app.infra.InitializationStateGetter;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
Expand Down Expand Up @@ -124,6 +125,7 @@ private void handleBasicSetting(GlobalInfo info, ConfigMap configMap) {

private Mono<Void> handleSocialAuthProvider(GlobalInfo info) {
return authProviderService.listAll()
.mapNotNull(provider -> provider.get(AuthProvider.AuthType.OAUTH2.name()))
.map(listedAuthProviders -> listedAuthProviders.stream()
.filter(provider -> isTrue(provider.getEnabled()))
.filter(provider -> StringUtils.isNotBlank(provider.getBindingUrl()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public interface AuthProviderService {

Mono<AuthProvider> disable(String name);

Mono<List<ListedAuthProvider>> listAll();
Mono<TypeGroupedAuthProvider> listAll();

Flux<AuthProvider> getEnabledProviders();

Expand Down
Loading

0 comments on commit f18c389

Please sign in to comment.