Skip to content

Commit 4a277c3

Browse files
authored
Merge pull request #18 from NLipatov/feature/1
Feature/1
2 parents 789faea + 2dff58a commit 4a277c3

File tree

8 files changed

+513
-10
lines changed

8 files changed

+513
-10
lines changed

docker-compose.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ services:
119119
- PROXY_KAFKA_GROUP_ID=traffic-processor
120120
- PROXY_KAFKA_BOOTSTRAP_SERVERS=kafka:9092
121121
- PROXY_KAFKA_TOPIC=${PROXY_KAFKA_TOPIC}
122+
- TC_CACHE_HOST=${TC_CACHE_HOST}
123+
- TC_CACHE_PORT=${TC_CACHE_PORT}
124+
- TC_CACHE_USER=${TC_CACHE_USER}
125+
- TC_CACHE_PASSWORD=${TC_CACHE_PASSWORD}
122126
depends_on:
123127
init-kafka-topics:
124128
condition: service_completed_successfully
@@ -160,7 +164,7 @@ services:
160164
- "9092:9092"
161165
- "9093:9093"
162166
environment:
163-
KAFKA_BROKER_ID: 1
167+
KAFKA_BROKER_ID: -1
164168
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
165169
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9093
166170
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

src/go.mod

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ require (
1414
)
1515

