Skip to content

Commit

Permalink
Supprime les étoiles dans les requêtes SQL (#1155)
Browse files Browse the repository at this point in the history
  • Loading branch information
niladic committed Sep 6, 2021
1 parent 72b8835 commit 72334bd
Show file tree
Hide file tree
Showing 6 changed files with 224 additions and 140 deletions.
67 changes: 44 additions & 23 deletions app/services/ApplicationService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class ApplicationService @Inject() (

import dataModels.Application.SeenByUser._

private val (applicationParser, applicationTableFields) = Macros.parserWithFields[Application](
private val (parser, tableFields) = Macros.parserWithFields[Application](
"id",
"creation_date",
"creator_user_name",
Expand All @@ -84,9 +84,9 @@ class ApplicationService @Inject() (
"personal_data_wiped"
)

private val fieldsInSelect: String = applicationTableFields.mkString(", ")
private val fieldsInSelect: String = tableFields.mkString(", ")

private val simpleApplication: RowParser[Application] = applicationParser
private val simpleApplication: RowParser[Application] = parser
.map(application =>
application.copy(
creationDate = application.creationDate.withZoneSameInstant(Time.timeZoneParis),
Expand All @@ -98,15 +98,15 @@ class ApplicationService @Inject() (

private def setSeenByUsers(id: UUID, seenByUsers: List[SeenByUser])(implicit
cnx: Connection
) = {
): Option[Application] = {
val pgObject = new PGobject
pgObject.setType("json")
pgObject.setValue(toJson(seenByUsers).toString)

SQL("""UPDATE application
|SET seen_by_user_ids = {seen_by_users}::jsonb
|WHERE id = {id}::uuid
|RETURNING *;""".stripMargin)
SQL(s"""UPDATE application
|SET seen_by_user_ids = {seen_by_users}::jsonb
|WHERE id = {id}::uuid
|RETURNING $fieldsInSelect;""".stripMargin)
.on(
"id" -> id,
"seen_by_users" -> anorm.Object(pgObject)
Expand All @@ -115,9 +115,9 @@ class ApplicationService @Inject() (
}

private def byId(id: UUID)(implicit cnx: Connection) =
SQL("""SELECT *
|FROM application
|WHERE id = {id}::uuid;""".stripMargin)
SQL(s"""SELECT $fieldsInSelect
|FROM application
|WHERE id = {id}::uuid;""".stripMargin)
.on(
"id" -> id
)
Expand Down Expand Up @@ -155,7 +155,11 @@ class ApplicationService @Inject() (
def openAndOlderThan(day: Int) =
db.withConnection { implicit connection =>
SQL(
s"SELECT * FROM application WHERE closed = false AND age(creation_date) > '$day days' AND expert_invited = false"
s"""SELECT $fieldsInSelect
FROM application
WHERE closed = false
AND age(creation_date) > '$day days'
AND expert_invited = false"""
).as(simpleApplication.*)
}

Expand All @@ -165,7 +169,7 @@ class ApplicationService @Inject() (
referenceDate: ZonedDateTime
): List[Application] =
db.withConnection { implicit connection =>
val result = SQL("""SELECT * FROM application
val result = SQL(s"""SELECT $fieldsInSelect FROM application
|WHERE (creator_user_id = {userId}::uuid OR invited_users ?? {userId}) AND
| (closed = FALSE OR DATE_PART('day', {referenceDate} - closed_date) < 30)
|ORDER BY creation_date DESC""".stripMargin)
Expand All @@ -182,10 +186,10 @@ class ApplicationService @Inject() (
Future {
db.withConnection { implicit connection =>
val result = SQL(
"""SELECT * FROM application
WHERE creator_user_id = {userId}::uuid
AND closed = false
ORDER BY creation_date DESC"""
s"""SELECT $fieldsInSelect FROM application
WHERE creator_user_id = {userId}::uuid
AND closed = false
ORDER BY creation_date DESC"""
).on("userId" -> userId)
.as(simpleApplication.*)
result.map(_.anonymousApplication)
Expand All @@ -195,7 +199,11 @@ class ApplicationService @Inject() (
def allForUserId(userId: UUID, anonymous: Boolean) =
db.withConnection { implicit connection =>
val result = SQL(
"SELECT * FROM application WHERE creator_user_id = {userId}::uuid OR invited_users ?? {userId} ORDER BY creation_date DESC"
s"""SELECT $fieldsInSelect
FROM application
WHERE creator_user_id = {userId}::uuid
OR invited_users ?? {userId}
ORDER BY creation_date DESC"""
).on("userId" -> userId)
.as(simpleApplication.*)
if (anonymous) {
Expand All @@ -208,7 +216,13 @@ class ApplicationService @Inject() (
def allForUserIds(userIds: List[UUID]): Future[List[Application]] =
Future {
db.withConnection { implicit connection =>
SQL"SELECT * FROM application WHERE ARRAY[$userIds]::uuid[] @> ARRAY[creator_user_id]::uuid[] OR ARRAY(select jsonb_object_keys(invited_users))::uuid[] && ARRAY[$userIds]::uuid[] ORDER BY creation_date DESC"
SQL(
s"""SELECT $fieldsInSelect
FROM application
WHERE ARRAY[{userIds}]::uuid[] @> ARRAY[creator_user_id]::uuid[]
OR ARRAY(select jsonb_object_keys(invited_users))::uuid[] && ARRAY[{userIds}]::uuid[]
ORDER BY creation_date DESC"""
).on("userIds" -> userIds)
.as(simpleApplication.*)
.map(_.anonymousApplication)
}
Expand All @@ -217,8 +231,12 @@ class ApplicationService @Inject() (
def allByArea(areaId: UUID, anonymous: Boolean) =
db.withConnection { implicit connection =>
val result =
SQL("SELECT * FROM application WHERE area = {areaId}::uuid ORDER BY creation_date DESC")
.on("areaId" -> areaId)
SQL(
s"""SELECT $fieldsInSelect
FROM application
WHERE area = {areaId}::uuid
ORDER BY creation_date DESC"""
).on("areaId" -> areaId)
.as(simpleApplication.*)
if (anonymous) {
result.map(_.anonymousApplication)
Expand All @@ -237,7 +255,8 @@ class ApplicationService @Inject() (
s"interval '$months month'"
)
.orEmpty
SQL(s"""SELECT * FROM application
SQL(s"""SELECT $fieldsInSelect
FROM application
WHERE ARRAY[{areaIds}]::uuid[] @> ARRAY[area]::uuid[]
$additionalFilter
ORDER BY creation_date DESC""")
Expand All @@ -250,7 +269,9 @@ class ApplicationService @Inject() (
def all(): Future[List[Application]] =
Future {
db.withConnection { implicit connection =>
SQL"""SELECT * FROM application""".as(simpleApplication.*).map(_.anonymousApplication)
SQL(s"""SELECT $fieldsInSelect FROM application""")
.as(simpleApplication.*)
.map(_.anonymousApplication)
}
}

Expand Down
49 changes: 28 additions & 21 deletions app/services/EventService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import java.util.UUID

import actions.RequestWithUserData
import anorm._
import aplus.macros.Macros
import cats.syntax.all._
import helper.Time
import javax.inject.Inject
Expand All @@ -21,7 +22,7 @@ class EventService @Inject() (db: Database, dependencies: ServicesDependencies)

private val logger = Logger(classOf[EventService])

private val simpleEvent: RowParser[Event] = Macro.parser[Event](
private val (simpleEvent, tableFields) = Macros.parserWithFields[Event](
"id",
"level",
"code",
Expand All @@ -35,6 +36,8 @@ class EventService @Inject() (db: Database, dependencies: ServicesDependencies)
"ip_address"
)

private val fieldsInSelect: String = tableFields.mkString(", ")

def log(
event: EventType,
description: String,
Expand Down Expand Up @@ -164,32 +167,36 @@ class EventService @Inject() (db: Database, dependencies: ServicesDependencies)
db.withConnection { implicit connection =>
(fromUserId, date) match {
case (Some(userId), Some(date)) =>
SQL"""SELECT *, host(ip_address)::TEXT AS ip_address
FROM "event"
WHERE (from_user_id = $userId::uuid OR to_user_id = $userId::uuid)
AND date_trunc('day',creation_date) = $date
ORDER BY creation_date DESC
LIMIT $limit"""
SQL(s"""SELECT $fieldsInSelect, host(ip_address)::TEXT AS ip_address
FROM "event"
WHERE (from_user_id = {userId}::uuid OR to_user_id = {userId}::uuid)
AND date_trunc('day',creation_date) = {date}
ORDER BY creation_date DESC
LIMIT {limit}""")
.on("userId" -> userId, "date" -> date, "limit" -> limit)
.as(simpleEvent.*)
case (None, Some(date)) =>
SQL"""SELECT *, host(ip_address)::TEXT AS ip_address
FROM "event"
WHERE date_trunc('day',creation_date) = $date
ORDER BY creation_date DESC
LIMIT $limit"""
SQL(s"""SELECT $fieldsInSelect, host(ip_address)::TEXT AS ip_address
FROM "event"
WHERE date_trunc('day',creation_date) = {date}
ORDER BY creation_date DESC
LIMIT {limit}""")
.on("date" -> date, "limit" -> limit)
.as(simpleEvent.*)
case (Some(userId), None) =>
SQL"""SELECT *, host(ip_address)::TEXT AS ip_address
FROM "event"
WHERE from_user_id = $userId::uuid OR to_user_id = $userId::uuid
ORDER BY creation_date DESC
LIMIT $limit"""
SQL(s"""SELECT $fieldsInSelect, host(ip_address)::TEXT AS ip_address
FROM "event"
WHERE from_user_id = {userId}::uuid OR to_user_id = {userId}::uuid
ORDER BY creation_date DESC
LIMIT {limit}""")
.on("userId" -> userId, "limit" -> limit)
.as(simpleEvent.*)
case (None, None) =>
SQL"""SELECT *, host(ip_address)::TEXT AS ip_address
FROM "event"
ORDER BY creation_date DESC
LIMIT $limit"""
SQL(s"""SELECT $fieldsInSelect, host(ip_address)::TEXT AS ip_address
FROM "event"
ORDER BY creation_date DESC
LIMIT {limit}""")
.on("limit" -> limit)
.as(simpleEvent.*)
}
}
Expand Down
28 changes: 17 additions & 11 deletions app/services/MandatService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class MandatService @Inject() (
)
)

private val (mandatRowParser, mandatTableFields) = Macros.parserWithFields[Mandat](
private val (mandatRowParser, tableFields) = Macros.parserWithFields[Mandat](
"id",
"user_id",
"creation_date",
Expand All @@ -57,13 +57,14 @@ class MandatService @Inject() (
"personal_data_wiped"
)

private val fieldsInSelect: String = mandatTableFields.mkString(", ")
private val fieldsInSelect: String = tableFields.mkString(", ")

private def byIdNoAuthorizationCheck(id: Mandat.Id): Future[Either[Error, Mandat]] =
Future(
Try(
db.withTransaction { implicit connection =>
SQL"""SELECT * FROM mandat WHERE id = ${id.underlying}::uuid"""
SQL(s"""SELECT $fieldsInSelect FROM mandat WHERE id = {id}::uuid""")
.on("id" -> id.underlying)
.as(mandatRowParser.singleOpt)
}
).toEither.left
Expand Down Expand Up @@ -139,7 +140,8 @@ class MandatService @Inject() (
)
""".executeInsert(SqlParser.scalar[UUID].singleOpt)

SQL"""SELECT * FROM mandat WHERE id = $id::uuid"""
SQL(s"""SELECT $fieldsInSelect FROM mandat WHERE id = {id}::uuid""")
.on("id" -> id)
.as(mandatRowParser.singleOpt)
// `.get` is OK here, we want to rollback if we cannot get back the entity
.get
Expand Down Expand Up @@ -214,11 +216,15 @@ class MandatService @Inject() (
db.withTransaction { implicit connection =>
val localPhone = sms.originator.toLocalPhoneFrance
// Check if a thread is open
val allOpenMandats = SQL"""SELECT * FROM mandat
WHERE usager_phone_local = $localPhone
AND sms_thread_closed = false
"""
.as(mandatRowParser.*)
val allOpenMandats =
SQL(
s"""SELECT $fieldsInSelect
FROM mandat
WHERE usager_phone_local = {localPhone}
AND sms_thread_closed = false
"""
).on("localPhone" -> localPhone)
.as(mandatRowParser.*)
allOpenMandats.headOption match {
case None =>
Left(
Expand Down Expand Up @@ -256,9 +262,9 @@ class MandatService @Inject() (
Future(
Try {
val before = ZonedDateTime.now().minusMonths(retentionInMonths)
val selectFields = mandatTableFields.map(field => s"mandat.$field").mkString(", ")
val fields = tableFields.map(field => s"mandat.$field").mkString(", ")
val mandats = db.withConnection { implicit connection =>
SQL(s"""SELECT $selectFields
SQL(s"""SELECT $fields
FROM mandat
LEFT JOIN application ON mandat.application_id = application.id
WHERE mandat.personal_data_wiped = false
Expand Down
43 changes: 26 additions & 17 deletions app/services/SignupService.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package services

import anorm._
import aplus.macros.Macros
import cats.syntax.all._
import java.time.Instant
import java.util.UUID
Expand All @@ -18,19 +19,21 @@ class SignupService @Inject() (
) {
import dependencies.databaseExecutionContext

private val signupRequestRowParser: RowParser[SignupRequest] = Macro
.parser[SignupRequest](
"id",
"request_date",
"email",
"inviting_user_id"
)
private val (signupRequestRowParser, tableFields) = Macros.parserWithFields[SignupRequest](
"id",
"request_date",
"email",
"inviting_user_id"
)

private val fieldsInSelect: String = tableFields.mkString(", ")

def byId(signupId: UUID): Future[Either[Error, Option[SignupRequest]]] =
Future(
Try(
db.withTransaction { implicit connection =>
SQL"""SELECT * FROM signup_request WHERE id = $signupId::uuid"""
SQL(s"""SELECT $fieldsInSelect FROM signup_request WHERE id = {signupId}::uuid""")
.on("signupId" -> signupId)
.as(signupRequestRowParser.singleOpt)
}
).toEither.left
Expand All @@ -47,7 +50,10 @@ class SignupService @Inject() (
Future(
Try(
db.withTransaction { implicit connection =>
SQL"""SELECT * FROM signup_request WHERE lower(email) = ${email.toLowerCase}"""
SQL(s"""SELECT $fieldsInSelect
FROM signup_request
WHERE lower(email) = {email}""")
.on("email" -> email.toLowerCase)
.as(signupRequestRowParser.singleOpt)
}
).toEither.left
Expand All @@ -65,8 +71,9 @@ class SignupService @Inject() (
Try {
val lowerCaseEmails = emails.map(_.toLowerCase)
db.withConnection { implicit connection =>
SQL"""SELECT * FROM signup_request
WHERE ARRAY[$lowerCaseEmails]::text[] @> ARRAY[lower(email)]::text[]"""
SQL(s"""SELECT $fieldsInSelect FROM signup_request
WHERE ARRAY[{emails}]::text[] @> ARRAY[lower(email)]::text[]""")
.on("emails" -> lowerCaseEmails)
.as(signupRequestRowParser.*)
}
}.toEither.left
Expand All @@ -83,12 +90,14 @@ class SignupService @Inject() (
Future(
Try(
db.withTransaction { implicit connection =>
SQL"""SELECT
signup_request.*,
"user".id AS signedup_user_id
FROM signup_request
LEFT JOIN "user" ON LOWER("user".email) = LOWER(signup_request.email)
WHERE request_date >= $afterDate"""
val fields = tableFields.map(field => s"signup_request.$field").mkString(", ")
SQL(s"""SELECT
$fields,
"user".id AS signedup_user_id
FROM signup_request
LEFT JOIN "user" ON LOWER("user".email) = LOWER(signup_request.email)
WHERE request_date >= {afterDate}""")
.on("afterDate" -> afterDate)
.as((signupRequestRowParser ~ SqlParser.get[Option[UUID]]("signedup_user_id")).*)
.map { case a ~ b => (a, b) }
}
Expand Down
Loading

0 comments on commit 72334bd

Please sign in to comment.