Skip to content

Commit 2583567

Browse files
committed
apply transcation on flow and job
1 parent 084b37e commit 2583567

File tree

15 files changed

+152
-167
lines changed

15 files changed

+152
-167
lines changed

core/debug.yaml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@
33
version: '3'
44
services:
55
db:
6-
image: mongo:4.2
6+
image: bitnami/mongodb:5.0
77
restart: always
88
container_name: flowci-debug-db
99
ports:
1010
- "27017:27017"
11+
environment:
12+
MONGODB_REPLICA_SET_MODE: primary
13+
MONGODB_ROOT_PASSWORD: flowci
14+
MONGODB_USERNAME: flowci
15+
MONGODB_PASSWORD: flowci
16+
MONGODB_REPLICA_SET_KEY: replicakey123
17+
MONGODB_DATABASE: flow_db
1118

1219
zk:
1320
image: zookeeper:3.6

core/src/main/java/com/flowci/core/api/service/OpenRestServiceImpl.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
import com.flowci.core.common.helper.DateHelper;
2323
import com.flowci.core.config.domain.Config;
2424
import com.flowci.core.config.service.ConfigService;
25-
import com.flowci.core.flow.dao.FlowUserDao;
25+
import com.flowci.core.flow.dao.FlowUsersDao;
2626
import com.flowci.core.flow.domain.Flow;
27+
import com.flowci.core.flow.domain.FlowUsers;
2728
import com.flowci.core.flow.domain.MatrixCounter;
2829
import com.flowci.core.flow.service.FlowService;
2930
import com.flowci.core.flow.service.MatrixService;
@@ -54,7 +55,7 @@
5455
public class OpenRestServiceImpl implements OpenRestService {
5556

5657
@Autowired
57-
private FlowUserDao flowUserDao;
58+
private FlowUsersDao flowUsersDao;
5859

5960
@Autowired
6061
private JobDao jobDao;
@@ -146,7 +147,12 @@ public void addToJobContext(String flowName, long buildNumber, Map<String, Strin
146147
@Override
147148
public List<User> users(String flowName) {
148149
Flow flow = flowService.get(flowName);
149-
List<String> emails = flowUserDao.findAllUsers(flow.getId());
150+
Optional<FlowUsers> optional = flowUsersDao.findById(flow.getId());
151+
if (optional.isEmpty()) {
152+
return Collections.emptyList();
153+
}
154+
155+
var emails = optional.get().getUsers();
150156
List<User> users = new ArrayList<>(emails.size());
151157
for (String email : emails) {
152158
User user = new User();

core/src/main/java/com/flowci/core/common/config/MongoConfig.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.flowci.core.trigger.domain.WebhookTrigger;
3535
import com.mongodb.ConnectionString;
3636
import com.mongodb.MongoClientSettings;
37+
import com.mongodb.MongoCredential;
3738
import com.mongodb.client.MongoClient;
3839
import com.mongodb.client.MongoClients;
3940
import lombok.NonNull;
@@ -43,6 +44,8 @@
4344
import org.springframework.context.annotation.Bean;
4445
import org.springframework.context.annotation.Configuration;
4546
import org.springframework.core.convert.converter.Converter;
47+
import org.springframework.data.mongodb.MongoDatabaseFactory;
48+
import org.springframework.data.mongodb.MongoTransactionManager;
4649
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
4750
import org.springframework.data.mongodb.config.EnableMongoAuditing;
4851
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
@@ -72,16 +75,16 @@ public MongoConfig(AppProperties appProperties, MongoProperties mongoProperties,
7275
this.objectMapper = objectMapper;
7376
}
7477

78+
@Bean
79+
public MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
80+
return new MongoTransactionManager(dbFactory);
81+
}
82+
7583
@NonNull
7684
@Override
7785
public MongoClient mongoClient() {
7886
log.info("Mongo URI: {}", mongoProperties.getUri());
79-
ConnectionString connectionString = new ConnectionString(mongoProperties.getUri());
80-
MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
81-
.applyConnectionString(connectionString)
82-
.build();
83-
84-
return MongoClients.create(mongoClientSettings);
87+
return MongoClients.create(mongoProperties.getUri());
8588
}
8689

8790
@NonNull

core/src/main/java/com/flowci/core/flow/dao/FlowUserDao.java renamed to core/src/main/java/com/flowci/core/flow/dao/CustomizedFlowUserDao.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019 flow.ci
2+
* Copyright (c) 2023 flow.ci
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,25 +20,13 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222

23-
public interface FlowUserDao {
24-
25-
void create(String flowId);
26-
27-
/**
28-
* Remove flow user list
29-
*/
30-
void delete(String flowId);
23+
public interface CustomizedFlowUserDao {
3124

3225
/**
3326
* Find all flows by users email
3427
*/
3528
List<String> findAllFlowsByUserEmail(String email);
3629

37-
/**
38-
* Find all users by flow id
39-
*/
40-
List<String> findAllUsers(String flowId);
41-
4230
/**
4331
* Batch insert users
4432
*/
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.flowci.core.flow.dao;
2+
3+
import com.flowci.core.flow.domain.FlowUsers;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.data.mongodb.core.MongoTemplate;
6+
import org.springframework.data.mongodb.core.query.Criteria;
7+
import org.springframework.data.mongodb.core.query.Query;
8+
import org.springframework.data.mongodb.core.query.Update;
9+
10+
import java.util.*;
11+
12+
public class CustomizedFlowUserDaoImpl implements CustomizedFlowUserDao {
13+
14+
@Autowired
15+
private MongoTemplate mongoTemplate;
16+
17+
@Override
18+
public List<String> findAllFlowsByUserEmail(String email) {
19+
Query q = Query.query(Criteria.where("users").in(email));
20+
q.fields().exclude("users");
21+
22+
List<FlowUsers> lists = mongoTemplate.find(q, FlowUsers.class);
23+
List<String> ids = new LinkedList<>();
24+
25+
for (FlowUsers item : lists) {
26+
ids.add(item.getId());
27+
}
28+
29+
return ids;
30+
}
31+
32+
@Override
33+
public void insert(String flowId, Collection<String> emails) {
34+
Query q = Query.query(Criteria.where("_id").is(flowId));
35+
Update u = new Update().addToSet("users").each(emails);
36+
mongoTemplate.upsert(q, u, FlowUsers.class);
37+
}
38+
39+
@Override
40+
public void remove(String flowId, Collection<String> emails) {
41+
Query q = Query.query(Criteria.where("_id").is(flowId));
42+
Update u = new Update();
43+
u.pullAll("users", emails.toArray());
44+
mongoTemplate.updateFirst(q, u, FlowUsers.class);
45+
}
46+
47+
@Override
48+
public boolean exist(String flowId, String email) {
49+
Query q = new Query();
50+
q.addCriteria(Criteria.where("_id").is(flowId));
51+
q.addCriteria(Criteria.where("users").is(email));
52+
return mongoTemplate.exists(q, FlowUsers.class);
53+
}
54+
}

core/src/main/java/com/flowci/core/flow/dao/FlowUserDaoImpl.java

Lines changed: 0 additions & 97 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.flowci.core.flow.dao;
2+
3+
import com.flowci.core.flow.domain.FlowUsers;
4+
import org.springframework.data.mongodb.repository.MongoRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface FlowUsersDao extends MongoRepository<FlowUsers, String>, CustomizedFlowUserDao {
9+
}

core/src/main/java/com/flowci/core/flow/domain/FlowUsers.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,31 @@
1717

1818
package com.flowci.core.flow.domain;
1919

20+
import com.flowci.core.common.domain.Mongoable;
2021
import lombok.EqualsAndHashCode;
2122
import lombok.Getter;
2223
import lombok.NoArgsConstructor;
2324
import lombok.Setter;
2425
import org.springframework.data.annotation.Id;
26+
import org.springframework.data.mongodb.core.index.Indexed;
2527
import org.springframework.data.mongodb.core.mapping.Document;
2628

2729
import java.util.LinkedList;
2830
import java.util.List;
2931

3032
@Getter
3133
@Setter
32-
@EqualsAndHashCode(of = {"flowId"})
3334
@Document(collection = "flow_users")
3435
@NoArgsConstructor
35-
public class FlowUsers {
36-
37-
@Id
38-
private String flowId;
36+
public class FlowUsers extends Mongoable {
3937

4038
private List<String> users = new LinkedList<>(); // user email list
4139

4240
public FlowUsers(String flowId) {
43-
this.flowId = flowId;
41+
this.id = flowId;
42+
}
43+
44+
public void add(String email) {
45+
users.add(email);
4446
}
4547
}

core/src/main/java/com/flowci/core/flow/service/FlowGroupServiceImpl.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.flowci.core.common.manager.SessionManager;
44
import com.flowci.core.flow.dao.FlowDao;
55
import com.flowci.core.flow.dao.FlowGroupDao;
6-
import com.flowci.core.flow.dao.FlowUserDao;
6+
import com.flowci.core.flow.dao.FlowUsersDao;
77
import com.flowci.core.flow.domain.Flow;
88
import com.flowci.core.flow.domain.FlowGroup;
99
import com.flowci.core.flow.domain.FlowItem;
@@ -12,9 +12,9 @@
1212
import com.flowci.exception.NotFoundException;
1313
import com.google.common.collect.Sets;
1414
import lombok.AllArgsConstructor;
15-
import org.springframework.beans.factory.annotation.Autowired;
1615
import org.springframework.dao.DuplicateKeyException;
1716
import org.springframework.stereotype.Service;
17+
import org.springframework.transaction.annotation.Transactional;
1818

1919
import java.util.List;
2020
import java.util.Optional;
@@ -27,7 +27,7 @@ public class FlowGroupServiceImpl implements FlowGroupService {
2727

2828
private final FlowGroupDao flowGroupDao;
2929

30-
private final FlowUserDao flowUserDao;
30+
private final FlowUsersDao flowUsersDao;
3131

3232
private final SessionManager sessionManager;
3333

@@ -50,6 +50,7 @@ public FlowGroup getById(String id) {
5050
}
5151

5252
@Override
53+
@Transactional
5354
public FlowGroup create(String name) {
5455
var email = sessionManager.getUserEmail();
5556

@@ -58,7 +59,7 @@ public FlowGroup create(String name) {
5859

5960
try {
6061
flowGroupDao.save(group);
61-
flowUserDao.insert(group.getId(), Sets.newHashSet(email));
62+
flowUsersDao.insert(group.getId(), Sets.newHashSet(email));
6263
return group;
6364
} catch (DuplicateKeyException e) {
6465
throw new DuplicateException("Group {0} already exists", name);

0 commit comments

Comments
 (0)