1616
require (
17+
cloud.google.com/go/auth v0.13.0 // indirect
18+
cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect
19+
cloud.google.com/go/compute/metadata v0.6.0 // indirect
1720
dario.cat/mergo v1.0.1 // indirect
1821
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
1922
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
@@ -35,7 +38,10 @@ require (
3538
github.com/go-logr/stdr v1.2.2 // indirect
3639
github.com/go-ole/go-ole v1.3.0 // indirect
3740
github.com/gogo/protobuf v1.3.2 // indirect
41+
github.com/google/s2a-go v0.1.8 // indirect
3842
github.com/google/uuid v1.6.0 // indirect
43+
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
44+
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
3945
github.com/klauspost/compress v1.17.11 // indirect
4046
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
4147
github.com/magiconair/properties v1.8.9 // indirect
@@ -64,13 +70,17 @@ require (
6470
go.opentelemetry.io/otel v1.33.0 // indirect
6571
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect
6672
go.opentelemetry.io/otel/metric v1.33.0 // indirect
67-
go.opentelemetry.io/otel/sdk v1.21.0 // indirect
73+
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
6874
go.opentelemetry.io/otel/trace v1.33.0 // indirect
69-
golang.org/x/net v0.23.0 // indirect
75+
golang.org/x/net v0.33.0 // indirect
76+
golang.org/x/oauth2 v0.25.0 // indirect
7077
golang.org/x/sys v0.29.0 // indirect
71-
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
72-
google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect
73-
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect
74-
google.golang.org/protobuf v1.33.0 // indirect
78+
golang.org/x/text v0.21.0 // indirect
79+
golang.org/x/time v0.9.0 // indirect
80+
google.golang.org/api v0.216.0 // indirect
81+
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect
82+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect
83+
google.golang.org/grpc v1.69.2 // indirect
84+
google.golang.org/protobuf v1.36.1 // indirect
7585
gopkg.in/yaml.v3 v3.0.1 // indirect
7686
)

src/go.sum

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
22
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
3+
cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw=
4+
cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
5+
cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
6+
cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
7+
cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
8+
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
9+
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
310
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
411
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
512
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
@@ -113,10 +120,16 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
113120
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
114121
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
115122
github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
123+
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
124+
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
116125
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
117126
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
118127
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
119128
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
129+
github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
130+
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
131+
github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q=
132+
github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
120133
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
121134
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
122135
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
@@ -247,6 +260,7 @@ go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5W
247260
go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M=
248261
go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
249262
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
263+
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
250264
go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s=
251265
go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck=
252266
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
@@ -278,8 +292,12 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
278292
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
279293
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
280294
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
295+
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
296+
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
281297
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
282298
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
299+
golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
300+
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
283301
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
284302
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
285303
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -316,6 +334,8 @@ golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
316334
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
317335
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
318336
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
337+
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
338+
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
319339
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
320340
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
321341
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -329,6 +349,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
329349
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
330350
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
331351
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
352+
google.golang.org/api v0.216.0 h1:xnEHy+xWFrtYInWPy8OdGFsyIfWJjtVnO39g7pz2BFY=
353+
google.golang.org/api v0.216.0/go.mod h1:K9wzQMvWi47Z9IU7OgdOofvZuw75Ge3PPITImZR/UyI=
332354
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
333355
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
334356
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
@@ -338,8 +360,11 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY
338360
google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
339361
google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY=
340362
google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=
363+
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08=
341364
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=
342365
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=
366+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw=
367+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4=
343368
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
344369
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
345370
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
@@ -350,6 +375,8 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ
350375
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
351376
google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA=
352377
google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0=
378+
google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
379+
google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
353380
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
354381
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
355382
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -365,6 +392,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
365392
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
366393
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
367394
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
395+
google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
396+
google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
368397
gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A=
369398
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
370399
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

src/infrastructure/config/rate_limiter_config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func LoadRateLimiterConfig() RateLimiterConfig {
110110
}
111111

112112
// Set MaxConns
113-
config.MaxConns = config.MaxUsers * 10 // For example, 10 connections per user
113+
config.MaxConns = config.MaxUsers * 25 // For example, 25 connections per user
114114

115115
// Optionally, allow overriding MaxConns via environment variables
116116
maxConnsStr := os.Getenv("MAX_CONNS")
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package restapi
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"io"
8+
"log"
9+
"net/http"
10+
"os"
11+
"strconv"
12+
13+
"golang.org/x/oauth2"
14+
"golang.org/x/oauth2/google"
15+
)
16+
17+
func getPort() int {
18+
portEnvValue := os.Getenv("SERVE_PORT")
19+
if portEnvValue == "" {
20+
log.Fatalf("SERVE_PORT environment variable is not set")
21+
}
22+
23+
port, err := strconv.Atoi(portEnvValue)
24+
if err != nil {
25+
log.Fatalf("SERVE_PORT environment variable is not a number")
26+
}
27+
28+
return port
29+
}
30+
31+
func getGoogleOauthConfig() *oauth2.Config {
32+
clientSecret := os.Getenv("GOOGLE_AUTH_CLIENT_SECRET")
33+
if clientSecret == "" {
34+
log.Fatalf("GOOGLE_AUTH_CLIENT_SECRET environment variable is not set")
35+
}
36+
37+
clientId := os.Getenv("GOOGLE_AUTH_CLIENT_ID")
38+
if clientId == "" {
39+
log.Fatalf("GOOGLE_AUTH_CLIENT_ID environment variable is not set")
40+
}
41+
42+
return &oauth2.Config{
43+
ClientID: clientId,
44+
ClientSecret: clientSecret,
45+
RedirectURL: fmt.Sprintf("http://localhost:%d/auth/callback", getPort()),
46+
Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
47+
Endpoint: google.Endpoint,
48+
}
49+
}
50+
51+
func HandleGoogleAuth() {
52+
http.HandleFunc("/auth/login", handleGoogleLogin)
53+
http.HandleFunc("/auth/callback", handleGoogleCallback)
54+
log.Println(fmt.Sprintf("Server is running on http://localhost:%d", getPort()))
55+
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", getPort()), nil))
56+
}
57+
58+
func handleGoogleLogin(w http.ResponseWriter, r *http.Request) {
59+
url := getGoogleOauthConfig().AuthCodeURL("state-token", oauth2.AccessTypeOffline)
60+
http.Redirect(w, r, url, http.StatusTemporaryRedirect)
61+
}
62+
63+
func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
64+
if r.URL.Query().Get("state") != "state-token" {
65+
http.Error(w, "State mismatch", http.StatusBadRequest)
66+
return
67+
}
68+
69+
code := r.URL.Query().Get("code")
70+
token, err := getGoogleOauthConfig().Exchange(context.Background(), code)
71+
if err != nil {
72+
http.Error(w, "Failed to exchange token: "+err.Error(), http.StatusInternalServerError)
73+
return
74+
}
75+
76+
client := getGoogleOauthConfig().Client(context.Background(), token)
77+
resp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")
78+
if err != nil {
79+
http.Error(w, "Failed to get user info: "+err.Error(), http.StatusInternalServerError)
80+
return
81+
}
82+
defer func(Body io.ReadCloser) {
83+
_ = Body.Close()
84+
}(resp.Body)
85+
86+
userInfo := struct {
87+
Email string `json:"email"`
88+
Name string `json:"name"`
89+
Picture string `json:"picture"`
90+
VerifiedEmail bool `json:"verified_email"`
91+
}{}
92+
93+
if err := json.NewDecoder(resp.Body).Decode(&userInfo); err != nil {
94+
http.Error(w, "Failed to parse user info: "+err.Error(), http.StatusInternalServerError)
95+
return
96+
}
97+
98+
redirectURL := fmt.Sprintf("http://localhost:5173/?email=%s&name=%s", userInfo.Email, userInfo.Name)
99+
100+
http.Redirect(w, r, redirectURL, http.StatusTemporaryRedirect)
101+
}

