Skip to content

Commit

Permalink
Näytä kansalaiselle myös OAuth2-rajapinnan kautta katselut
Browse files Browse the repository at this point in the history
  • Loading branch information
AleksiAhtiainen committed Dec 30, 2024
1 parent 435239d commit 21ceac1
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,67 @@ class AuditLogService(app: KoskiApplication) extends Logging {
runQuery(oppijaOid).flatMap(results => HttpStatus.foldEithers(buildLogs(results).toSeq))
}

def queryLogsFromDynamoV2(oppijaOid: String): Either[HttpStatus, Seq[OrganisaationAuditLogitV2]] = {
runQueryV2(oppijaOid).flatMap(results => HttpStatus.foldEithers(buildLogsV2(results).toSeq))
}

private def runQuery(oppijaOid: String): Either[HttpStatus, Seq[util.Map[String, AttributeValue]]] = {
val querySpec = QueryRequest.builder
.tableName(AuditLogTableName)
.keyConditionExpression("studentOid = :oid")
.filterExpression("not contains (organizationOid, :self) and (contains (#rawEntry, :katsominen) or contains(#rawEntry, :varda_service))")
.filterExpression(
"not contains (organizationOid, :self) and (contains (#rawEntry, :katsominen) or contains(#rawEntry, :varda_service))".stripMargin)
.expressionAttributeNames(Map("#rawEntry" -> "raw").asJava)
.expressionAttributeValues({
val valueMap = new util.HashMap[String, AttributeValue]()
valueMap.put(":oid", AttributeValue.builder.s(oppijaOid).build)
valueMap.put(":self", AttributeValue.builder.s("self").build)
valueMap.put(":katsominen", AttributeValue.builder.s("\"OPISKELUOIKEUS_KATSOMINEN\"").build)
valueMap.put(":varda_service", AttributeValue.builder.s("\"varda\"").build)
valueMap
})

try {
Right(dynamoDB.query(querySpec.build()).items().asScala)
} catch {
case e: Exception => {
logger.error(e)(s"AuditLogien haku epäonnistui oidille $oppijaOid")
Left(KoskiErrorCategory.internalError())
}
}
}

private def runQueryV2(oppijaOid: String): Either[HttpStatus, Seq[util.Map[String, AttributeValue]]] = {
val querySpec = QueryRequest.builder
.tableName(AuditLogTableName)
.keyConditionExpression("studentOid = :oid")
.filterExpression(
"""not contains (organizationOid, :self) and
| (contains (#rawEntry, :katsominen) or
| contains (#rawEntry, :muutoshistoria_katsominen) or
| contains (#rawEntry, :ytr_katsominen) or
| contains (#rawEntry, :oauth2_katsominen_kaikki_tiedot) or
| contains (#rawEntry, :oauth2_katsominen_suoritetut_tutkinnot) or
| contains (#rawEntry, :oauth2_katsominen_aktiiviset_ja_paattyneet_opinnot) or
| contains (#rawEntry, :suoritusjako_katsominen) or
| contains (#rawEntry, :suoritusjako_katsominen_suoritetut_tutkinnot) or
| contains (#rawEntry, :oauth2_katsominen_aktiiviset_ja_paattyneet_opinnot) or
| contains(#rawEntry, :varda_service))
| """.stripMargin)
.expressionAttributeNames(Map("#rawEntry" -> "raw").asJava)
.expressionAttributeValues({
val valueMap = new util.HashMap[String, AttributeValue]()
valueMap.put(":oid", AttributeValue.builder.s(oppijaOid).build)
valueMap.put(":self", AttributeValue.builder.s("self").build)
valueMap.put(":katsominen", AttributeValue.builder.s("\"OPISKELUOIKEUS_KATSOMINEN\"").build)
valueMap.put(":muutoshistoria_katsominen", AttributeValue.builder.s("\"MUUTOSHISTORIA_KATSOMINEN\"").build)
valueMap.put(":ytr_katsominen", AttributeValue.builder.s("\"YTR_OPISKELUOIKEUS_KATSOMINEN\"").build)
valueMap.put(":suoritusjako_katsominen", AttributeValue.builder.s("\"KANSALAINEN_SUORITUSJAKO_KATSOMINEN\"").build)
valueMap.put(":suoritusjako_katsominen_suoritetut_tutkinnot", AttributeValue.builder.s("\"KANSALAINEN_SUORITUSJAKO_KATSOMINEN_SUORITETUT_TUTKINNOT\"").build)
valueMap.put(":suoritusjako_katsominen_aktiiviset_ja_paattyneet_opinnot", AttributeValue.builder.s("\"KANSALAINEN_SUORITUSJAKO_KATSOMINEN_AKTIIVISET_JA_PAATTYNEET_OPINNOT\"").build)
valueMap.put(":oauth2_katsominen_kaikki_tiedot", AttributeValue.builder.s("\"OAUTH2_KATSOMINEN_KAIKKI_TIEDOT\"").build)
valueMap.put(":oauth2_katsominen_suoritetut_tutkinnot", AttributeValue.builder.s("\"OAUTH2_KATSOMINEN_SUORITETUT_TUTKINNOT\"").build)
valueMap.put(":oauth2_katsominen_aktiiviset_ja_paattyneet_opinnot", AttributeValue.builder.s("\"OAUTH2_KATSOMINEN_AKTIIVISET_JA_PAATTYNEET_OPINNOT\"").build)
valueMap.put(":varda_service", AttributeValue.builder.s("\"varda\"").build)
valueMap
})
Expand Down Expand Up @@ -80,6 +130,22 @@ class AuditLogService(app: KoskiApplication) extends Logging {
}
}

