Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to specify "requires managed account" for Account Scaffold API #923

Merged
merged 3 commits into from
Nov 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ private ModelAndView createGetApiKey(
ModelAndView mv = new ModelAndView();

if (htmxRequest) {
mv.setViewName("pages/api-key-details");
mv.setViewName("api-key-details/page");
} else {
mv.setViewName("index");
mv.addObject("page", "pages/api-key-details");
mv.addObject("page", "api-key-details/page");
}

mv.addObject("apiKey", apiKey);
Expand All @@ -96,7 +96,7 @@ private void loadApiKeySettingsInfo(ModelAndView mv, UUID apiKeyId) {
"settings_description",
"Set the super group types from which the information will be query from");
mv.addObject(
"settings_form", new ApiKeySettingsForm(settings.version(), settings.superGroupTypes()));
"settings_form", new InfoApiKeySettings(settings.version(), settings.superGroupTypes()));
}

private void loadApiKeySettingsAccountScaffold(ModelAndView mv, UUID apiKeyId) {
Expand All @@ -107,13 +107,20 @@ private void loadApiKeySettingsAccountScaffold(ModelAndView mv, UUID apiKeyId) {
"settings_description",
"Set the super group types from which the information will query from");
mv.addObject(
"settings_form", new ApiKeySettingsForm(settings.version(), settings.superGroupTypes()));
"settings_form",
new AccountScaffoldApiKeySettings(
settings.version(),
settings.superGroupTypes().stream()
.map(
type ->
new AccountScaffoldType(type.type(), type.requiresManaged() ? "on" : "off"))
.toList()));
}

