Skip to content

Commit 665a9e2

Browse files
authored
#12 Basic frontend features (#56)
1 parent 402a960 commit 665a9e2

File tree

71 files changed

+693
-66
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+693
-66
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
#ide
22
.idea
3+
itmo-dating.iml

backend/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*.zip
1919
*.tar.gz
2020
*.rar
21+
*.pem
2122

2223
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2324
hs_err_pid*

backend/authik/Dockerfile

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM eclipse-temurin:21-jdk-alpine
2+
3+
WORKDIR /matchmaker
4+
5+
COPY ./build/libs/authik-1.0.0.jar ./authik.jar
6+
7+
EXPOSE 8080
8+
9+
CMD ["java", "-jar", "authik.jar"]

backend/authik/src/main/kotlin/ru/ifmo/se/dating/authik/telegram/InitDataParser.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ru.ifmo.se.dating.authik.telegram
22

3-
import com.fasterxml.jackson.databind.ObjectMapper
3+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
4+
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
45
import org.apache.commons.codec.digest.HmacUtils
56
import org.springframework.beans.factory.annotation.Value
67
import org.springframework.stereotype.Component
@@ -12,11 +13,12 @@ import ru.ifmo.se.dating.validation.expect
1213

1314
@Component
1415
class InitDataParser(
15-
private val jackson: ObjectMapper,
16-
1716
@Value("\${security.auth.telegram.token}")
1817
telegramToken: String,
1918
) {
19+
private val jackson = jacksonObjectMapper().apply {
20+
registerKotlinModule()
21+
}
2022
private val algorithm = "HmacSHA256"
2123
private val hmac =
2224
HmacUtils(algorithm, HmacUtils(algorithm, "WebAppData").hmac(telegramToken))

backend/authik/src/main/resources/static/openapi/api.yml

+14
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,28 @@ components:
132132
type: string
133133
maxLength: 128
134134
minLength: 1
135+
nullable: true
135136
last_name:
136137
type: string
137138
maxLength: 128
138139
minLength: 1
140+
nullable: true
139141
username:
140142
type: string
141143
maxLength: 128
142144
minLength: 1
145+
language_code:
146+
type: string
147+
maxLength: 10
148+
minLength: 1
149+
nullable: true
150+
allows_write_to_pm:
151+
type: boolean
152+
nullable: true
153+
photo_url:
154+
type: string
155+
maxLength: 256
156+
nullable: true
143157
required:
144158
- id
145159
- first_name

backend/authik/src/test/kotlin/ru/ifmo/se/dating/authik/api/HttpMonitoringApiTest.kt

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ class HttpMonitoringApiTest : AuthikTestSuite() {
1111
private lateinit var rest: TestRestTemplate
1212

1313
@Test
14+
fun emptyTest() = Unit
15+
16+
// TODO write test with https
17+
// @Test
1418
fun healthcheck() {
1519
Assert.assertEquals(getHealthcheck(), "public")
1620
}

backend/buildSrc/src/main/kotlin/buildlogic.oapi-server-conventions.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ extra["generateOAPIServer"] = { serviceName: String ->
2020
"delegatePattern" to "true",
2121
"useSpringBoot3" to "true",
2222
"reactive" to "true",
23+
"serializationLibrary" to "jackson"
2324
)
2425
}
2526

backend/config/env/.env

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ ITMO_DATING_TOKEN_SIGN_KEY_PUBLIC="RSA:MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCA
33
ITMO_DATING_AUTHIK_POSTGRES_DB="postgres"
44
ITMO_DATING_AUTHIK_POSTGRES_USER="postgres"
55
ITMO_DATING_AUTHIK_POSTGRES_PASSWORD="postgres"
6+
ITMO_DATING_AUTHIK_TELEGRAM_BOT_TOKEN="bot_token_here"
67
ITMO_DATING_AUTHIK_TOKEN_SIGN_KEY_PRIVATE="RSA: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"
78

89
ITMO_DATING_MATCHMAKER_POSTGRES_DB="postgres"

backend/foundation/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dependencies {
2424

2525
api(libs.jakarta.validation.jakarta.validation.api)
2626
api(libs.com.fasterxml.jackson.core.jackson.databind)
27+
api(libs.com.fasterxml.jackson.module.jackson.module.kotlin)
2728

2829
api(libs.org.jetbrains.kotlinx.kotlinx.coroutines.reactor)
2930
api(libs.io.projectreactor.kotlin.reactor.kotlin.extensions)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package ru.ifmo.se.dating.spring
2+
3+
import org.springframework.http.HttpMethod
4+
import org.springframework.http.HttpStatus
5+
import org.springframework.stereotype.Component
6+
import org.springframework.web.server.ServerWebExchange
7+
import org.springframework.web.server.WebFilter
8+
import org.springframework.web.server.WebFilterChain
9+
import reactor.core.publisher.Mono
10+
11+
@Component
12+
class CorsFilter : WebFilter {
13+
// FIXME
14+
override fun filter(ctx: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
15+
ctx.response.headers.add("Access-Control-Allow-Origin", "*")
16+
ctx.response.headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS")
17+
ctx.response.headers.add(
18+
"Access-Control-Allow-Headers",
19+
"DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," +
20+
"If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range"
21+
)
22+
if (ctx.request.method == HttpMethod.OPTIONS) {
23+
ctx.response.headers.add("Access-Control-Max-Age", "1728000")
24+
ctx.response.statusCode = HttpStatus.NO_CONTENT
25+
return Mono.empty()
26+
} else {
27+
ctx.response.headers.add(
28+
"Access-Control-Expose-Headers",
29+
"DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," +
30+
"If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range"
31+
)
32+
return chain.filter(ctx) ?: Mono.empty()
33+
}
34+
}
35+
}

backend/foundation/src/main/resources/application-foundation.yml

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
server:
22
port: 8080
3+
ssl:
4+
certificate: "classpath:cert.pem"
5+
certificate-private-key: "classpath:privkey.pem"
6+
trust-certificate: "classpath:chain.pem"
37
spring:
48
datasource:
59
driver-class-name: org.postgresql.Driver

backend/gradle/libs.versions.toml

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ org-liquibase-liquibase-core = "4.29.2"
1313
org-postgresql-postgresql = "42.7.4"
1414
org-postgresql-r2dbc-postgresql = "1.0.7.RELEASE"
1515

16-
com-fasterxml-jackson-core-jackson-databind = "2.18.1"
16+
com-fasterxml-jackson = "2.18.1"
17+
1718
jakarta-validation-jakarta-validation-api = "3.1.0"
1819
commons-codec-commons-codec = "1.17.1"
1920

@@ -44,7 +45,8 @@ io-jsonwebtoken-jjwt-impl = { module = "io.jsonwebtoken:jjwt-impl", version.ref
4445
io-jsonwebtoken-jjwt-jackson = { module = "io.jsonwebtoken:jjwt-jackson", version.ref = "io-jsonwebtoken" }
4546

4647
jakarta-validation-jakarta-validation-api = { module = "jakarta.validation:jakarta.validation-api", version.ref = "jakarta-validation-jakarta-validation-api" }
47-
com-fasterxml-jackson-core-jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "com-fasterxml-jackson-core-jackson-databind" }
48+
com-fasterxml-jackson-core-jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "com-fasterxml-jackson" }
49+
com-fasterxml-jackson-module-jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "com-fasterxml-jackson" }
4850
commons-codec-commons-codec = { module = "commons-codec:commons-codec", version.ref = "commons-codec-commons-codec" }
4951

