Skip to content

Commit

Permalink
Merge pull request #3 from Opetushallitus/OK-756-swagger
Browse files Browse the repository at this point in the history
Ok 756 swagger
  • Loading branch information
heidilm authored Dec 5, 2024
2 parents 0789917 + 5a4721a commit 92d4107
Show file tree
Hide file tree
Showing 83 changed files with 4,271 additions and 626 deletions.
47 changes: 46 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,46 @@
# ovara-virkailija
## Ovara-virkailija - Opiskelijavalinnan raportoinnin virkailijakäyttöliittymä

Ovara koostuu kahdesta sovelluksesta: Spring bootilla ja Scalalla toteutetusta backendistä,
jonka tarjoamien HTTP-rajapintojen kautta Next.js:llä toteutettu käyttöliittymä noutaa virkailijoiden tarvitsemia raportteja.
Käyttöliittymässä käyttäjä täyttää lomakkeen avulla kyselyn, jonka perusteella backend noutaa tiedot Ovaran omasta tietokannasta ja
muodostaa excel-tiedoston, joka ladataan käyttäjän selaimeen.

# Ovara-backendin

Backend käyttää Java Corretton versiota 21.

Backendiä ajetaan IDEA:ssa. Kehitysympäristön konfiguraatio määritellään `application-dev.properties`-nimisessä tiedostossa
````
spring.datasource.url=jdbc:postgresql://localhost:5432/ovara
spring.datasource.username=app
spring.datasource.password=app
opintopolku.virkailija.domain=https://virkailija.hahtuvaopintopolku.fi
cas.url=${opintopolku.virkailija.domain}/cas
ovara.ui.url=https://localhost:3405
ovara.backend.url=http://localhost:8080/ovara-backend
ovara-backend.cas.password=<CAS-SALASANA>
#logging.level.org.springframework.cache=TRACE
````