private ModelAndView createApiKeyNotFound(String apiKeyId, boolean htmxRequest) {
ModelAndView mv = new ModelAndView();
if (htmxRequest) {
mv.setViewName("pages/api-key-not-found");
mv.setViewName("api-key-details/not-found");
} else {
mv.setViewName("index");
mv.addObject("page", "pages/api-key-not-found");
Expand All @@ -124,8 +131,6 @@ private ModelAndView createApiKeyNotFound(String apiKeyId, boolean htmxRequest)
return mv;
}

public record ApiKeySettingsForm(int version, List<String> superGroupTypes) {}

@GetMapping("/api-keys/{id}")
public ModelAndView getApiKey(
@RequestHeader(value = "HX-Request", required = false) boolean htmxRequest,
Expand Down Expand Up @@ -212,10 +217,73 @@ public ModelAndView deleteApiKey(
return new ModelAndView("common/empty");
}

public static final class ApiKeySettings {
public static class AccountScaffoldType {
public String type;
public String requiresManaged;

public AccountScaffoldType() {}

public AccountScaffoldType(String type, String requiresManaged) {
this.type = type;
this.requiresManaged = requiresManaged;
}

public String getRequiresManaged() {
return requiresManaged;
}

public void setRequiresManaged(String requiresManaged) {
this.requiresManaged = requiresManaged;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}

public static final class AccountScaffoldApiKeySettings {
public List<AccountScaffoldType> superGroupTypes = new ArrayList<>();
public int version;

public AccountScaffoldApiKeySettings() {}

public AccountScaffoldApiKeySettings(int version, List<AccountScaffoldType> types) {
this.version = version;
this.superGroupTypes = types;
}

public List<AccountScaffoldType> getSuperGroupTypes() {
return superGroupTypes;
}

public void setSuperGroupTypes(List<AccountScaffoldType> superGroupTypes) {
this.superGroupTypes = superGroupTypes;
}

public int getVersion() {
return version;
}

public void setVersion(int version) {
this.version = version;
}
}

public static final class InfoApiKeySettings {
public List<String> superGroupTypes = new ArrayList<>();
public int version;

public InfoApiKeySettings() {}

public InfoApiKeySettings(int version, List<String> types) {
this.version = version;
this.superGroupTypes = types;
}

public List<String> getSuperGroupTypes() {
return superGroupTypes;
}
Expand All @@ -233,12 +301,27 @@ public void setVersion(int version) {
}
}

@GetMapping("/api-keys/new-super-group")
public ModelAndView getNewSuperGroupType(
@GetMapping("/api-keys/new-super-group-type/info")
public ModelAndView getNewSuperGroupTypeInfo(
@RequestHeader(value = "HX-Request", required = true) boolean htmxRequest) {
ModelAndView mv = new ModelAndView();

mv.setViewName("api-key-details/new-type-to-info-settings");
mv.addObject(
"superGroupTypes",
this.superGroupFacade.getAllTypes().stream()
.sorted(Comparator.comparing(String::toLowerCase))
.toList());

return mv;
}

@GetMapping("/api-keys/new-super-group-type/account-scaffold")
public ModelAndView getNewSuperGroupTypeAccountScaffold(
@RequestHeader(value = "HX-Request", required = true) boolean htmxRequest) {
ModelAndView mv = new ModelAndView();

mv.setViewName("partial/new-super-group-type-to-api-settings");
mv.setViewName("api-key-details/new-type-to-account-scaffold-settings");
mv.addObject(
"superGroupTypes",
this.superGroupFacade.getAllTypes().stream()
Expand All @@ -248,11 +331,11 @@ public ModelAndView getNewSuperGroupType(
return mv;
}

@PutMapping("/api-keys/{apiKeyId}/settings")
public ModelAndView updateSettings(
@PutMapping("/api-keys/{apiKeyId}/account-scaffold-settings")
public ModelAndView updateAccountScaffoldSettings(
@RequestHeader(value = "HX-Request", required = false) boolean htmxRequest,
@PathVariable("apiKeyId") UUID apiKeyId,
ApiKeySettings form) {
AccountScaffoldApiKeySettings form) {

Optional<ApiKeyFacade.ApiKeyDTO> apiKeyMaybe = this.apiKeyFacade.getById(apiKeyId);

Expand All @@ -262,23 +345,49 @@ public ModelAndView updateSettings(

ApiKeyFacade.ApiKeyDTO apiKey = apiKeyMaybe.get();

ModelAndView mv = new ModelAndView("partial/api-key-super-group-types");
ModelAndView mv = new ModelAndView("api-key-details/account-scaffold-settings");

if (apiKey.keyType().equals("ACCOUNT_SCAFFOLD")) {
this.apiKeySettingsFacade.setAccountScaffoldSettings(
apiKeyId,
new ApiKeySettingsFacade.ApiKeySettingsAccountScaffoldDTO(
form.version, form.superGroupTypes));
this.apiKeySettingsFacade.setAccountScaffoldSettings(
apiKeyId,
new ApiKeySettingsFacade.ApiKeySettingsAccountScaffoldDTO(
form.version,
form.superGroupTypes.stream()
.map(
accountScaffoldType ->
new ApiKeySettingsFacade.AccountScaffoldTypeDTO(
accountScaffoldType.type,
"on".equals(accountScaffoldType.requiresManaged)))
.toList()));

loadApiKeySettingsAccountScaffold(mv, apiKey.id());
} else if (apiKey.keyType().equals("INFO")) {
this.apiKeySettingsFacade.setInfoSettings(
apiKeyId,
new ApiKeySettingsFacade.ApiKeySettingsInfoDTO(form.version, form.superGroupTypes));
loadApiKeySettingsAccountScaffold(mv, apiKey.id());

loadApiKeySettingsInfo(mv, apiKey.id());
mv.addObject("apiKeyId", apiKeyId);

return mv;
}

@PutMapping("/api-keys/{apiKeyId}/info-settings")
public ModelAndView updateInfoSettings(
@RequestHeader(value = "HX-Request", required = false) boolean htmxRequest,
@PathVariable("apiKeyId") UUID apiKeyId,
InfoApiKeySettings form) {

Optional<ApiKeyFacade.ApiKeyDTO> apiKeyMaybe = this.apiKeyFacade.getById(apiKeyId);

if (apiKeyMaybe.isEmpty()) {
throw new RuntimeException();
}

ApiKeyFacade.ApiKeyDTO apiKey = apiKeyMaybe.get();

ModelAndView mv = new ModelAndView("api-key-details/info-settings");

this.apiKeySettingsFacade.setInfoSettings(
apiKeyId,
new ApiKeySettingsFacade.ApiKeySettingsInfoDTO(form.version, form.superGroupTypes));

loadApiKeySettingsInfo(mv, apiKey.id());

mv.addObject("apiKeyId", apiKeyId);

return mv;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package it.chalmers.gamma.adapter.secondary.jpa.apikey.settings;

import it.chalmers.gamma.adapter.secondary.jpa.util.ImmutableEntity;
import jakarta.persistence.*;
import java.util.UUID;

@Entity
@Table(name = "g_api_key_account_scaffold_requires_managed")
public class AccountScaffoldRequiresManagedEntity
extends ImmutableEntity<AccountScaffoldRequiresManagedPK> {

@EmbeddedId AccountScaffoldRequiresManagedPK id;

protected AccountScaffoldRequiresManagedEntity() {}

protected AccountScaffoldRequiresManagedEntity(UUID settingsId, String type) {
this.id = new AccountScaffoldRequiresManagedPK(settingsId, type);
}

@Override
public AccountScaffoldRequiresManagedPK getId() {
return this.id;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package it.chalmers.gamma.adapter.secondary.jpa.apikey.settings;

import org.springframework.data.jpa.repository.JpaRepository;

public interface AccountScaffoldRequiresManagedJpaRepository
extends JpaRepository<AccountScaffoldRequiresManagedEntity, AccountScaffoldRequiresManagedPK> {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package it.chalmers.gamma.adapter.secondary.jpa.apikey.settings;

import it.chalmers.gamma.adapter.secondary.jpa.util.PKId;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import java.util.UUID;

@Embeddable
public class AccountScaffoldRequiresManagedPK
extends PKId<AccountScaffoldRequiresManagedPK.RequiresManagedPK> {

@Column(name = "settings_id", columnDefinition = "uuid")
private UUID settingsId;

@Column(name = "super_group_type_name")
private String type;

@Override
public RequiresManagedPK getValue() {
return new RequiresManagedPK(this.settingsId, this.type);
}

protected AccountScaffoldRequiresManagedPK() {}

protected AccountScaffoldRequiresManagedPK(UUID settingsId, String type) {
this.settingsId = settingsId;
this.type = type;
}

public record RequiresManagedPK(UUID settingsId, String type) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,18 @@ public class ApiKeySettingsRepositoryAdapter implements ApiKeySettingsRepository
private final ApiKeyJpaRepository apiKeyJpaRepository;
private final ApiKeySettingsJpaRepository apiKeySettingsJpaRepository;
private final SuperGroupTypeJpaRepository superGroupTypeJpaRepository;
private final AccountScaffoldRequiresManagedJpaRepository
accountScaffoldRequiresManagedJpaRepository;

public ApiKeySettingsRepositoryAdapter(
ApiKeyJpaRepository apiKeyJpaRepository,
ApiKeySettingsJpaRepository apiKeySettingsJpaRepository,
SuperGroupTypeJpaRepository superGroupTypeJpaRepository) {
SuperGroupTypeJpaRepository superGroupTypeJpaRepository,
AccountScaffoldRequiresManagedJpaRepository accountScaffoldRequiresManagedJpaRepository) {
this.apiKeyJpaRepository = apiKeyJpaRepository;
this.apiKeySettingsJpaRepository = apiKeySettingsJpaRepository;
this.superGroupTypeJpaRepository = superGroupTypeJpaRepository;
this.accountScaffoldRequiresManagedJpaRepository = accountScaffoldRequiresManagedJpaRepository;
}

@Override
Expand Down Expand Up @@ -80,7 +84,13 @@ public ApiKeyAccountScaffoldSettings getAccountScaffoldSettings(ApiKeyId apiKeyI
return new ApiKeyAccountScaffoldSettings(
apiKeySettingsEntity.getVersion(),
apiKeySettingsEntity.superGroupTypes.stream()
.map(ApiKeySettingsSuperGroupTypeEntity::getSuperGroupType)
.map(
entity ->
new ApiKeyAccountScaffoldSettings.Row(
entity.getSuperGroupType(),
this.accountScaffoldRequiresManagedJpaRepository.existsById(
new AccountScaffoldRequiresManagedPK(
apiKeySettingsEntity.id, entity.getSuperGroupType().value()))))
.toList());
}

Expand Down Expand Up @@ -122,9 +132,21 @@ public void setAccountScaffoldSettings(
superGroupType ->
new ApiKeySettingsSuperGroupTypeEntity(
apiKeySettingsEntity,
superGroupTypeJpaRepository.getReferenceById(superGroupType.value())))
superGroupTypeJpaRepository.getReferenceById(
superGroupType.type().value())))
.toList());

for (var row : settings.superGroupTypes()) {
var pk = new AccountScaffoldRequiresManagedPK(apiKeySettingsEntity.id, row.type().value());
var superGroupTypeRequiresManagedOptional = accountScaffoldRequiresManagedJpaRepository.findById(pk);
if (row.requiresManaged() && superGroupTypeRequiresManagedOptional.isEmpty()) {
accountScaffoldRequiresManagedJpaRepository.save(
new AccountScaffoldRequiresManagedEntity(apiKeySettingsEntity.id, row.type().value()));
} else if (!row.requiresManaged() && superGroupTypeRequiresManagedOptional.isPresent()) {
accountScaffoldRequiresManagedJpaRepository.deleteById(pk);
}
}

apiKeySettingsEntity.increaseVersion(settings.version());

this.apiKeySettingsJpaRepository.save(apiKeySettingsEntity);
Expand Down
Loading