src/infrastructure/services/auth_service.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,55 @@ import (
55
"goproxy/application"
66
"goproxy/domain/aggregates"
77
"goproxy/domain/valueobjects"
8+
"os"
9+
"strconv"
10+
"time"
811
)
912

13+
const defaultValidateCacheTTL = time.Second * 10
14+
15+
type validateResult struct {
16+
result bool
17+
err error
18+
}
19+
1020
type AuthService struct {
11-
cryptoService application.CryptoService
21+
cryptoService application.CryptoService
22+
validateCache application.CacheWithTTL[validateResult]
23+
validateCacheTTL time.Duration
1224
}
1325

1426
func NewAuthService(cryptoService application.CryptoService) *AuthService {
27+
validateCacheTTL := defaultValidateCacheTTL
28+
validateTtlEnv := os.Getenv("AUTH_SERVICE_VALIDATE_TTL_MS")
29+
if validateTtlEnv != "" {
30+
ttlMillis, err := strconv.Atoi(validateTtlEnv)
31+
if err == nil {
32+
validateCacheTTL = time.Duration(ttlMillis) * time.Millisecond
33+
}
34+
}
35+
1536
return &AuthService{
16-
cryptoService: cryptoService,
37+
cryptoService: cryptoService,
38+
validateCache: NewMapCacheWithTTL[validateResult](),
39+
validateCacheTTL: validateCacheTTL,
1740
}
1841
}
1942

2043
func (authService *AuthService) AuthorizeBasic(user aggregates.User, credentials valueobjects.BasicCredentials) (bool, error) {
44+
cacheKey := fmt.Sprintf("%s:%x", credentials.Username, user.PasswordSalt())
45+
cached, cachedErr := authService.validateCache.Get(cacheKey)
46+
if cachedErr == nil {
47+
return cached.result, cached.err
48+
}
49+
2150
isPasswordValid := authService.cryptoService.ValidateHash(user.PasswordHash(), user.PasswordSalt(), credentials.Password)
2251
if !isPasswordValid {
2352
return false, fmt.Errorf("invalid credentials")
2453
}
2554

55+
_ = authService.validateCache.Set(cacheKey, validateResult{true, nil})
56+
_ = authService.validateCache.Expire(cacheKey, authService.validateCacheTTL)
57+
2658
return true, nil
2759
}

0 commit comments

Comments
 (0)