Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Supprime les étoiles dans les requêtes SQL #1155

Merged
merged 1 commit into from
Sep 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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