Skip to content

Removed DBRef for retrocompatibility with latest AC versions #304

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

Merged
merged 2 commits into from
Jun 3, 2025
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
74 changes: 4 additions & 70 deletions .github/workflows/master.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
name: Master CI
name: Master v1 CI

on:
push:
branches: [ master ]
branches: [ master-1 ]
pull_request:
branches: [ master ]
branches: [ master-1 ]

jobs:
build-test:
Expand All @@ -28,70 +28,4 @@ jobs:
- name: Build/Test & SonarCloud Scan
run: mvn -B clean verify -Pcoverage,sonar -Dsonar.token=${{ secrets.SONAR_TOKEN }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

docker:
name: Publish Docker Image
needs: [ build-test ]
runs-on: ubuntu-latest
if: success() && github.ref == 'refs/heads/master'

outputs:
digest: ${{ steps.docker_build.outputs.digest }}

steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push
id: docker_build
uses: docker/build-push-action@v6
with:
push: true
# file: ./Dockerfile.native
platforms: linux/amd64,linux/arm64
tags: ${{ secrets.DOCKERHUB_USERNAME }}/switcher-ac:latest

update-kustomize:
name: Deploy
needs: [ docker ]
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: 'master'

- name: Checkout Kustomize
uses: actions/checkout@v4
with:
token: ${{ secrets.ARGOCD_PAT }}
repository: switcherapi/switcher-deployment
ref: master

- name: Set up arkade-get
uses: alexellis/arkade-get@master
with:
kubectl: latest
kustomize: latest

- name: Update GitOps repository
run: |
cd switcher-ac/base
echo RELEASE_TIME=`date` > environment-properties.env
kustomize edit set image trackerforce/switcher-ac:latest=trackerforce/switcher-ac@${{ needs.docker.outputs.digest }}
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
git config --global user.name "${{ github.actor }}"
git add .
git commit -m "[argocd] switcher-ac: ${{ needs.docker.outputs.digest }}"
git push
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
12 changes: 11 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

<groupId>com.github.switcherac</groupId>
<artifactId>switcher-ac</artifactId>
<version>1.0.10</version>
<version>1.1.0-SNAPSHOT</version>

<name>Switcher Account Control</name>
<description>Account Control Service for Switcher API</description>
Expand Down Expand Up @@ -71,6 +71,7 @@
<!-- Plugins -->
<native-image-plugin.version>0.10.6</native-image-plugin.version>
<maven-compiler.version>3.14.0</maven-compiler.version>
<maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
<sonar.version>5.1.0.4751</sonar.version>
<jacoco.version>0.8.13</jacoco.version>

Expand Down Expand Up @@ -317,6 +318,15 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<parallel>suites</parallel>
</configuration>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.github.switcherapi.ac.model.dto.AccountDTO;
import com.github.switcherapi.ac.model.dto.GitHubAuthDTO;
import com.github.switcherapi.ac.model.mapper.AccountMapper;
import com.github.switcherapi.ac.service.AccountService;
import com.github.switcherapi.ac.service.AdminService;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -51,8 +50,7 @@ public ResponseEntity<Object> logout(@RequestHeader(HttpHeaders.AUTHORIZATION) S
@PatchMapping(value = "/account/change/{adminId}")
public ResponseEntity<AccountDTO> changeAccountPlan(@PathVariable(value="adminId")
String adminId, @RequestParam String plan) {
final var account = accountService.createAccount(adminId, plan);
return ResponseEntity.ok(AccountMapper.createCopy(account));
return ResponseEntity.ok(accountService.createAccount(adminId, plan));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;

@JsonInclude(Include.NON_NULL)
Expand All @@ -21,8 +20,7 @@ public class Account {
@Indexed(unique = true)
private String adminId;

@DBRef
private Plan plan;
private String plan;

public Account(String adminId) {
this.adminId = adminId;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package com.github.switcherapi.ac.model.mapper;

import com.github.switcherapi.ac.model.domain.Account;
import com.github.switcherapi.ac.model.domain.Plan;
import com.github.switcherapi.ac.model.dto.AccountDTO;
import com.github.switcherapi.ac.model.dto.PlanDTO;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AccountMapper {

public static AccountDTO createCopy(Account from) {
final var plan = new PlanDTO(from.getPlan().getId(), from.getPlan().getName(), from.getPlan().getAttributes());
return new AccountDTO(from.getId(), from.getAdminId(), plan);

public static AccountDTO map(Account account, Plan plan) {
return new AccountDTO(account.getId(), account.getAdminId(), PlanMapper.createCopy(plan));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public List<Account> findByPlanName(String planName) {

if (Objects.nonNull(planFound)) {
final var query = new Query();
query.addCriteria(Criteria.where("plan").is(planFound));
query.addCriteria(Criteria.where("plan").is(planFound.getId()));

return mongoTemplate.find(query, Account.class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.github.switcherapi.ac.model.domain.Account;
import com.github.switcherapi.ac.model.domain.PlanType;
import com.github.switcherapi.ac.model.dto.AccountDTO;
import com.github.switcherapi.ac.model.mapper.AccountMapper;
import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import org.springframework.http.HttpStatus;
Expand All @@ -26,22 +28,22 @@ public AccountService(PlanDao planDao, AccountDao accountDao) {
this.accountDao = accountDao;
}

public Account createAccount(String adminId) {
public AccountDTO createAccount(String adminId) {
return createAccount(adminId, PlanType.DEFAULT.name());
}

public Account createAccount(String adminId, String planName) {
public AccountDTO createAccount(String adminId, String planName) {
final var plan = Optional.ofNullable(planDao.findByName(planName))
.orElseThrow(() -> new ResponseStatusException(
HttpStatus.NOT_FOUND, String.format(PLAN_NAME_NOT_FOUND.getValue(), planName)));

var account = Optional.ofNullable(accountDao.findByAdminId(adminId))
.orElse(new Account(adminId));

account.setPlan(plan);
account.setPlan(plan.getId());
accountDao.getAccountRepository().save(account);

return account;
return AccountMapper.map(account, plan);
}

public void updateAccountPlan(String adminId, String planName) {
Expand All @@ -50,7 +52,7 @@ public void updateAccountPlan(String adminId, String planName) {
HttpStatus.NOT_FOUND, String.format(PLAN_NAME_NOT_FOUND.getValue(), planName)));

final var account = getAccountByAdminId(adminId);
account.setPlan(plan);
account.setPlan(plan.getId());
accountDao.getAccountRepository().save(account);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.github.switcherapi.ac.service;

import com.github.switcherapi.ac.model.domain.Account;
import com.github.switcherapi.ac.model.domain.Feature;
import com.github.switcherapi.ac.model.domain.FeaturePayload;
import com.github.switcherapi.ac.model.domain.PlanAttribute;
import com.github.switcherapi.ac.model.domain.*;
import com.github.switcherapi.ac.model.dto.ResponseRelayDTO;
import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import com.github.switcherapi.ac.service.validator.AbstractValidatorService;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
Expand All @@ -18,13 +16,15 @@
@Service
public class ValidatorBasicService extends AbstractValidatorService {

protected ValidatorBasicService(AccountDao accountDao) {
super(accountDao);
protected ValidatorBasicService(AccountDao accountDao, PlanDao planDao) {
super(accountDao, planDao);
}

@Override
protected ResponseRelayDTO executeValidator(final Account account) {
final var maxPlanValue = account.getPlan().getAttributes().stream()
var plan = planDao.getPlanRepository().findById(account.getPlan()).orElse(Plan.loadDefault());

final var maxPlanValue = plan.getAttributes().stream()
.filter(attrib -> attrib.getFeature().equals(getParam(FEATURE)))
.findFirst().orElseGet(() -> PlanAttribute.builder().build());

Expand Down Expand Up @@ -54,7 +54,7 @@ protected void validateRequest(FeaturePayload request) {
private boolean validate(Object value) {
if (value instanceof Boolean) {
final var boolValue = Boolean.parseBoolean(value.toString());
return Boolean.FALSE.equals(boolValue);
return !boolValue;
}

if (value instanceof Integer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.github.switcherapi.ac.model.domain.FeaturePayload;
import com.github.switcherapi.ac.model.dto.ResponseRelayDTO;
import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

Expand All @@ -18,10 +19,13 @@ public abstract class AbstractValidatorService {

protected final AccountDao accountDao;

protected final PlanDao planDao;

protected Map<SwitcherValidatorParams, Object> params;

protected AbstractValidatorService(AccountDao accountDao) {
protected AbstractValidatorService(AccountDao accountDao, PlanDao planDao) {
this.accountDao = accountDao;
this.planDao = planDao;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.github.switcherapi.ac.model.domain.FeaturePayload;
import com.github.switcherapi.ac.model.dto.ResponseRelayDTO;
import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

Expand All @@ -15,8 +16,11 @@ public abstract class ValidatorBuilderService {

protected final AccountDao accountDao;

protected ValidatorBuilderService(AccountDao accountDao) {
protected final PlanDao planDao;

protected ValidatorBuilderService(AccountDao accountDao, PlanDao planDao) {
this.accountDao = accountDao;
this.planDao = planDao;
}

public ResponseRelayDTO runValidator(FeaturePayload request) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.github.switcherapi.ac.service.validator;

import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import com.github.switcherapi.ac.service.validator.beans.ValidateRateLimit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
Expand All @@ -13,14 +14,14 @@
@ConditionalOnProperty(value = "service.validators.native", havingValue = "true")
public class ValidatorNativeBuilder extends ValidatorBuilderService {

public ValidatorNativeBuilder(AccountDao accountDao) {
super(accountDao);
public ValidatorNativeBuilder(AccountDao accountDao, PlanDao planDao) {
super(accountDao, planDao);
this.initializeValidators();
}

@Override
protected void initializeValidators() {
validatorHandlers.put(RATE_LIMIT_VALIDATOR, new ValidateRateLimit(accountDao));
validatorHandlers.put(RATE_LIMIT_VALIDATOR, new ValidateRateLimit(accountDao, planDao));
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.github.switcherapi.ac.service.validator;

import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
Expand All @@ -20,8 +21,8 @@ public class ValidatorRuntimeBuilder extends ValidatorBuilderService {

private final AutowireCapableBeanFactory autowireCapableBeanFactory;

public ValidatorRuntimeBuilder(AutowireCapableBeanFactory autowireCapableBeanFactory, AccountDao accountDao) {
super(accountDao);
public ValidatorRuntimeBuilder(AutowireCapableBeanFactory autowireCapableBeanFactory, AccountDao accountDao, PlanDao planDao) {
super(accountDao, planDao);
this.autowireCapableBeanFactory = autowireCapableBeanFactory;
this.initializeValidators();
}
Expand All @@ -45,7 +46,9 @@ private void cacheValidator(String controllerClassName) {

if (Objects.nonNull(validatorAnnotation)) {
var sValidator = validatorClass.getAnnotation(SwitcherValidator.class);
var validatorService = (AbstractValidatorService) validatorClass.getConstructor(AccountDao.class).newInstance(this.accountDao);
var validatorService = (AbstractValidatorService) validatorClass
.getConstructor(AccountDao.class, PlanDao.class)
.newInstance(this.accountDao, this.planDao);

autowireCapableBeanFactory.autowireBean(validatorService);
validatorHandlers.put(sValidator.value(), validatorService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.github.switcherapi.ac.service.validator.SwitcherValidatorParams.ADMINID;

import com.github.switcherapi.ac.repository.AccountDao;
import com.github.switcherapi.ac.repository.PlanDao;
import org.springframework.http.HttpStatus;
import org.springframework.util.Assert;
import org.springframework.web.server.ResponseStatusException;
Expand All @@ -14,8 +15,8 @@

public abstract class AbstractActiveCheckValidator extends AbstractValidatorService {

protected AbstractActiveCheckValidator(AccountDao accountDao) {
super(accountDao);
protected AbstractActiveCheckValidator(AccountDao accountDao, PlanDao planDao) {
super(accountDao, planDao);
}

@Override
Expand Down
Loading