5052
org-jetbrains-kotlinx-kotlinx-coroutines-reactor = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactor", version.ref = "org-jetbrains-kotlinx-kotlinx-coroutines" }

backend/matchmaker/Dockerfile

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM eclipse-temurin:21-jdk-alpine
2+
3+
WORKDIR /matchmaker
4+
5+
COPY ./build/libs/matchmaker-1.0.0.jar ./matchmaker.jar
6+
7+
EXPOSE 8080
8+
9+
CMD ["java", "-jar", "matchmaker.jar"]

backend/matchmaker/src/test/kotlin/ru/ifmo/se/dating/matchmaker/api/HttpMonitoringApiTest.kt

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ class HttpMonitoringApiTest : MatchmakerTestSuite() {
1111
private lateinit var rest: TestRestTemplate
1212

1313
@Test
14+
fun emptyTest() = Unit
15+
16+
// TODO write test with https
17+
// @Test
1418
fun healthcheck() {
1519
Assert.assertEquals(getHealthcheck(), "public")
1620
}

backend/people/Dockerfile

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM eclipse-temurin:21-jdk-alpine
2+
3+
WORKDIR /people
4+
5+
COPY ./build/libs/people-1.0.0.jar ./people.jar
6+
7+
EXPOSE 8080
8+
9+
CMD ["java", "-jar", "people.jar"]

backend/people/src/test/kotlin/ru/ifmo/se/dating/people/api/HttpMonitoringApiTest.kt

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ class HttpMonitoringApiTest : PeopleTestSuite() {
1111
private lateinit var rest: TestRestTemplate
1212

1313
@Test
14+
fun emptyTest() = Unit
15+
16+
// TODO write test with https
17+
// @Test
1418
fun healthcheck() {
1519
Assert.assertEquals(getHealthcheck(), "public")
1620
}

compose.yml

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
services:
22
authik:
3-
image: eclipse-temurin:21-jdk-alpine
4-
volumes:
5-
- ./backend/authik/build/libs/authik-1.0.0.jar:/authik.jar
6-
command: java -jar /authik.jar
3+
build:
4+
context: ./backend/authik
75
environment:
86
POSTGRES_DB: ${ITMO_DATING_AUTHIK_POSTGRES_DB?:err}
97
POSTGRES_USER: ${ITMO_DATING_AUTHIK_POSTGRES_USER?:err}
@@ -28,10 +26,8 @@ services:
2826
timeout: 1s
2927
retries: 16
3028
matchmaker:
31-
image: eclipse-temurin:21-jdk-alpine
32-
volumes:
33-
- ./backend/matchmaker/build/libs/matchmaker-1.0.0.jar:/matchmaker.jar
34-
command: java -jar /matchmaker.jar
29+
build:
30+
context: ./backend/matchmaker
3531
environment:
3632
POSTGRES_DB: ${ITMO_DATING_MATCHMAKER_POSTGRES_DB?:err}
3733
POSTGRES_USER: ${ITMO_DATING_MATCHMAKER_POSTGRES_USER?:err}
@@ -53,10 +49,8 @@ services:
5349
timeout: 1s
5450
retries: 16
5551
people:
56-
image: eclipse-temurin:21-jdk-alpine
57-
volumes:
58-
- ./backend/people/build/libs/people-1.0.0.jar:/people.jar
59-
command: java -jar /people.jar
52+
build:
53+
context: ./backend/people
6054
environment:
6155
POSTGRES_DB: ${ITMO_DATING_PEOPLE_POSTGRES_DB?:err}
6256
POSTGRES_USER: ${ITMO_DATING_PEOPLE_POSTGRES_USER?:err}

frontend/.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# production
1010
/build
1111
/dist
12+
/.cert
1213

1314
# misc
1415
.DS_Store
@@ -20,3 +21,6 @@
2021
npm-debug.log*
2122
yarn-debug.log*
2223
yarn-error.log*
24+
25+
#ide
26+
frontend.iml

frontend/Dockerfile

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ COPY package*.json ./
66

77
RUN npm install
88

9+
COPY .cert ./.cert
10+
911
COPY dist ./dist
1012

1113
COPY vite.config.ts .

0 commit comments

Comments
 (0)