-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
package bio.terra.externalcreds.dataAccess; | ||
|
||
import bio.terra.externalcreds.models.DistributedLock; | ||
import io.opentelemetry.instrumentation.annotations.WithSpan; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.dao.support.DataAccessUtils; | ||
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.util.Optional; | ||
|
||
@Repository | ||
@Slf4j | ||
public class DistributedLockDAO { | ||
|
||
private static final RowMapper<DistributedLock> DISTRIBUTED_LOCK_ROW_MAPPER = | ||
((rs, rowNum) -> | ||
new DistributedLock.Builder() | ||
.lockName(rs.getString("lock_name")) | ||
.userId(rs.getString("user_id")) | ||
.expiresAt(rs.getTimestamp("expires_at")) | ||
Check warning on line 23 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java
|
||
.build()); | ||
|
||
final NamedParameterJdbcTemplate jdbcTemplate; | ||
|
||
public DistributedLockDAO(NamedParameterJdbcTemplate jdbcTemplate) { | ||
this.jdbcTemplate = jdbcTemplate; | ||
} | ||
|
||
/** | ||
* @param lockName The name of the lock, e.g {provider}-createKey | ||
* @param userId The Sam user id | ||
* @return Optional<DistributedLock> An optional containing the distributed lock with this lockName and userId (or empty) | ||
*/ | ||
@WithSpan | ||
public Optional<DistributedLock> getDistributedLock(String lockName, String userId) { | ||
var namedParameters = | ||
new MapSqlParameterSource() | ||
.addValue("lockName", lockName) | ||
.addValue("userId", userId); | ||
var query = "SELECT * FROM distributed_lock WHERE lock_name = :lockName AND user_id = :userId"; | ||
return Optional.ofNullable( | ||
Check warning on line 44 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java
|
||
DataAccessUtils.singleResult( | ||
jdbcTemplate.query(query, namedParameters, DISTRIBUTED_LOCK_ROW_MAPPER))); | ||
} | ||
|
||
/** | ||
* @param distributedLock The DistributedLock to insert | ||
* @return distributedLock The DistributedLock that was inserted | ||
*/ | ||
@WithSpan | ||
public DistributedLock upsertDistributedLock(DistributedLock distributedLock) { | ||
var query = | ||
"INSERT INTO distributed_lock (lock_name, user_id, expires_at)" | ||
+ " VALUES (:lockName, :userId, :expiresAt)"; | ||
|
||
var namedParameters = | ||
new MapSqlParameterSource() | ||
.addValue("lockName", distributedLock.getLockName()) | ||
Check warning on line 61 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java
|
||
.addValue("userId", distributedLock.getUserId()) | ||
.addValue("expiresAt", distributedLock.getExpiresAt()); | ||
|
||
Check warning on line 64 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java
|
||
jdbcTemplate.update(query, namedParameters); | ||
return distributedLock; | ||
} | ||
|
||
/** | ||
* @param lockName The name of the lock, e.g {provider}-createKey | ||
* @param userId The Sam user id | ||
* @return boolean whether a distributed lock was found and deleted | ||
*/ | ||
@WithSpan | ||
public boolean deleteDistributedLock(String lockName, String userId) { | ||
var query = | ||
Check warning on line 76 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java
|
||
"DELETE FROM distributed_lock WHERE lock_name = :lockName AND user_id = :userId"; | ||
var namedParameters = | ||
new MapSqlParameterSource() | ||
.addValue("lockName", lockName) | ||
.addValue("userId", userId); | ||
|
||
return jdbcTemplate.update(query, namedParameters) > 0; | ||
} | ||
} |