Skip to content

Commit

Permalink
Add DistributedLockDAO
Browse files Browse the repository at this point in the history
  • Loading branch information
samanehsan committed Feb 29, 2024
1 parent 5b99a70 commit d1bef70
Showing 1 changed file with 85 additions and 0 deletions.
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

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L19-L23

Added lines #L19 - L23 were not covered by tests
.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

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L39-L44

Added lines #L39 - L44 were not covered by tests
DataAccessUtils.singleResult(
jdbcTemplate.query(query, namedParameters, DISTRIBUTED_LOCK_ROW_MAPPER)));
}

/**
* @param distributedLock The DistributedLock to insert
* @return distributedLock The DistributedLock that was inserted
*/
@WithSpan

Check warning on line 53 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L53

Added line #L53 was not covered by tests
public DistributedLock upsertDistributedLock(DistributedLock distributedLock) {
var query =
"INSERT INTO distributed_lock (lock_name, user_id, expires_at)"
+ " VALUES (:lockName, :userId, :expiresAt)";

Check warning on line 57 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L57

Added line #L57 was not covered by tests

var namedParameters =
new MapSqlParameterSource()
.addValue("lockName", distributedLock.getLockName())

Check warning on line 61 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L59-L61

Added lines #L59 - L61 were not covered by tests
.addValue("userId", distributedLock.getUserId())
.addValue("expiresAt", distributedLock.getExpiresAt());

Check warning on line 64 in service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L63-L64

Added lines #L63 - L64 were not covered by tests
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

View check run for this annotation

Codecov / codecov/patch

service/src/main/java/bio/terra/externalcreds/dataAccess/DistributedLockDAO.java#L74-L76

Added lines #L74 - L76 were not covered by tests
"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;
}
}

0 comments on commit d1bef70

Please sign in to comment.