Skip to content

feat:permission control for application #84

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 9 commits into from
Sep 21, 2023
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
2 changes: 1 addition & 1 deletion arex-storage-config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>com.arextest</groupId>
<artifactId>arex-storage-service</artifactId>
<version>1.0.24</version>
<version>1.0.25</version>
</parent>

<artifactId>arex-storage-config</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import lombok.NonNull;
import lombok.experimental.FieldNameConstants;

import java.util.Set;

@Data
@NoArgsConstructor
@FieldNameConstants
Expand All @@ -32,8 +34,8 @@ public class AppCollection extends BaseEntity {
private String description;
@NonNull
private String category;
@NonNull
private String owner;
private Set<String> owners;
@NonNull
private String organizationName;
@NonNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import lombok.Getter;
import lombok.Setter;

import java.util.Set;

/**
* @author jmo
* @since 2022/1/22
Expand All @@ -31,7 +33,9 @@ public class ApplicationConfiguration extends AbstractConfiguration implements A
* nodeJs_Web_service
*/
private String category;
@Deprecated
private String owner;
private Set<String> owners;
private String organizationName;
private Integer recordedCaseCount;
private String defaultFormatter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.arextest.config.model.vo;

import lombok.Data;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Set;

/**
* @author wildeslam.
* @create 2023/9/15 14:21
*/
@Data
public class AddApplicationRequest {
@NotNull
private String appName;
@NotEmpty
private Set<String> owners;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.arextest.config.model.vo;

import lombok.Data;

/**
* @author wildeslam.
* @create 2023/9/15 14:31
*/
@Data
public class AddApplicationResponse {
private Boolean success;
private String msg;
private String appId;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.arextest.config.model.vo;

import java.util.Map;

import lombok.Data;

import java.util.Map;

/**
* @author b_yu
* @since 2023/6/14
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.arextest.config.model.vo;

import lombok.Data;

import javax.validation.constraints.NotNull;
import java.util.Set;

/**
* @author wildeslam.
* @create 2023/9/19 11:21
*/
@Data
public class UpdateApplicationRequest {
@NotNull
private String appId;
private String appName;
private Set<String> owners;
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,38 @@
package com.arextest.config.repository.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.bson.conversions.Bson;

import com.arextest.config.mapper.AppMapper;
import com.arextest.config.model.dao.config.AppCollection;
import com.arextest.config.model.dto.application.ApplicationConfiguration;
import com.arextest.config.repository.ConfigRepositoryProvider;
import com.arextest.config.utils.MongoHelper;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Sorts;
import com.mongodb.client.model.UpdateManyModel;
import com.mongodb.client.model.Updates;
import com.mongodb.client.model.WriteModel;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertOneResult;
import org.apache.commons.lang3.StringUtils;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ApplicationConfigurationRepositoryImpl implements ConfigRepositoryProvider<ApplicationConfiguration> {
private MongoDatabase mongoDatabase;

private MongoCollection<AppCollection> mongoCollection;

private static final String UNKNOWN_APP_NAME = "unknown app name";

@Resource
private List<ConfigRepositoryProvider> configRepositoryProviders;

Expand All @@ -39,6 +43,27 @@ public ApplicationConfigurationRepositoryImpl(MongoDatabase mongoDatabase) {
@PostConstruct
private void init() {
this.mongoCollection = mongoDatabase.getCollection(AppCollection.DOCUMENT_NAME, AppCollection.class);
// flush appName
flushAppName();
}

private void flushAppName() {
Bson filter = Filters.eq(AppCollection.Fields.appName, UNKNOWN_APP_NAME);
List<WriteModel<AppCollection>> bulkUpdateOps = new ArrayList<>();
try (MongoCursor<AppCollection> cursor = mongoCollection.find(filter).iterator()) {
while (cursor.hasNext()) {
AppCollection document = cursor.next();
document.setAppName(document.getAppId());

Bson filter2 = Filters.eq(DASH_ID, new ObjectId(document.getId()));
Bson update = Updates.combine(Arrays.asList(MongoHelper.getUpdate(),
MongoHelper.getSpecifiedProperties(document, AppCollection.Fields.appName)));
bulkUpdateOps.add(new UpdateManyModel<>(filter2, update));
}
}
if (bulkUpdateOps.size() > 0) {
BulkWriteResult result = mongoCollection.bulkWrite(bulkUpdateOps);
}
}

@Override
Expand Down Expand Up @@ -78,7 +103,8 @@ public boolean update(ApplicationConfiguration configuration) {

List<Bson> updateList = Arrays.asList(MongoHelper.getUpdate(),
MongoHelper.getSpecifiedProperties(configuration, AppCollection.Fields.agentVersion,
AppCollection.Fields.agentExtVersion, AppCollection.Fields.status, AppCollection.Fields.features));
AppCollection.Fields.agentExtVersion, AppCollection.Fields.status, AppCollection.Fields.features,
AppCollection.Fields.appName, AppCollection.Fields.owners));
Bson updateCombine = Updates.combine(updateList);

return mongoCollection.updateMany(filter, updateCombine).getModifiedCount() > 0;
Expand Down
2 changes: 1 addition & 1 deletion arex-storage-model/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.24</version>
<version>1.0.25</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>arex-model</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion arex-storage-web-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.24</version>
<version>1.0.25</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>arex-storage-web-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.arextest.storage.service.config;

import com.arextest.config.model.dto.StatusType;
import com.arextest.config.model.dto.application.ApplicationConfiguration;
import com.arextest.config.model.vo.AddApplicationRequest;
import com.arextest.config.model.vo.AddApplicationResponse;
import com.arextest.config.model.vo.UpdateApplicationRequest;
import com.arextest.config.repository.impl.ApplicationConfigurationRepositoryImpl;
import com.arextest.storage.utils.RandomUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
* @author wildeslam.
* @create 2023/9/15 14:37
*/
@Component
public class ApplicationService {

@Autowired
private ApplicationConfigurationRepositoryImpl applicationConfigurationRepository;

public AddApplicationResponse addApplication(AddApplicationRequest request) {
AddApplicationResponse response = new AddApplicationResponse();

ApplicationConfiguration applicationConfiguration = new ApplicationConfiguration();
applicationConfiguration.setAppName(request.getAppName());
applicationConfiguration.setAgentVersion(StringUtils.EMPTY);
applicationConfiguration.setAgentExtVersion(StringUtils.EMPTY);
applicationConfiguration.setRecordedCaseCount(0);
applicationConfiguration.setStatus(StatusType.RECORD.getMask() | StatusType.REPLAY.getMask());
applicationConfiguration.setOwners(request.getOwners());

applicationConfiguration.setOrganizationName("unknown organization name");
applicationConfiguration.setGroupName("unknown group name");
applicationConfiguration.setGroupId("unknown group id");
applicationConfiguration.setOrganizationId("unknown organization id");
applicationConfiguration.setDescription("unknown description");
applicationConfiguration.setCategory("unknown category");

String appId = RandomUtils.generateRandomId(request.getAppName());
applicationConfiguration.setAppId(appId);

boolean success = applicationConfigurationRepository.insert(applicationConfiguration);
response.setAppId(appId);
response.setSuccess(success);
return response;
}

public boolean modifyApplication(UpdateApplicationRequest request) {
List<ApplicationConfiguration> applicationConfigurationList =
applicationConfigurationRepository.listBy(request.getAppId());
if (CollectionUtils.isEmpty(applicationConfigurationList)) {
return false;
}
ApplicationConfiguration applicationConfiguration = applicationConfigurationList.get(0);
if (request.getAppName() != null) {
applicationConfiguration.setAppName(request.getAppName());
}
if (request.getOwners() != null) {
applicationConfiguration.setOwners(request.getOwners());
}
return applicationConfigurationRepository.update(applicationConfiguration);
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package com.arextest.storage.service.config.impl;

import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import com.arextest.config.model.dto.StatusType;
import com.arextest.config.model.dto.application.ApplicationConfiguration;
import com.arextest.config.model.dto.application.ApplicationDescription;
import com.arextest.config.repository.ConfigRepositoryProvider;
import com.arextest.storage.service.config.provider.ApplicationDescriptionProvider;
import com.arextest.storage.service.config.AbstractConfigurableHandler;
import com.arextest.storage.service.config.provider.ApplicationDescriptionProvider;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;

/**
* @author jmo
* @since 2022/1/23
Expand Down Expand Up @@ -50,6 +49,7 @@ public boolean insert(ApplicationConfiguration configuration) {
@Override
protected List<ApplicationConfiguration> createFromGlobalDefault(String appId) {
ApplicationConfiguration applicationConfiguration = new ApplicationConfiguration();
applicationConfiguration.setAppName(appId);
applicationConfiguration.setAppId(appId);
applicationConfiguration.setAgentVersion(StringUtils.EMPTY);
applicationConfiguration.setAgentExtVersion(StringUtils.EMPTY);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.arextest.storage.utils;

import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/**
* @author wildeslam.
* @create 2023/9/15 14:38
*/
@Slf4j
public class RandomUtils {
private static final int ID_LENGTH = 16;
private static final SecureRandom RANDOM = new SecureRandom();

public static String generateRandomId(String identifier) {
String sourceString = System.currentTimeMillis() + "-" + RANDOM.nextInt() + "-" + identifier;
try {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] bytes = md.digest((sourceString).getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String hexString = Integer.toHexString(b & 0xff);
sb.append(hexString);
}
return sb.substring(0, ID_LENGTH);
} catch (NoSuchAlgorithmException e) {
LOGGER.error("generateRandomId error", e);
return null;
}

}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.arextest.storage.web.controller;

import com.arextest.common.metrics.PrometheusConfiguration;
import com.arextest.common.model.response.Response;
import com.arextest.common.utils.ResponseUtils;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -20,7 +19,6 @@ public class CheckHealthController {
@GetMapping(value = "/health", produces = "application/json")
@ResponseBody
public Response checkHealth() {
LOGGER.error("test error checkHealth");
return ResponseUtils.successResponse(true);
}
}
Loading