|
|
|
|
@ -3,8 +3,11 @@ package com.yau.digitalrmb.platformintegration.infrastructure;
|
|
|
|
|
import com.yau.digitalrmb.platformintegration.application.PlatformIdentityRepository;
|
|
|
|
|
import com.yau.digitalrmb.platformintegration.domain.PlatformActor;
|
|
|
|
|
import com.yau.digitalrmb.platformintegration.domain.PlatformRole;
|
|
|
|
|
import org.springframework.jdbc.core.simple.JdbcClient;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
|
|
import org.springframework.dao.IncorrectResultSizeDataAccessException;
|
|
|
|
|
import org.springframework.jdbc.core.RowMapper;
|
|
|
|
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
|
|
|
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
|
|
|
|
import org.springframework.stereotype.Repository;
|
|
|
|
|
|
|
|
|
|
import java.sql.ResultSet;
|
|
|
|
|
@ -17,23 +20,22 @@ import java.util.Optional;
|
|
|
|
|
|
|
|
|
|
@Repository
|
|
|
|
|
public class JdbcPlatformIdentityRepository implements PlatformIdentityRepository {
|
|
|
|
|
private static final String TEACHER_QUERY = """
|
|
|
|
|
SELECT cu.ID, cu.CODE, cu.NAME, t.teacher_id AS profile_id, t.add_time AS signing_time
|
|
|
|
|
FROM core_user cu JOIN teacher t ON t.user_id = cu.ID
|
|
|
|
|
WHERE cu.JOB_TYPE1 = 'JT_S_02' AND cu.STATE = 'S1' AND cu.DEL_FLAG = 0
|
|
|
|
|
AND t.teacher_status = 1 AND t.add_time IS NOT NULL AND %s
|
|
|
|
|
""";
|
|
|
|
|
private static final String STUDENT_QUERY = """
|
|
|
|
|
SELECT cu.ID, cu.CODE, cu.NAME, s.student_id AS profile_id, s.add_time AS signing_time
|
|
|
|
|
FROM core_user cu JOIN student s ON s.user_id = cu.ID
|
|
|
|
|
WHERE cu.JOB_TYPE1 = 'JT_S_03' AND cu.STATE = 'S1' AND cu.DEL_FLAG = 0
|
|
|
|
|
AND s.student_status = 1 AND s.add_time IS NOT NULL AND %s
|
|
|
|
|
""";
|
|
|
|
|
private static final String TEACHER_QUERY =
|
|
|
|
|
"SELECT cu.ID, cu.CODE, cu.NAME, t.teacher_id AS profile_id, t.add_time AS signing_time "
|
|
|
|
|
+ "FROM core_user cu JOIN teacher t ON t.user_id = cu.ID "
|
|
|
|
|
+ "WHERE cu.JOB_TYPE1 = 'JT_S_02' AND cu.STATE = 'S1' AND cu.DEL_FLAG = 0 "
|
|
|
|
|
+ "AND t.teacher_status = 1 AND t.add_time IS NOT NULL AND %s";
|
|
|
|
|
private static final String STUDENT_QUERY =
|
|
|
|
|
"SELECT cu.ID, cu.CODE, cu.NAME, s.student_id AS profile_id, s.add_time AS signing_time "
|
|
|
|
|
+ "FROM core_user cu JOIN student s ON s.user_id = cu.ID "
|
|
|
|
|
+ "WHERE cu.JOB_TYPE1 = 'JT_S_03' AND cu.STATE = 'S1' AND cu.DEL_FLAG = 0 "
|
|
|
|
|
+ "AND s.student_status = 1 AND s.add_time IS NOT NULL AND %s";
|
|
|
|
|
|
|
|
|
|
private final JdbcClient jdbcClient;
|
|
|
|
|
private final NamedParameterJdbcTemplate jdbcTemplate;
|
|
|
|
|
|
|
|
|
|
public JdbcPlatformIdentityRepository(@Qualifier("platformJdbcClient") JdbcClient jdbcClient) {
|
|
|
|
|
this.jdbcClient = jdbcClient;
|
|
|
|
|
public JdbcPlatformIdentityRepository(
|
|
|
|
|
@Qualifier("platformNamedParameterJdbcTemplate") NamedParameterJdbcTemplate jdbcTemplate) {
|
|
|
|
|
this.jdbcTemplate = jdbcTemplate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@ -50,28 +52,37 @@ public class JdbcPlatformIdentityRepository implements PlatformIdentityRepositor
|
|
|
|
|
public List<PlatformActor> findChangedSince(Instant watermark) {
|
|
|
|
|
String predicate = "(cu.update_Time > :watermark OR cu.CREATE_TIME > :watermark)";
|
|
|
|
|
Timestamp since = Timestamp.from(watermark);
|
|
|
|
|
List<PlatformActor> actors = new ArrayList<>(queryAll(TEACHER_QUERY.formatted(predicate), since, PlatformRole.TEACHER));
|
|
|
|
|
actors.addAll(queryAll(STUDENT_QUERY.formatted(predicate), since, PlatformRole.STUDENT));
|
|
|
|
|
List<PlatformActor> actors = new ArrayList<PlatformActor>(
|
|
|
|
|
queryAll(String.format(TEACHER_QUERY, predicate), since, PlatformRole.TEACHER));
|
|
|
|
|
actors.addAll(queryAll(String.format(STUDENT_QUERY, predicate), since, PlatformRole.STUDENT));
|
|
|
|
|
return actors;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Optional<PlatformActor> findBy(String predicate, Object value) {
|
|
|
|
|
Optional<PlatformActor> teacher = query(TEACHER_QUERY.formatted(predicate), value, PlatformRole.TEACHER);
|
|
|
|
|
return teacher.isPresent() ? teacher : query(STUDENT_QUERY.formatted(predicate), value, PlatformRole.STUDENT);
|
|
|
|
|
Optional<PlatformActor> teacher = query(String.format(TEACHER_QUERY, predicate), value, PlatformRole.TEACHER);
|
|
|
|
|
return teacher.isPresent() ? teacher : query(String.format(STUDENT_QUERY, predicate), value, PlatformRole.STUDENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Optional<PlatformActor> query(String sql, Object value, PlatformRole role) {
|
|
|
|
|
return jdbcClient.sql(sql)
|
|
|
|
|
.param("value", value)
|
|
|
|
|
.query((resultSet, rowNumber) -> map(resultSet, role))
|
|
|
|
|
.optional();
|
|
|
|
|
List<PlatformActor> actors = jdbcTemplate.query(sql,
|
|
|
|
|
new MapSqlParameterSource("value", value), rowMapper(role));
|
|
|
|
|
if (actors.size() > 1) {
|
|
|
|
|
throw new IncorrectResultSizeDataAccessException(1, actors.size());
|
|
|
|
|
}
|
|
|
|
|
return actors.isEmpty() ? Optional.<PlatformActor>empty() : Optional.of(actors.get(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<PlatformActor> queryAll(String sql, Timestamp watermark, PlatformRole role) {
|
|
|
|
|
return jdbcClient.sql(sql)
|
|
|
|
|
.param("watermark", watermark)
|
|
|
|
|
.query((resultSet, rowNumber) -> map(resultSet, role))
|
|
|
|
|
.list();
|
|
|
|
|
return jdbcTemplate.query(sql, new MapSqlParameterSource("watermark", watermark), rowMapper(role));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private RowMapper<PlatformActor> rowMapper(final PlatformRole role) {
|
|
|
|
|
return new RowMapper<PlatformActor>() {
|
|
|
|
|
@Override
|
|
|
|
|
public PlatformActor mapRow(ResultSet resultSet, int rowNumber) throws SQLException {
|
|
|
|
|
return map(resultSet, role);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private PlatformActor map(ResultSet resultSet, PlatformRole role) throws SQLException {
|
|
|
|
|
|