Files
postgres-json/docs/usage/stored-procedure.md
2021-07-20 02:06:18 +02:00

2.4 KiB

Stored Procedure

Execute stored procedure with requester

You can execute a stored procedure (previously defined in a migration) via the Requester

To do that:

  1. First, instantiate the requester
import fr.postgresjson.connexion.Requester
import fr.postgresjson.connexion.Connection

val connection: Connection = TODO()

val requester = Requester(
    connection = connection,
    functionsDirectory = this::class.java.getResource("/sql/functions")?.toURI() ?: error("No sql function found")
).createRequester()
  1. then, define Entities
import java.util.UUID
import org.joda.time.DateTime
import fr.postgresjson.entity.Serializable

enum class Roles { ROLE_USER, ROLE_ADMIN }

class User(
    id: UUID = UUID.randomUUID(),
    override var username: String,
    var blockedAt: DateTime? = null,
    var roles: List<Roles> = emptyList()
): Serializable

class UserForCreate(
    id: UUID = UUID.randomUUID(),
    username: String,
    val password: String,
    blockedAt: DateTime? = null,
    roles: List<Roles> = emptyList()
): Serializable
  1. and, define Repositories See SQL function
import fr.postgresjson.connexion.Requester
import fr.postgresjson.repository.RepositoryI
import java.util.UUID

class UserRepository(override var requester: Requester): RepositoryI {
    fun findById(id: UUID): User {
        return requester
            .getFunction("find_user_by_id") // Use the name of the function
            .selectOne(
                "id" to id // You can pass parameters by their names. The underscore prefix on parameters is not required to be mapped. 
            ) ?: throw UserNotFound(id) // Throw exception if user not found
    }

    fun insert(user: UserForCreate): User {
        return requester
            .getFunction("insert_user")
            .selectOne("resource" to user)
    }

    class UserNotFound(override val message: String?, override val cause: Throwable?): Throwable(message, cause) {
        constructor(id: UUID): this("No User with ID $id", null)
    }
}
  1. And at last, execute queries
import fr.postgresjson.connexion.Requester
import java.util.UUID

val requester: Requester = TODO()
val userRepo = UserRepository(requester)

val user: User = userRepo.findById(UUID.fromString(id))

val newUser: UserForCreate = TODO()
val userInserted: User = userRepo.insert(newUser)