private def buildLogsV2(queryResults: Seq[util.Map[String, AttributeValue]]): Iterable[Either[HttpStatus, OrganisaationAuditLogitV2]] = {
val timestampsGroupedByListOfOidsAndServiceName = queryResults.map(item => {
val parsedRow = convertToAuditLogRow(item)
val parsedRaw = JsonSerializer.parse[AuditlogRaw](parsedRow.raw, ignoreExtras = true)
val organisaatioOidit = parsedRow.organizationOid.sorted
val timestampString = parsedRow.time
val serviceName = parsedRaw.serviceName
(organisaatioOidit, serviceName, timestampString)
}).groupBy(x => (x._1, x._2)).mapValues(_.map(_._3))

timestampsGroupedByListOfOidsAndServiceName.map { case ((orgs, serviceName), timestamps) =>
HttpStatus.foldEithers(orgs.map(toOrganisaatio))
.map(orgs => OrganisaationAuditLogitV2(orgs, serviceName, timestamps))
}
}

private def toOrganisaatio(oid: String): Either[HttpStatus, Organisaatio] = {
val nimi = organisaatioRepository.getOrganisaatio(oid)
.flatMap(_.nimi)
Expand Down Expand Up @@ -118,3 +184,9 @@ case class Organisaatio(
oid: String,
name: LocalizedString
)

case class OrganisaationAuditLogitV2(
organizations: Seq[Organisaatio],
serviceName: String,
timestamps: Seq[String]
)
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,28 @@ class OmaOpintoPolkuLokiServlet(implicit val application: KoskiApplication) exte
})()
}

post("/auditlogsV2") {
withJsonBody({ body =>
val request = JsonSerializer.extract[AuditlogRequest](body)
val requestedHetu = request.hetu

val personOid: String = session.user.huollettavat.toList.flatMap {
case r: HuollettavienHakuOnnistui => r.huollettavat
.filter(_.hetu.exists(requestedHetu.contains))
.map(h => h.oid)
.flatMap {
case o: Some[String] => List(o.get)
case _ => List.empty
}
case _ => List.empty
}.headOption.getOrElse(session.oid)

renderEither(
auditLogs.queryLogsFromDynamoV2(personOid)
)
})()
}

get("/whoami") {
application.opintopolkuHenkilöFacade.findOppijaByOid(session.oid).map(h => {
val huollettavat: List[OmaOpintopolkuLokiHenkiloTiedot] = session.user.huollettavat.toList.flatMap {
Expand Down

0 comments on commit 21ceac1

Please sign in to comment.