Skip to content

Commit 2565483

Browse files
brigibodrov
andauthored
server: api resource for list kv (#681)
Co-authored-by: Ivan Bodrov <[email protected]>
1 parent 7b71ac3 commit 2565483

File tree

7 files changed

+75
-16
lines changed

7 files changed

+75
-16
lines changed

server/impl/src/main/java/com/walmartlabs/concord/server/console/ConsoleService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public ConsoleService(ProjectDao projectDao,
114114
public UserResponse whoami() {
115115
UserPrincipal p = UserPrincipal.getCurrent();
116116
if (p == null) {
117-
throw new ConcordApplicationException("Can't determine current user: pricipal not found",
117+
throw new ConcordApplicationException("Can't determine current user: principal not found",
118118
Status.INTERNAL_SERVER_ERROR);
119119
}
120120

server/impl/src/main/java/com/walmartlabs/concord/server/org/project/KvDao.java

+41-2
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@
2424
import com.walmartlabs.concord.db.MainDB;
2525
import com.walmartlabs.concord.server.Locks;
2626
import com.walmartlabs.concord.server.jooq.tables.ProjectKvStore;
27-
import org.jooq.Configuration;
28-
import org.jooq.Record1;
27+
import org.jooq.*;
2928
import org.jooq.exception.DataAccessException;
3029

3130
import javax.inject.Inject;
3231
import javax.inject.Named;
32+
import java.util.HashMap;
33+
import java.util.List;
34+
import java.util.Map;
3335
import java.util.UUID;
3436

3537
import static com.walmartlabs.concord.server.jooq.tables.ProjectKvStore.PROJECT_KV_STORE;
@@ -132,4 +134,41 @@ public synchronized long inc(UUID projectId, String key) {
132134
.fetchOne(kv.VALUE_LONG);
133135
});
134136
}
137+
138+
public List<Map<String, Object>> list(UUID projectId, int offset, int limit, String filter) {
139+
ProjectKvStore kv = PROJECT_KV_STORE.as("kv");
140+
141+
return txResult(tx -> {
142+
SelectJoinStep<Record3<String, Long, String>> q = tx.select(kv.VALUE_KEY, kv.VALUE_LONG, kv.VALUE_STRING)
143+
.from(kv);
144+
145+
if (filter != null) {
146+
q.where(kv.VALUE_KEY.containsIgnoreCase(filter));
147+
}
148+
149+
if (offset > 0) {
150+
q.offset(offset);
151+
}
152+
153+
if (limit > 0) {
154+
q.limit(limit);
155+
}
156+
157+
return q
158+
.where(kv.PROJECT_ID.eq(projectId))
159+
.orderBy(kv.VALUE_KEY)
160+
.fetch(KvDao::toEntry);
161+
});
162+
}
163+
164+
private static Map<String, Object> toEntry(Record3<String, Long, String> r) {
165+
Object value = r.get(PROJECT_KV_STORE.VALUE_STRING);
166+
if (value == null) {
167+
value = r.get(PROJECT_KV_STORE.VALUE_LONG);
168+
}
169+
Map<String, Object> m = new HashMap<>();
170+
m.put("key", r.get(PROJECT_KV_STORE.VALUE_KEY));
171+
m.put("value", value);
172+
return m;
173+
}
135174
}

server/impl/src/main/java/com/walmartlabs/concord/server/org/project/ProjectResource.java

+20
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class ProjectResource implements Resource {
5858
private final ProjectAccessManager accessManager;
5959
private final OrganizationDao orgDao;
6060
private final TeamDao teamDao;
61+
private final KvDao kvDao;
6162
private final EncryptedProjectValueManager encryptedValueManager;
6263

6364
private final ProjectRepositoryManager projectRepositoryManager;
@@ -69,13 +70,15 @@ public ProjectResource(OrganizationManager orgManager,
6970
ProjectAccessManager accessManager,
7071
OrganizationDao orgDao,
7172
TeamDao teamDao,
73+
KvDao kvDao,
7274
EncryptedProjectValueManager encryptedValueManager,
7375
ProjectRepositoryManager projectRepositoryManager) {
7476

7577
this.orgManager = orgManager;
7678
this.projectDao = projectDao;
7779
this.projectManager = projectManager;
7880
this.accessManager = accessManager;
81+
this.kvDao = kvDao;
7982
this.encryptedValueManager = encryptedValueManager;
8083
this.orgDao = orgDao;
8184
this.teamDao = teamDao;
@@ -125,6 +128,23 @@ public List<ProjectEntry> find(@ApiParam @PathParam("orgName") @ConcordKey Strin
125128
return projectManager.list(org.getId(), offset, limit, filter);
126129
}
127130

131+
@GET
132+
@ApiOperation("list KV")
133+
@Path("/{orgName}/project/{projectName}/kv")
134+
@Produces(MediaType.APPLICATION_JSON)
135+
public List<Map<String, Object>> findKV(@ApiParam @PathParam("orgName") @ConcordKey String orgName,
136+
@ApiParam @PathParam("projectName") @ConcordKey String projectName,
137+
@QueryParam("offset") int offset,
138+
@QueryParam("limit") int limit,
139+
@QueryParam("filter") String filter) {
140+
141+
OrganizationEntry org = orgManager.assertAccess(orgName, false);
142+
143+
ProjectEntry project = accessManager.assertAccess(org.getId(), null, projectName, ResourceAccessLevel.READER, false);
144+
145+
return kvDao.list(project.getId(), offset, limit, filter);
146+
}
147+
128148
@GET
129149
@ApiOperation("Get a project's configuration")
130150
@Path("/{orgName}/project/{projectName}/cfg{path: (.*)?}")

server/impl/src/main/java/com/walmartlabs/concord/server/process/ProcessKvResource.java

+2-12
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import com.walmartlabs.concord.server.org.project.KvDao;
2424
import com.walmartlabs.concord.server.process.queue.ProcessQueueManager;
25-
import com.walmartlabs.concord.server.sdk.ConcordApplicationException;
2625
import com.walmartlabs.concord.server.sdk.PartialProcessKey;
2726
import io.swagger.annotations.Api;
2827
import io.swagger.annotations.ApiOperation;
@@ -37,7 +36,6 @@
3736
import javax.inject.Singleton;
3837
import javax.ws.rs.*;
3938
import javax.ws.rs.core.MediaType;
40-
import javax.ws.rs.core.Response;
4139
import java.util.UUID;
4240

4341
@Named
@@ -127,17 +125,9 @@ public long incLong(@PathParam("id") UUID instanceId,
127125
}
128126

129127
private UUID assertProjectId(UUID instanceId) {
130-
PartialProcessKey processKey = PartialProcessKey.from(instanceId);
131-
132-
// TODO replace with getProjectId
133-
ProcessEntry entry = processQueueManager.get(processKey);
134-
if (entry == null) {
135-
throw new ConcordApplicationException("Process instance not found", Response.Status.NOT_FOUND);
136-
}
137-
138-
UUID projectId = entry.projectId();
128+
UUID projectId = processQueueManager.getProjectId(PartialProcessKey.from(instanceId));
139129
if (projectId == null) {
140-
log.warn("assertProjectId ['{}'] -> no project found, using the default value", processKey);
130+
log.warn("assertProjectId ['{}'] -> no project found, using the default value", instanceId);
141131
projectId = DEFAULT_PROJECT_ID;
142132
}
143133

server/impl/src/main/java/com/walmartlabs/concord/server/process/queue/ProcessQueueDao.java

+7
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,13 @@ public UUID getOrgId(UUID instanceId) {
452452
.fetchOne(orgId);
453453
}
454454

455+
public UUID getProjectId(UUID instanceId) {
456+
return dsl().select(PROCESS_QUEUE.PROJECT_ID)
457+
.from(PROCESS_QUEUE)
458+
.where(PROCESS_QUEUE.INSTANCE_ID.eq(instanceId))
459+
.fetchOne(PROCESS_QUEUE.PROJECT_ID);
460+
}
461+
455462
public Imports getImports(PartialProcessKey processKey) {
456463
return dsl().select(PROCESS_QUEUE.IMPORTS).from(PROCESS_QUEUE)
457464
.where(PROCESS_QUEUE.INSTANCE_ID.eq(processKey.getInstanceId()))

server/impl/src/main/java/com/walmartlabs/concord/server/process/queue/ProcessQueueManager.java

+4
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ public ProcessEntry get(PartialProcessKey partialProcessKey) {
206206
return queueDao.get(key);
207207
}
208208

209+
public UUID getProjectId(PartialProcessKey partialProcessKey) {
210+
return queueDao.getProjectId(partialProcessKey.getInstanceId());
211+
}
212+
209213
public ProcessInitiatorEntry getInitiator(PartialProcessKey partialProcessKey) {
210214
ProcessKey key = keyCache.get(partialProcessKey.getInstanceId());
211215
if (key == null) {

server/impl/src/main/java/com/walmartlabs/concord/server/user/UserManager.java

-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ public Optional<UserEntry> getOrCreate(String username, String userDomain, UserT
7575
return getOrCreate(username, userDomain, type, null, null, null);
7676
}
7777

78-
7978
public Optional<UserEntry> getOrCreate(String username, String userDomain, UserType type, String displayName, String email, Set<String> roles) {
8079
Optional<UserEntry> result = get(username, userDomain, type);
8180
if (result.isPresent()) {

0 commit comments

Comments
 (0)