Skip to content

Commit

Permalink
Add option to specify "requires managed account" for Account Scaffold…
Browse files Browse the repository at this point in the history
… API (#923)
  • Loading branch information
Portals authored Nov 11, 2024
1 parent 3fb580b commit 711096c
Show file tree
Hide file tree
Showing 16 changed files with 335 additions and 49 deletions.
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

0 comments on commit 711096c

Please sign in to comment.