Backendiä voi ajaa sekä lokaalia dockeriin käynnistettävää postgresia että testiympäristön tietokantaa vasten.
(Kirjoitushetkellä ovaran tietokanta on olemassa pelkästään QA:lla.) `justfile`:stä
löytyvät komennot tietokannan pystyttämiseen tai tietokantayhteyden avaamiseen. [just](https://github.com/casey/just) on
komentorivityökalu komentojen dokumentoimiseen ja ajamiseen. Esimerkiksi `just ssh-to-remote-db-in-pallero` avaa tietokantayhteyden
QA:n ovara-tietokantaan. Lokaalin tietokannan käyttäminen vaatii tietokantadumpin lataamisen omalle koneelle,
ja sen voi tehdä komennolla `just dump-remote-db`. `just`:in asentaminen ei ole välttämätöntä backendin ajamiseksi,
vaan voit katsoa tarvittavat komennot `justfile`:stä ja ajaa ne sellaisinaan komentoriviltä.

Ovara-backendin rajapinta on dokumentoitu Swaggeriä käyttäen ja se löytyy osoitteesta: `http://localhost:8080/ovara-backend/swagger-ui/index.html`.
Rajapintojen kutsuminen edellyttää kirjautumista. Kehitysympäristössä tämä tapahtuu helpoiten siten, että myös ovara-ui on
lokaalisti käynnissä ja kirjaudut sen kautta sisään ennen swaggerin rajapintojen käyttämistä.




# Ovara-ui

Ovara-ui on toteutettu Next.js:llä.

Käyttöliittymän saa käynnistettyä komennolla `npm run dev`. Käyttöliittymä avautuu osoitteeseen: `https://localhost:3405`.
Empty file.
5 changes: 5 additions & 0 deletions ovara-backend/.scalafmt.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
version = 2.7.5
maxColumn = 120
assumeStandardLibraryStripMargin = true
align.preset = more
includeCurlyBraceInSelectChains = false
10 changes: 8 additions & 2 deletions ovara-backend/justfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,21 @@ remote-ip := "10.20.89.144"
_default:
just --list --unsorted

mfa-pallero-bastion:
ssh pallero-bastion
ssh-to-remote-db-in-pallero:
ssh -N -L 5433:rds-privatelink.ovara.testiopintopolku.fi:5432 pallero-bastion



connect-to-remote-db:
sshuttle -l 0.0.0.0 -r pallero-bastion {{remote-ip}}/32

# DB DUMP FOR LOCAL POSTGRES
dump-remote-db:
docker run --rm -it -v "$(pwd)":/work -w /work postgres pg_dump -h {{remote-ip}} -p 5432 -U app -Fc ovara -n pub -n int -f ovara.dump

watch-dump-progress:
watch -n 1 du -h ovara.dump

start-postgresql:
docker compose up

Expand Down
58 changes: 46 additions & 12 deletions ovara-backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>fi.oph.ovara</groupId>
Expand All @@ -28,8 +28,8 @@
</scm>
<properties>
<scala.version>3.5.0</scala.version>
<spring.boot.version>3.3.3</spring.boot.version>
<java.cas.version>1.2.1-SNAPSHOT</java.cas.version>
<scalatest.version>3.2.19</scalatest.version>
</properties>
<dependencies>
<dependency>
Expand All @@ -54,7 +54,6 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
Expand All @@ -66,11 +65,6 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-annotations-jakarta</artifactId>
<version>2.2.19</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
Expand All @@ -85,10 +79,6 @@
<artifactId>slick_3</artifactId>
<version>3.5.0-M5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
Expand Down Expand Up @@ -117,6 +107,50 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_3</artifactId>
</dependency>
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_3</artifactId>
<version>${scalatest.version}</version>
</dependency>
<dependency>
<groupId>org.scalactic</groupId>
<artifactId>scalactic_3</artifactId>
<version>${scalatest.version}</version>
</dependency>
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_3</artifactId>
<version>4.1.0-M7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
4 changes: 4 additions & 0 deletions ovara-backend/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ ovara.ui.url=${opintopolku.virkailija.domain}
cas.url=${opintopolku.virkailija.domain}/cas
ovara-backend.cas.username=ovara_backend
ovara-backend.cas.password=<password>

#swagger-ui config
springdoc.swagger-ui.path=/swagger-ui
springdoc.swagger-ui.operationsSorter=alpha
Original file line number Diff line number Diff line change
@@ -1,28 +1,27 @@
package fi.oph.ovara.backend;

import fi.oph.ovara.backend.repository.OvaraDatabase
import org.springframework.beans.factory.annotation.Autowired
import org.slf4j.{Logger, LoggerFactory}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.{ApplicationArguments, ApplicationRunner, SpringApplication}
import org.springframework.context.annotation.{Bean, Profile}
import org.springframework.web.servlet.config.annotation.{CorsRegistry, WebMvcConfigurer}

object OvaraBackendApplication {
def main(args: Array[String]): Unit = {
SpringApplication.run(classOf[OvaraBackendApplication], args*)
}
val CALLER_ID = "1.2.246.562.10.00000000001.ovara-virkailija"

def main(args: Array[String]): Unit = {
SpringApplication.run(classOf[OvaraBackendApplication], args *)
}
}

@SpringBootApplication
class OvaraBackendApplication {
@Autowired
val db: OvaraDatabase = null

val LOG: Logger = LoggerFactory.getLogger(classOf[OvaraBackendApplication])

@Bean
def applicationRunner(): ApplicationRunner =
new ApplicationRunner:
override def run(args: ApplicationArguments): Unit =
println("STARTED OVARA APPLICATION RUNNER")
(args: ApplicationArguments) => LOG.info("STARTED OVARA APPLICATION RUNNER")

@Profile(Array("dev"))
@Bean
Expand All @@ -31,4 +30,4 @@ class OvaraBackendApplication {
registry.addMapping("/**").allowedOrigins("https://localhost:3405")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package fi.oph.ovara.backend.domain

trait EnumType {
def name: String

override def toString: String = name
}

trait Enum[T <: EnumType] {
def name: String

def values: List[T]

def withName(n: String): T = values.find(_.name.equals(n))
.getOrElse(throw new IllegalArgumentException(s"Unknown ${name} '${n}'"))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package fi.oph.ovara.backend.domain

case class Haku(haku_oid: String,
haku_nimi: Kielistetty)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package fi.oph.ovara.backend.domain

sealed trait Kieli extends EnumType with Product with Serializable

object Kieli extends Enum[Kieli] {
override def name: String = "kieli"
def values = List(Fi, Sv, En)
}

case object Fi extends Kieli { val name = "fi" }
case object Sv extends Kieli { val name = "sv" }
case object En extends Kieli { val name = "en" }

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package fi.oph.ovara.backend.domain

case class KoulutuksetToteutuksetHakukohteetResult(
hakukohdeNimi: Kielistetty,
hakukohdeOid: String,
koulutuksenTila: Option[String] = None,
toteutuksenTila: Option[String] = None,
hakukohteenTila: Option[String] = None,
aloituspaikat: Option[Int] = None,
onValintakoe: Option[Boolean] = None,
voiSuorittaaKaksoistutkinnon: Option[Boolean] = None,
jarjestaaUrheilijanAmmKoulutusta: Option[Boolean] = None
)

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@ package fi.oph.ovara.backend.domain

import scala.beans.BeanProperty

case class UserResponseUser(@BeanProperty userOid: String)
case class UserResponse(@BeanProperty user: UserResponseUser)
case class User(@BeanProperty userOid: String,
@BeanProperty authorities: List[String],
@BeanProperty asiointikieli: Option[String] = None)

case class UserResponse(@BeanProperty user: User)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package fi.oph.ovara.backend

package object domain {
type Kielistetty = Map[Kieli, String]

val ammatillisetHakukohdekoodit = List(
"10", // Aikuiskoulutus
"19", // Aikuisten perusopetus
"15", // Ammatillinen peruskoulutus erityisopetuksena
"11", // Perusopetuksen jälkeisen koulutuksen yhteishaku
"20", // Erityisopetuksena järjestettävä ammatillinen koulutus
"23", // Ammatillinen koulutus
"24", // Lukiokoulutus
"21", // Yhteishaun ulkopuolinen lukiokoulutus
)
}
Loading

0 comments on commit 92d4107

Please sign in to comment.