From 0988c0573c9f5e9253be74885f4cd23fdbb10423 Mon Sep 17 00:00:00 2001 From: kavindu-senarathne Date: Tue, 11 Mar 2025 14:50:50 +0530 Subject: [PATCH 001/134] initialize springboot project --- planning-service/.gitattributes | 3 + planning-service/.gitignore | 39 +++ planning-service/build.gradle | 39 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + planning-service/gradlew | 252 ++++++++++++++++++ planning-service/gradlew.bat | 94 +++++++ planning-service/settings.gradle | 1 + .../PlanningServiceApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../PlanningServiceApplicationTests.java | 13 + 11 files changed, 462 insertions(+) create mode 100644 planning-service/.gitattributes create mode 100644 planning-service/.gitignore create mode 100644 planning-service/build.gradle create mode 100644 planning-service/gradle/wrapper/gradle-wrapper.jar create mode 100644 planning-service/gradle/wrapper/gradle-wrapper.properties create mode 100755 planning-service/gradlew create mode 100644 planning-service/gradlew.bat create mode 100644 planning-service/settings.gradle create mode 100644 planning-service/src/main/java/org/example/planningservice/PlanningServiceApplication.java create mode 100644 planning-service/src/main/resources/application.properties create mode 100644 planning-service/src/test/java/org/example/planningservice/PlanningServiceApplicationTests.java diff --git a/planning-service/.gitattributes b/planning-service/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/planning-service/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/planning-service/.gitignore b/planning-service/.gitignore new file mode 100644 index 0000000..cdc00bd --- /dev/null +++ b/planning-service/.gitignore @@ -0,0 +1,39 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +"secret_keys.txt" diff --git a/planning-service/build.gradle b/planning-service/build.gradle new file mode 100644 index 0000000..4f88574 --- /dev/null +++ b/planning-service/build.gradle @@ -0,0 +1,39 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.4.3' + id 'io.spring.dependency-management' version '1.1.7' +} + +group = 'org.example' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.kafka:spring-kafka' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'com.h2database:h2' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/planning-service/gradle/wrapper/gradle-wrapper.jar b/planning-service/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/planning-service/gradle/wrapper/gradle-wrapper.properties b/planning-service/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e18bc25 --- /dev/null +++ b/planning-service/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/planning-service/gradlew b/planning-service/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/planning-service/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/planning-service/gradlew.bat b/planning-service/gradlew.bat new file mode 100644 index 0000000..9d21a21 --- /dev/null +++ b/planning-service/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/planning-service/settings.gradle b/planning-service/settings.gradle new file mode 100644 index 0000000..505df99 --- /dev/null +++ b/planning-service/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'planning-service' diff --git a/planning-service/src/main/java/org/example/planningservice/PlanningServiceApplication.java b/planning-service/src/main/java/org/example/planningservice/PlanningServiceApplication.java new file mode 100644 index 0000000..d2a4739 --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/PlanningServiceApplication.java @@ -0,0 +1,13 @@ +package org.example.planningservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PlanningServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(PlanningServiceApplication.class, args); + } + +} diff --git a/planning-service/src/main/resources/application.properties b/planning-service/src/main/resources/application.properties new file mode 100644 index 0000000..6ff01cb --- /dev/null +++ b/planning-service/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=planning-service diff --git a/planning-service/src/test/java/org/example/planningservice/PlanningServiceApplicationTests.java b/planning-service/src/test/java/org/example/planningservice/PlanningServiceApplicationTests.java new file mode 100644 index 0000000..73172b0 --- /dev/null +++ b/planning-service/src/test/java/org/example/planningservice/PlanningServiceApplicationTests.java @@ -0,0 +1,13 @@ +package org.example.planningservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PlanningServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From 99f6a7092ab9a546e5e90a1ef7fcb5fc45282daf Mon Sep 17 00:00:00 2001 From: kavindu-senarathne Date: Sat, 22 Mar 2025 21:04:34 +0530 Subject: [PATCH 002/134] initialize a dummy pipeline --- .../controllers/PipelineController.java | 30 +++++++++++++++++++ .../pipelines/PipelineManager.java | 24 +++++++++++++++ .../pipelines/PipelineStep.java | 5 ++++ .../steps/DataTransformationStep.java | 19 ++++++++++++ .../pipelines/steps/StorageStep.java | 18 +++++++++++ .../pipelines/steps/ValidationStep.java | 21 +++++++++++++ 6 files changed, 117 insertions(+) create mode 100644 planning-service/src/main/java/org/example/planningservice/controllers/PipelineController.java create mode 100644 planning-service/src/main/java/org/example/planningservice/pipelines/PipelineManager.java create mode 100644 planning-service/src/main/java/org/example/planningservice/pipelines/PipelineStep.java create mode 100644 planning-service/src/main/java/org/example/planningservice/pipelines/steps/DataTransformationStep.java create mode 100644 planning-service/src/main/java/org/example/planningservice/pipelines/steps/StorageStep.java create mode 100644 planning-service/src/main/java/org/example/planningservice/pipelines/steps/ValidationStep.java diff --git a/planning-service/src/main/java/org/example/planningservice/controllers/PipelineController.java b/planning-service/src/main/java/org/example/planningservice/controllers/PipelineController.java new file mode 100644 index 0000000..523804b --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/controllers/PipelineController.java @@ -0,0 +1,30 @@ +package org.example.planningservice.controllers; + +import lombok.extern.slf4j.Slf4j; +import org.example.planningservice.pipelines.PipelineManager; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("/pipeline") +public class PipelineController { + + private final PipelineManager pipelineManager; + + public PipelineController(PipelineManager pipelineManager) { + this.pipelineManager = pipelineManager; + } + + @PostMapping("/execute") + public String executePipeline(@RequestBody String input) { + + log.info("🚀 Starting Pipeline..."); + String result = pipelineManager.execute(input); + log.info("🎉 Final Output: " + result); + + return result; + } +} diff --git a/planning-service/src/main/java/org/example/planningservice/pipelines/PipelineManager.java b/planning-service/src/main/java/org/example/planningservice/pipelines/PipelineManager.java new file mode 100644 index 0000000..5db2e10 --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/pipelines/PipelineManager.java @@ -0,0 +1,24 @@ +package org.example.planningservice.pipelines; + +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PipelineManager { + + private final List> steps; + + public PipelineManager(List> steps) { + this.steps = steps; + } + + + public T execute(T input) { + T result = input; + for (PipelineStep step : steps) { + result = step.process(result); + } + return result; + } +} diff --git a/planning-service/src/main/java/org/example/planningservice/pipelines/PipelineStep.java b/planning-service/src/main/java/org/example/planningservice/pipelines/PipelineStep.java new file mode 100644 index 0000000..c73d79f --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/pipelines/PipelineStep.java @@ -0,0 +1,5 @@ +package org.example.planningservice.pipelines; + +public interface PipelineStep { + T process(T input); +} \ No newline at end of file diff --git a/planning-service/src/main/java/org/example/planningservice/pipelines/steps/DataTransformationStep.java b/planning-service/src/main/java/org/example/planningservice/pipelines/steps/DataTransformationStep.java new file mode 100644 index 0000000..cde7538 --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/pipelines/steps/DataTransformationStep.java @@ -0,0 +1,19 @@ +package org.example.planningservice.pipelines.steps; + +import lombok.extern.slf4j.Slf4j; +import org.example.planningservice.pipelines.PipelineStep; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@Order(2) +public class DataTransformationStep implements PipelineStep { + + @Override + public String process(String input) { + String transformedData = input.toUpperCase(); // Simulating transformation + log.info("🔄 Data Transformed: " + transformedData); + return transformedData; + } +} diff --git a/planning-service/src/main/java/org/example/planningservice/pipelines/steps/StorageStep.java b/planning-service/src/main/java/org/example/planningservice/pipelines/steps/StorageStep.java new file mode 100644 index 0000000..5ffa468 --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/pipelines/steps/StorageStep.java @@ -0,0 +1,18 @@ +package org.example.planningservice.pipelines.steps; + +import lombok.extern.slf4j.Slf4j; +import org.example.planningservice.pipelines.PipelineStep; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@Order(3) +public class StorageStep implements PipelineStep { + + @Override + public String process(String input) { + log.info("💾 Data Stored: " + input); + return input; + } +} diff --git a/planning-service/src/main/java/org/example/planningservice/pipelines/steps/ValidationStep.java b/planning-service/src/main/java/org/example/planningservice/pipelines/steps/ValidationStep.java new file mode 100644 index 0000000..b767118 --- /dev/null +++ b/planning-service/src/main/java/org/example/planningservice/pipelines/steps/ValidationStep.java @@ -0,0 +1,21 @@ +package org.example.planningservice.pipelines.steps; + +import lombok.extern.slf4j.Slf4j; +import org.example.planningservice.pipelines.PipelineStep; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@Order(1) +public class ValidationStep implements PipelineStep { + + @Override + public String process(String input) { + if (input == null || input.isBlank()) { + throw new IllegalArgumentException("Invalid input data!"); + } + log.info("✅ Validation Passed: " + input); + return input; + } +} From 170f1a62f26d78dd8238646ae99f22db96eba1b3 Mon Sep 17 00:00:00 2001 From: Kokila Meddawitage Date: Mon, 7 Apr 2025 17:09:48 +0530 Subject: [PATCH 003/134] initial commit for social media service --- .idea/compiler.xml | 19 ++ .idea/gradle.xml | 21 +++ .idea/misc.xml | 10 ++ .idea/vcs.xml | 6 + social-media-service/build.gradle | 80 +++++++++ social-media-service/settings.gradle | 1 + .../SocialMediaServiceApplication.java | 13 ++ .../controller/PostController.java | 54 ++++++ .../controller/PostInteractionController.java | 113 ++++++++++++ .../controller/UserController.java | 4 + .../socialmediaservice/dto/CommentDTO.java | 15 ++ .../dto/CreatePostRequestDTO.java | 9 + .../socialmediaservice/dto/PostDTO.java | 19 ++ .../socialmediaservice/dto/ReactionDTO.java | 10 ++ .../dto/ReplyCommentRequestDTO.java | 11 ++ .../dto/UpdatePostRequestDTO.java | 10 ++ .../dto/UserProfileDTO.java | 4 + .../socialmediaservice/entity/Comment.java | 41 +++++ .../socialmediaservice/entity/Post.java | 39 ++++ .../socialmediaservice/entity/Reaction.java | 30 ++++ .../socialmediaservice/entity/User.java | 23 +++ .../enums/ReactionType.java | 10 ++ .../mapper/CommentMapper.java | 22 +++ .../socialmediaservice/mapper/PostMapper.java | 17 ++ .../repository/CommentRepo.java | 14 ++ .../repository/PostRepo.java | 13 ++ .../repository/ReactionRepo.java | 14 ++ .../repository/UserRepo.java | 14 ++ .../service/CommentService.java | 49 +++++ .../service/PostService.java | 170 ++++++++++++++++++ .../service/ReactionService.java | 46 +++++ .../src/main/resources/application.properties | 18 ++ .../SocialMediaServiceApplicationTests.java | 13 ++ 33 files changed, 932 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 social-media-service/build.gradle create mode 100644 social-media-service/settings.gradle create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/SocialMediaServiceApplication.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/ReactionDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/ReplyCommentRequestDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/UserProfileDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/entity/Comment.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/entity/Reaction.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/enums/ReactionType.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/repository/ReactionRepo.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/service/CommentService.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java create mode 100644 social-media-service/src/main/resources/application.properties create mode 100644 social-media-service/src/test/java/com/example/socialmediaservice/SocialMediaServiceApplicationTests.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..d3d5187 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..22f0805 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..03a7185 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/social-media-service/build.gradle b/social-media-service/build.gradle new file mode 100644 index 0000000..7a82268 --- /dev/null +++ b/social-media-service/build.gradle @@ -0,0 +1,80 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.4.0' + id 'io.spring.dependency-management' version '1.1.6' + id 'com.google.protobuf' version '0.9.2' +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-mail' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'org.postgresql:postgresql' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + runtimeOnly 'io.grpc:grpc-netty-shaded:1.52.1' + implementation 'io.grpc:grpc-protobuf:1.52.1' + implementation 'io.grpc:grpc-stub:1.52.1' + compileOnly 'org.apache.tomcat:annotations-api:6.0.53' // necessary for Java 9+ + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + + // grpc denendencies + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + + +} + + + +test { + useJUnitPlatform() +} + +protobuf { + protoc { + artifact = "com.google.protobuf:protoc:3.21.7" + } + plugins { + grpc { + artifact = 'io.grpc:protoc-gen-grpc-java:1.52.1' + } + } + generateProtoTasks { + all()*.plugins { + grpc {} + } + } +} + + + +tasks.named('test') { + useJUnitPlatform() +} \ No newline at end of file diff --git a/social-media-service/settings.gradle b/social-media-service/settings.gradle new file mode 100644 index 0000000..b451b0e --- /dev/null +++ b/social-media-service/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'social-media-service' diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/SocialMediaServiceApplication.java b/social-media-service/src/main/java/com/example/socialmediaservice/SocialMediaServiceApplication.java new file mode 100644 index 0000000..e41511f --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/SocialMediaServiceApplication.java @@ -0,0 +1,13 @@ +package com.example.socialmediaservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SocialMediaServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(SocialMediaServiceApplication.class, args); + } + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java new file mode 100644 index 0000000..c436902 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java @@ -0,0 +1,54 @@ +package com.example.socialmediaservice.controller; + +import com.example.socialmediaservice.dto.CreatePostRequestDTO; +import com.example.socialmediaservice.dto.PostDTO; +import com.example.socialmediaservice.dto.UpdatePostRequestDTO; +import com.example.socialmediaservice.service.CommentService; +import com.example.socialmediaservice.service.PostService; +import com.example.socialmediaservice.service.ReactionService; +import lombok.RequiredArgsConstructor; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/posts") +@RequiredArgsConstructor +public class PostController { + + private final PostService postService; + private final ReactionService reactionService; + private final CommentService commentService; + + // 1. Create Post + @PostMapping("/create") + public ResponseEntity createPost( +// @PathVariable String userId, + @RequestBody CreatePostRequestDTO createPostRequestDTO) { + return ResponseEntity.ok(postService.createPost(createPostRequestDTO.getUserId(), createPostRequestDTO)); + } + + // 2. Get all posts created by a specific user + @GetMapping("/user/{userId}") + public ResponseEntity> getPostsByUser(@PathVariable String userId) { + return ResponseEntity.ok(postService.getPostsByUser(userId)); + } + + // 3. Get post by postId + @GetMapping("/{postId}") + public ResponseEntity getPostById(@PathVariable String postId) { + return ResponseEntity.ok(postService.getPostById(postId)); + } + + // 4. Update post content + @PutMapping("/{postId}") + public ResponseEntity updatePost( + @PathVariable String postId, + @RequestBody UpdatePostRequestDTO requestDTO) { + return ResponseEntity.ok(postService.updatePost(postId, requestDTO)); + } + + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java new file mode 100644 index 0000000..df11575 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java @@ -0,0 +1,113 @@ +package com.example.socialmediaservice.controller; + +import com.example.socialmediaservice.dto.CommentDTO; +import com.example.socialmediaservice.dto.ReplyCommentRequestDTO; +import com.example.socialmediaservice.entity.Comment; +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.enums.ReactionType; +import com.example.socialmediaservice.repository.CommentRepo; +import com.example.socialmediaservice.repository.PostRepo; +import com.example.socialmediaservice.repository.UserRepo; +import com.example.socialmediaservice.service.CommentService; +import com.example.socialmediaservice.service.ReactionService; +import lombok.RequiredArgsConstructor; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/posts") +public class PostInteractionController { + + private final PostRepo postRepo; + private final UserRepo userRepo; + private final CommentRepo commentRepo; + private final CommentService commentService; + private final ReactionService reactionService; + + // 1. Get all comments for a specific post + @GetMapping("/{postId}/comments") + public ResponseEntity> getCommentsForPost( + @PathVariable String postId) { + Post post = postRepo.findByPostId(postId); + if (post == null) { + return ResponseEntity.notFound().build(); + } + + List commentDTOs = commentService.getCommentsByPost(post).stream().map(comment -> { + CommentDTO dto = new CommentDTO(); + dto.setUserId(comment.getUser().getUserId()); + dto.setContent(comment.getContent()); + dto.setCreatedAt(comment.getCreatedAt()); + return dto; + }).collect(Collectors.toList()); + + return ResponseEntity.ok(commentDTOs); + } + + // 2. Get reaction counts for a specific post + @GetMapping("/{postId}/reactions") + public ResponseEntity> getReactionCounts(@PathVariable String postId) { + Post post = postRepo.findByPostId(postId); + if (post == null) { + return ResponseEntity.notFound().build(); + } + + Map counts = reactionService.getReactionCounts(post); + return ResponseEntity.ok(counts); + } + + // 3. Add reactions for a post + @PostMapping("/{postId}/react") + public ResponseEntity addOrUpdateReaction(@PathVariable String postId, + @RequestParam String userId, + @RequestParam ReactionType type) { + Post post = postRepo.findByPostId(postId); + if (post == null) return ResponseEntity.notFound().build(); + + User user = userRepo.findByUserId(userId) + .orElseThrow(() -> new RuntimeException("User not found")); + + reactionService.reactToPost(post, user, type); + return ResponseEntity.ok().build(); + } + + // 4. Add comments to a post + @PostMapping("{postId}/comment") + public ResponseEntity addCommentToPost(@PathVariable String postId, + @RequestBody CommentDTO requestDTO) { + Post post = postRepo.findByPostId(postId); + if (post == null) return ResponseEntity.notFound().build(); + + User user = userRepo.findByUserId(requestDTO.getUserId()) + .orElseThrow(() -> new RuntimeException("User not found")); + + commentService.addComment(post, user, requestDTO.getContent()); + return ResponseEntity.ok().build(); + } + + // 5. Reply to a comment on a post + @PostMapping("/comments/{commentId}/reply") + public ResponseEntity replyToComment(@PathVariable String commentId, + @RequestBody ReplyCommentRequestDTO requestDTO) { + Comment parentComment = commentRepo.findById(commentId) + .orElseThrow(() -> new RuntimeException("Comment not found")); + + User user = userRepo.findByUserId(requestDTO.getUserId()) + .orElseThrow(() -> new RuntimeException("User not found")); + + Post post = parentComment.getPost(); + + commentService.replyToComment(parentComment, post, user, requestDTO.getContent()); + return ResponseEntity.ok().build(); + } + + + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java new file mode 100644 index 0000000..12ac7a8 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java @@ -0,0 +1,4 @@ +package com.example.socialmediaservice.controller; + +public class UserController { +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java new file mode 100644 index 0000000..ca3e938 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java @@ -0,0 +1,15 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class CommentDTO { + private String userId; + private String content; + private LocalDateTime createdAt; + private String parentCommentId; + private List replies; // nested replies +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java new file mode 100644 index 0000000..469cf21 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java @@ -0,0 +1,9 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; + +@Data +public class CreatePostRequestDTO { + private String content; + private String userId; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java new file mode 100644 index 0000000..e0f063d --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java @@ -0,0 +1,19 @@ +package com.example.socialmediaservice.dto; + +import com.example.socialmediaservice.enums.ReactionType; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Data +public class PostDTO { + private String postId; + private String content; + private String userId; + private String username; + private LocalDateTime createdAt; + private List comments; + private Map reactionCounts; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/ReactionDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/ReactionDTO.java new file mode 100644 index 0000000..cc4b0a1 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/ReactionDTO.java @@ -0,0 +1,10 @@ +package com.example.socialmediaservice.dto; + +import com.example.socialmediaservice.enums.ReactionType; +import lombok.Data; + +@Data +public class ReactionDTO { + private String userId; + private ReactionType type; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/ReplyCommentRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/ReplyCommentRequestDTO.java new file mode 100644 index 0000000..84433ac --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/ReplyCommentRequestDTO.java @@ -0,0 +1,11 @@ +package com.example.socialmediaservice.dto; + + +import lombok.Data; + +@Data +public class ReplyCommentRequestDTO { + private String userId; + private String content; +} + diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java new file mode 100644 index 0000000..4b2769a --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java @@ -0,0 +1,10 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +public class UpdatePostRequestDTO { + private String content; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UserProfileDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UserProfileDTO.java new file mode 100644 index 0000000..71edef7 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UserProfileDTO.java @@ -0,0 +1,4 @@ +package com.example.socialmediaservice.dto; + +public class UserProfileDTO { +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Comment.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Comment.java new file mode 100644 index 0000000..e788f3a --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Comment.java @@ -0,0 +1,41 @@ +package com.example.socialmediaservice.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Data +@RequiredArgsConstructor +@Table(name = "comments") +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String commentId; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Column(name = "created_at") + private LocalDateTime createdAt = LocalDateTime.now(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parent_comment_id") + private Comment parentComment; + + @OneToMany(mappedBy = "parentComment", cascade = CascadeType.ALL, orphanRemoval = true) + private List replies = new ArrayList<>(); +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java new file mode 100644 index 0000000..401f5d7 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java @@ -0,0 +1,39 @@ +package com.example.socialmediaservice.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "posts") +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String postId; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Column(name = "created_at") + private LocalDateTime createdAt = LocalDateTime.now(); + + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private List reactions = new ArrayList<>(); + + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private List comments = new ArrayList<>(); + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Reaction.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Reaction.java new file mode 100644 index 0000000..a2a1ec7 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Reaction.java @@ -0,0 +1,30 @@ +package com.example.socialmediaservice.entity; + +import com.example.socialmediaservice.enums.ReactionType; +import jakarta.persistence.*; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Entity +@Data +@RequiredArgsConstructor +@Table(name="reactions", uniqueConstraints = { + @UniqueConstraint(columnNames = {"post_id", "user_id"}) }) +public class Reaction { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "reaction_id", updatable = false, nullable = false) + private String reactionId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ReactionType type; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java new file mode 100644 index 0000000..72b7c22 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java @@ -0,0 +1,23 @@ +package com.example.socialmediaservice.entity; + +import jakarta.persistence.*; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Data +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String userId; + + @Column(unique = true, nullable = false) + private String username; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + private List posts = new ArrayList<>(); +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/enums/ReactionType.java b/social-media-service/src/main/java/com/example/socialmediaservice/enums/ReactionType.java new file mode 100644 index 0000000..33e36cc --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/enums/ReactionType.java @@ -0,0 +1,10 @@ +package com.example.socialmediaservice.enums; + +public enum ReactionType { + LIKE, + LOVE, + HAHA, + WOW, + SAD, + ANGRY +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java new file mode 100644 index 0000000..a415bf8 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java @@ -0,0 +1,22 @@ +package com.example.socialmediaservice.mapper; + + +import com.example.socialmediaservice.dto.CommentDTO; +import com.example.socialmediaservice.entity.Comment; + +import java.util.stream.Collectors; + +public class CommentMapper { + + private CommentDTO toDtoWithReplies(Comment comment) { + CommentDTO dto = new CommentDTO(); + dto.setUserId(comment.getUser().getUserId()); + dto.setContent(comment.getContent()); + dto.setCreatedAt(comment.getCreatedAt()); + dto.setReplies(comment.getReplies().stream() + .map(this::toDtoWithReplies) + .collect(Collectors.toList())); + return dto; + } + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java new file mode 100644 index 0000000..cf452f2 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java @@ -0,0 +1,17 @@ +package com.example.socialmediaservice.mapper; + + +import com.example.socialmediaservice.dto.PostDTO; +import com.example.socialmediaservice.entity.Post; + +public class PostMapper { + public static PostDTO toDto(Post post) { + PostDTO dto = new PostDTO(); + dto.setPostId(post.getPostId()); + dto.setContent(post.getContent()); + dto.setUserId(post.getUser().getUserId()); + dto.setUsername(post.getUser().getUsername()); + dto.setCreatedAt(post.getCreatedAt()); + return dto; + } +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java new file mode 100644 index 0000000..b4d98a0 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java @@ -0,0 +1,14 @@ +package com.example.socialmediaservice.repository; + +import com.example.socialmediaservice.entity.Comment; +import com.example.socialmediaservice.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CommentRepo extends JpaRepository { + List findByPost(Post post); + List findByPostAndParentCommentIsNull(Post post); + + List findByParentComment(Comment parentComment); +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java new file mode 100644 index 0000000..47eea1d --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java @@ -0,0 +1,13 @@ +package com.example.socialmediaservice.repository; + +import com.example.socialmediaservice.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PostRepo extends JpaRepository { + List findByUser_UserId(String userId); + Post findByPostId(String postId); +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/ReactionRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/ReactionRepo.java new file mode 100644 index 0000000..913eadb --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/ReactionRepo.java @@ -0,0 +1,14 @@ +package com.example.socialmediaservice.repository; + +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.Reaction; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.enums.ReactionType; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ReactionRepo extends JpaRepository { + Optional findByPostAndUser(Post post, User user); + long countByPostAndType(Post post, ReactionType type); +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java new file mode 100644 index 0000000..cf35cf8 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java @@ -0,0 +1,14 @@ +package com.example.socialmediaservice.repository; + +import com.example.socialmediaservice.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface UserRepo extends JpaRepository { + + Optional findByUserId(String userId); +// List findByUserProfile_PostId(String postId); +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/CommentService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/CommentService.java new file mode 100644 index 0000000..38c9587 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/CommentService.java @@ -0,0 +1,49 @@ +package com.example.socialmediaservice.service; + +import com.example.socialmediaservice.entity.Comment; +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.repository.CommentRepo; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CommentService { + + private final CommentRepo commentRepo; + + public Comment addComment(Post post, User user, String content, Comment parentComment) { + Comment comment = new Comment(); + comment.setPost(post); + comment.setUser(user); + comment.setContent(content); + comment.setParentComment(parentComment); + return commentRepo.save(comment); + } + + public Comment addComment(Post post, User user, String content) { + return addComment(post, user, content, null); + } + + public List getCommentsByPost(Post post) { + return commentRepo.findByPost(post); + } + + public List getRepliesByParentComment(Comment parentComment) { + return commentRepo.findByParentComment(parentComment); + } + + public Comment replyToComment(Comment parentComment, Post post, User user, String content) { + Comment reply = new Comment(); + reply.setParentComment(parentComment); + reply.setPost(post); + reply.setUser(user); + reply.setContent(content); + return commentRepo.save(reply); + } + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java new file mode 100644 index 0000000..6c366ba --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java @@ -0,0 +1,170 @@ +package com.example.socialmediaservice.service; + + +import com.example.socialmediaservice.dto.CommentDTO; +import com.example.socialmediaservice.dto.CreatePostRequestDTO; +import com.example.socialmediaservice.dto.PostDTO; +import com.example.socialmediaservice.dto.UpdatePostRequestDTO; +import com.example.socialmediaservice.entity.Comment; +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.enums.ReactionType; +import com.example.socialmediaservice.mapper.PostMapper; +import com.example.socialmediaservice.repository.PostRepo; +import com.example.socialmediaservice.repository.UserRepo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class PostService { + + private final PostRepo postRepo; + private final UserRepo userRepo; + private final ReactionService reactionService; + private final CommentService commentService; + + + // 1. Create Post + public PostDTO createPost(String userId, CreatePostRequestDTO createPostRequestDTO) { + User user = userRepo.findByUserId(userId) + .orElseThrow(() -> new RuntimeException("User not found")); + + Post post = new Post(); + post.setContent(createPostRequestDTO.getContent()); + post.setUser(user); + postRepo.save(post); + + return PostMapper.toDto(post); + } + + // 2. Get all posts created by a specific user + +// public List getPostsByUser(String userId) { +// return postRepo.findByUser_UserId(userId).stream() +// .map(PostMapper::toDto) +// .collect(Collectors.toList()); +// } + + public List getPostsByUser(String userId) { + return postRepo.findByUser_UserId(userId).stream() + .map(post -> { + PostDTO dto = PostMapper.toDto(post); + + // Add comments + dto.setComments(commentService.getCommentsByPost(post).stream().map(comment -> { + CommentDTO c = new CommentDTO(); + c.setUserId(comment.getUser().getUserId()); + c.setContent(comment.getContent()); + c.setCreatedAt(comment.getCreatedAt()); + return c; + }).collect(Collectors.toList())); + + // Add reaction counts + dto.setReactionCounts(reactionService.getReactionCounts(post)); + + return dto; + }) + .collect(Collectors.toList()); + } + + + // 3. Get post by ID with comments and reaction counts +// public PostDTO getPostById(String postId) { +// Post post = postRepo.findByPostId(postId); +// if (post == null) throw new RuntimeException("Post not found"); +// +// PostDTO postDTO = PostMapper.toDto(post); +// +// // Fetch and map comments +// List comments = commentService.getCommentsByPost(post); +// List commentDTOs = comments.stream().map(comment -> { +// CommentDTO dto = new CommentDTO(); +// dto.setUserId(comment.getUser().getUserId()); // Assumes getUserId exists +// dto.setContent(comment.getContent()); +// dto.setCreatedAt(comment.getCreatedAt()); +// dto.setParentCommentId(comment.getParentComment().getCommentId()); +// List replies = commentService.getRepliesByParentComment(comment); +// return dto; +// }).collect(Collectors.toList()); +// postDTO.setComments(commentDTOs); +// +// // Get reaction counts +// Map reactionCounts = reactionService.getReactionCounts(post); +// postDTO.setReactionCounts(reactionCounts); +// +// return postDTO; +// } + + public PostDTO getPostById(String postId) { + Post post = postRepo.findByPostId(postId); + if (post == null) throw new RuntimeException("Post not found"); + + PostDTO postDTO = PostMapper.toDto(post); + + // Fetch all comments for the post + List allComments = commentService.getCommentsByPost(post); + + // Group comments by parent + Map> repliesGroupedByParentId = allComments.stream() + .filter(c -> c.getParentComment() != null) + .collect(Collectors.groupingBy(c -> c.getParentComment().getCommentId())); + + // Filter top-level comments + List topLevelComments = allComments.stream() + .filter(c -> c.getParentComment() == null) + .collect(Collectors.toList()); + + // Map top-level comments and recursively add replies + List commentDTOs = topLevelComments.stream() + .map(comment -> mapCommentWithReplies(comment, repliesGroupedByParentId)) + .collect(Collectors.toList()); + + postDTO.setComments(commentDTOs); + + // Set reaction counts + Map reactionCounts = reactionService.getReactionCounts(post); + postDTO.setReactionCounts(reactionCounts); + + return postDTO; + } + + private CommentDTO mapCommentWithReplies(Comment comment, Map> repliesGroupedByParentId) { + CommentDTO dto = new CommentDTO(); + dto.setUserId(comment.getUser().getUserId()); + dto.setContent(comment.getContent()); + dto.setCreatedAt(comment.getCreatedAt()); + dto.setParentCommentId(comment.getParentComment() != null ? comment.getParentComment().getCommentId() : null); + + List replies = repliesGroupedByParentId.get(comment.getCommentId()); + if (replies != null && !replies.isEmpty()) { + List replyDTOs = replies.stream() + .map(reply -> mapCommentWithReplies(reply, repliesGroupedByParentId)) // Recursive + .collect(Collectors.toList()); + dto.setReplies(replyDTOs); + } + + return dto; + } + + + +// //4. Get post by ID +// public PostDTO getPostById(String postId) { +// Post post = postRepo.findByPostId(postId); +// return PostMapper.toDto(post); +// } + + //4. Update post content + public PostDTO updatePost(String postId, UpdatePostRequestDTO requestDTO) { + Post post = postRepo.findByPostId(postId); + post.setContent(requestDTO.getContent()); + Post updatedPost = postRepo.save(post); + return PostMapper.toDto(updatedPost); + } + +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java new file mode 100644 index 0000000..cfe895d --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java @@ -0,0 +1,46 @@ +package com.example.socialmediaservice.service; + +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.Reaction; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.enums.ReactionType; +import com.example.socialmediaservice.repository.ReactionRepo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.EnumMap; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class ReactionService { + + private final ReactionRepo reactionRepo; + + public void reactToPost(Post post, User user, ReactionType type) { + Reaction existing = reactionRepo.findByPostAndUser(post, user).orElse(null); + + if (existing != null) { + if (existing.getType() == type) { + reactionRepo.delete(existing); // toggle + } else { + existing.setType(type); // change reaction + reactionRepo.save(existing); + } + } else { + Reaction reaction = new Reaction(); + reaction.setPost(post); + reaction.setUser(user); + reaction.setType(type); + reactionRepo.save(reaction); + } + } + + public Map getReactionCounts(Post post) { + Map map = new EnumMap<>(ReactionType.class); + for (ReactionType type : ReactionType.values()) { + map.put(type, reactionRepo.countByPostAndType(post, type)); + } + return map; + } +} diff --git a/social-media-service/src/main/resources/application.properties b/social-media-service/src/main/resources/application.properties new file mode 100644 index 0000000..1604202 --- /dev/null +++ b/social-media-service/src/main/resources/application.properties @@ -0,0 +1,18 @@ +spring.application.name=social-media-service + +# Database configuration +#spring.datasource.url=${SPRING_DATASOURCE_URL} +spring.datasource.username=postgres.odffpjvuptssxaaggnsn +spring.datasource.password=Postgres + +#spring.datasource.username=${SPRING_DATASOURCE_USERNAME} +#spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} + +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://aws-0-ap-southeast-1.pooler.supabase.com:5432/postgres?user=postgres.odffpjvuptssxaaggnsn&password=Postgres +#spring.jpa.hibernate.ddl-auto=none + +# JPA & Hibernate Configuration +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.show-sql=true \ No newline at end of file diff --git a/social-media-service/src/test/java/com/example/socialmediaservice/SocialMediaServiceApplicationTests.java b/social-media-service/src/test/java/com/example/socialmediaservice/SocialMediaServiceApplicationTests.java new file mode 100644 index 0000000..0ebf651 --- /dev/null +++ b/social-media-service/src/test/java/com/example/socialmediaservice/SocialMediaServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.socialmediaservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SocialMediaServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From 6e895c75b8225afe4b4127b1d00ee5944e00366b Mon Sep 17 00:00:00 2001 From: Harshana Date: Sun, 27 Apr 2025 11:14:34 +0530 Subject: [PATCH 004/134] update --- README.md | 11 +- apigateway/kong/Dockerfile.kong-oidc | 25 +++ apigateway/kong/README.txt | 7 + apigateway/kong/config/kong.conf | 18 ++ apigateway/kong/docker-compose.yml | 168 ++++++++++++++++++ .../kong/keycloak-introspection/handler.lua | 80 +++++++++ .../kong/keycloak-introspection/schema.lua | 19 ++ auth_service/docker-compose.yml | 0 8 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 apigateway/kong/Dockerfile.kong-oidc create mode 100644 apigateway/kong/README.txt create mode 100644 apigateway/kong/config/kong.conf create mode 100644 apigateway/kong/docker-compose.yml create mode 100644 apigateway/kong/keycloak-introspection/handler.lua create mode 100644 apigateway/kong/keycloak-introspection/schema.lua create mode 100644 auth_service/docker-compose.yml diff --git a/README.md b/README.md index 232d21e..cc1636d 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# GoTogether-backend \ No newline at end of file +# GoTogether-backend + +docker compose exec keycloak /opt/keycloak/bin/kcadm.sh config credentials \ + --server http://localhost:8080 --realm master --user admin --password admin + +docker compose exec keycloak \ + /opt/keycloak/bin/kcadm.sh update realms/master -s sslRequired=NONE + + http://localhost:8081/admin + diff --git a/apigateway/kong/Dockerfile.kong-oidc b/apigateway/kong/Dockerfile.kong-oidc new file mode 100644 index 0000000..d0f0845 --- /dev/null +++ b/apigateway/kong/Dockerfile.kong-oidc @@ -0,0 +1,25 @@ +FROM kong:3.5 + +USER root + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + unzip \ + luarocks && \ + rm -rf /var/lib/apt/lists/* + +# Install kong-oidc plugin +RUN git clone --branch v1.2.3-2 https://github.com/revomatico/kong-oidc.git \ + && cd kong-oidc && luarocks make + +# Install kong-plugin-jwt-keycloak plugin +RUN git clone --branch 20200505-access-token-processing https://github.com/BGaunitz/kong-plugin-jwt-keycloak.git \ + && cd kong-plugin-jwt-keycloak && luarocks make + + COPY keycloak-introspection /usr/local/share/lua/5.1/kong/plugins/keycloak-introspection + + # Add this at the end before USER kong +COPY config/kong.conf /etc/kong/kong.conf + +USER kong diff --git a/apigateway/kong/README.txt b/apigateway/kong/README.txt new file mode 100644 index 0000000..dacf895 --- /dev/null +++ b/apigateway/kong/README.txt @@ -0,0 +1,7 @@ +1. Run the scripts in sequence +2. Use user with administrator access (Windows) or root access (Mac / Linux) +3. You don't have to use "root" for Mac / Linux, user with "sudo" access will do + In such case, you need to add "sudo" for each scripts + Example: + + $> sudo docker network create --subnet=172.1.1.0/24 kong-net \ No newline at end of file diff --git a/apigateway/kong/config/kong.conf b/apigateway/kong/config/kong.conf new file mode 100644 index 0000000..075ab19 --- /dev/null +++ b/apigateway/kong/config/kong.conf @@ -0,0 +1,18 @@ +# config/kong.conf +database = postgres +pg_host = kong-database +pg_user = kong +pg_password = mykongpassword +pg_database = kong + +plugins = bundled,keycloak-introspection + +admin_listen = 0.0.0.0:8001 +proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl + +client_id = kong-oidc +client_secret = xxxxxxxx +realm = kong +discovery = http://keycloak:8080/realms/kong/.well-known/openid-configuration +scope = openid +redirect_after_logout_uri = https://localhost/auth/realms/kong/protocol/openid-connect/logout?redirect_uri=https://localhost \ No newline at end of file diff --git a/apigateway/kong/docker-compose.yml b/apigateway/kong/docker-compose.yml new file mode 100644 index 0000000..0edcfb7 --- /dev/null +++ b/apigateway/kong/docker-compose.yml @@ -0,0 +1,168 @@ +version: '3' + +x-kong-config: + &kong-env + KONG_DATABASE: ${KONG_DATABASE:-postgres} + KONG_PG_DATABASE: ${KONG_PG_DATABASE:-kong} + KONG_PG_HOST: kong-database + KONG_PG_USER: ${KONG_PG_USER:-kong} + KONG_PG_PASSWORD: mykongpassword + +volumes: + keycloak_db: {} + kong_data: {} + kong_prefix_vol: + driver_opts: + type: tmpfs + device: tmpfs + kong_tmp_vol: + driver_opts: + type: tmpfs + device: tmpfs + +networks: + kong-net: + external: false + ipam: + config: + - subnet: 172.1.1.0/24 + + +services: + ################################################ + # Keycloak # + ################################################ + keycloak-db: + image: postgres:16-alpine + environment: + POSTGRES_DB: keycloak + POSTGRES_USER: keycloak + POSTGRES_PASSWORD: mykeycloakpassword + volumes: + - keycloak_db:/var/lib/postgresql/data + networks: + - kong-net + healthcheck: + test: ["CMD", "pg_isready", "-d", "keycloak", "-U", "keycloak"] + interval: 30s + timeout: 10s + retries: 5 + restart: unless-stopped + + keycloak: + image: quay.io/keycloak/keycloak:24.0 + command: + - start-dev + - --http-enabled=true + - --hostname-strict=false + - --hostname-strict-https=false + environment: + KC_DB: postgres + KC_DB_URL: jdbc:postgresql://keycloak-db:5432/keycloak + KC_DB_USERNAME: keycloak + KC_DB_PASSWORD: mykeycloakpassword + KEYCLOAK_ADMIN: admin + KEYCLOAK_ADMIN_PASSWORD: admin + KC_HOSTNAME_URL: http://localhost:8081 + + networks: + - kong-net + ports: + - "8445:8443" + - "8081:8080" + depends_on: + keycloak-db: + condition: service_healthy + restart: unless-stopped + ################################################ + # Kong components (Kong & PostgreSQL Database) # + ################################################ + + kong-migrations: + image: custom/kong-oidc:latest + # image: kong:3.5 + command: kong migrations bootstrap + environment: + <<: *kong-env + networks: + - kong-net + restart: on-failure + depends_on: + - kong-database + + kong-migrations-up: + image: kong:3.5 + command: kong migrations up && kong migrations finish + environment: + <<: *kong-env + networks: + - kong-net + restart: on-failure + depends_on: + - kong-database + + kong: + image: custom/kong-oidc:latest + # image: kong:3.5 + user: "${KONG_USER:-kong}" + environment: + <<: *kong-env + KONG_ADMIN_ACCESS_LOG: /dev/stdout + KONG_ADMIN_ERROR_LOG: /dev/stderr + KONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000, 0.0.0.0:8443 ssl}" + KONG_ADMIN_LISTEN: "${KONG_ADMIN_LISTEN:-0.0.0.0:8001}" + KONG_ADMIN_GUI_LISTEN: "${KONG_ADMIN_GUI_LISTEN:-0.0.0.0:8002}" + KONG_PROXY_ACCESS_LOG: /dev/stdout + KONG_PROXY_ERROR_LOG: /dev/stderr + KONG_PREFIX: ${KONG_PREFIX:-/var/run/kong} + KONG_TRACING_INSTRUMENTATIONS: "request" + KONG_CONF: /etc/kong/kong.conf + + networks: + - kong-net + ports: + - "${KONG_INBOUND_PROXY_LISTEN:-0.0.0.0}:8000:8000/tcp" + - "${KONG_INBOUND_SSL_PROXY_LISTEN:-0.0.0.0}:8443:8443/tcp" + - "127.0.0.1:8001:8001/tcp" + - "127.0.0.1:8444:8444/tcp" + - "127.0.0.1:8002:8002/tcp" + healthcheck: + test: [ "CMD", "kong", "health" ] + interval: 10s + timeout: 10s + retries: 10 + restart: on-failure:5 + read_only: true + volumes: + - kong_prefix_vol:${KONG_PREFIX:-/var/run/kong} + - kong_tmp_vol:/tmp + security_opt: + - no-new-privileges + + kong-database: + image: postgres:16-alpine + environment: + POSTGRES_DB: ${KONG_PG_DATABASE:-kong} + POSTGRES_USER: ${KONG_PG_USER:-kong} + POSTGRES_PASSWORD: ${KONG_PG_PASSWORD:-mykongpassword} + healthcheck: + test: + [ + "CMD", + "pg_isready", + "-d", + "${KONG_PG_DATABASE:-kong}", + "-U", + "${KONG_PG_USER:-kong}" + ] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + stdin_open: true + tty: true + networks: + - kong-net + volumes: + - kong_data:/var/lib/postgresql/data + diff --git a/apigateway/kong/keycloak-introspection/handler.lua b/apigateway/kong/keycloak-introspection/handler.lua new file mode 100644 index 0000000..b48820c --- /dev/null +++ b/apigateway/kong/keycloak-introspection/handler.lua @@ -0,0 +1,80 @@ +-- keycloak-introspection/handler.lua + +local http = require("resty.http") +local cjson = require("cjson") + +local KeycloakIntrospectionHandler = { + VERSION = "1.0.0", + PRIORITY = 10, +} + +function KeycloakIntrospectionHandler:access(config) + + -- Get the access token from the request headers + --local access_token = ngx.req.get_headers()["Authorization"] + local access_token= ngx.var.http_authorization + + if not access_token then + ngx.log(ngx.ERR, "Access token not found in request headers") + return ngx.exit(ngx.HTTP_UNAUTHORIZED) + end + -- Introspect the access token with Keycloak + + local introspection_url = config.keycloak_introspection_url + --local access_token = ngx.var.http_authorization + local httpc = http.new() + + + local headers = { + ["Content-Type"] = "application/x-www-form-urlencoded", + ["Authorization"] = "Basic " .. ngx.encode_base64(config.client_id .. ":" .. config.client_secret), + } + + local body = "token=" .. access_token + + local request_options = { + method = "POST", + body = body, + headers = headers, + } + + local res, err = httpc:request_uri(introspection_url, request_options) + + ngx.log(ngx.NOTICE, "Entering access function") + ngx.log(ngx.NOTICE, "body ", cjson.encode(request_options)) + ngx.log(ngx.NOTICE, "Plugin Configuration :", cjson.encode(config)) + + + + + if not res then + ngx.log(ngx.ERR, "Failed to introspect token: ", err) + return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) + end + + if res.status ~= 200 then + ngx.log(ngx.ERR, "Token introspection failed with status: ", res.status) + return ngx.exit(ngx.HTTP_UNAUTHORIZED) + end + + -- Parse the introspection response + local introspection_result = cjson.decode(res.body) + ngx.log(ngx.NOTICE, "Introspection result: ", res.body) + + -- Check if the token is active + if not introspection_result.active then + ngx.log(ngx.ERR, "Access token is not active") + return ngx.exit(ngx.HTTP_UNAUTHORIZED) + end + + -- Add introspection result to request headers + ngx.req.set_header("X-User-Id", introspection_result.sub) + ngx.req.set_header("X-Username", introspection_result.username) + + ngx.log(ngx.INFO, "Token introspection successful") + + -- Close the HTTP connection + httpc:close() +end + +return KeycloakIntrospectionHandler \ No newline at end of file diff --git a/apigateway/kong/keycloak-introspection/schema.lua b/apigateway/kong/keycloak-introspection/schema.lua new file mode 100644 index 0000000..76f6ad6 --- /dev/null +++ b/apigateway/kong/keycloak-introspection/schema.lua @@ -0,0 +1,19 @@ +local typedefs = require "kong.db.schema.typedefs" + +return { + name = "keycloak-introspection", + fields = { + { consumer = typedefs.no_consumer }, + { protocols = typedefs.protocols_http }, + { + config = { + type = "record", + fields = { + { keycloak_introspection_url = { type = "string", required = true, match = "https?://.+" } }, + { client_id = { type = "string", required = true, default = "check" } }, + { client_secret = { type = "string", required = true } }, + }, + }, + }, + }, +} \ No newline at end of file diff --git a/auth_service/docker-compose.yml b/auth_service/docker-compose.yml new file mode 100644 index 0000000..e69de29 From 98886150ddd9918ca9a63b05c6246df0eec776ad Mon Sep 17 00:00:00 2001 From: Harshana Date: Mon, 5 May 2025 15:44:13 +0530 Subject: [PATCH 005/134] some update --- planning-service/build.gradle | 2 +- social-media-service/build.gradle | 1 + .../controller/PostController.java | 9 +- .../controller/UserController.java | 32 +++++ .../dto/CreatePostRequestDTO.java | 2 +- .../socialmediaservice/dto/PostsPageDTO.java | 11 ++ .../socialmediaservice/entity/User.java | 9 ++ .../repository/PostRepo.java | 5 + .../repository/UserRepo.java | 2 + .../service/PostService.java | 47 ++++++- .../service/UserService.java | 118 ++++++++++++++++++ 11 files changed, 229 insertions(+), 9 deletions(-) create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/PostsPageDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java diff --git a/planning-service/build.gradle b/planning-service/build.gradle index 4f88574..a9404ae 100644 --- a/planning-service/build.gradle +++ b/planning-service/build.gradle @@ -9,7 +9,7 @@ version = '0.0.1-SNAPSHOT' java { toolchain { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(17) } } diff --git a/social-media-service/build.gradle b/social-media-service/build.gradle index 7a82268..379bcb2 100644 --- a/social-media-service/build.gradle +++ b/social-media-service/build.gradle @@ -47,6 +47,7 @@ dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-webflux' } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java index c436902..f304b64 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java @@ -2,6 +2,7 @@ import com.example.socialmediaservice.dto.CreatePostRequestDTO; import com.example.socialmediaservice.dto.PostDTO; +import com.example.socialmediaservice.dto.PostsPageDTO; import com.example.socialmediaservice.dto.UpdatePostRequestDTO; import com.example.socialmediaservice.service.CommentService; import com.example.socialmediaservice.service.PostService; @@ -27,7 +28,7 @@ public class PostController { public ResponseEntity createPost( // @PathVariable String userId, @RequestBody CreatePostRequestDTO createPostRequestDTO) { - return ResponseEntity.ok(postService.createPost(createPostRequestDTO.getUserId(), createPostRequestDTO)); + return ResponseEntity.ok(postService.createPost(createPostRequestDTO.getEmail(), createPostRequestDTO)); } // 2. Get all posts created by a specific user @@ -50,5 +51,11 @@ public ResponseEntity updatePost( return ResponseEntity.ok(postService.updatePost(postId, requestDTO)); } + @GetMapping("/for-you") + public ResponseEntity getForYouPosts( + @RequestParam(required = false) String cursor, + @RequestParam(defaultValue = "10") int size) { + return ResponseEntity.ok(postService.getForYouFeed(cursor, size)); + } } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java index 12ac7a8..4b8ee8c 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java @@ -1,4 +1,36 @@ package com.example.socialmediaservice.controller; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.service.UserService; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/users") +@RequiredArgsConstructor +@CrossOrigin(origins = "*") // <-- Allow your frontend to call backend public class UserController { + + private final UserService userService; + + @PostMapping("/register") + public User registerUser(@RequestBody RegisterRequest request) { + return userService.registerUser( + request.getUsername(), + request.getEmail(), + request.getPassword(), + request.getFirstName(), + request.getLastName() + ); + } + + @Data + static class RegisterRequest { + private String username; + private String email; + private String password; + private String firstName; + private String lastName; + } } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java index 469cf21..5439b42 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java @@ -5,5 +5,5 @@ @Data public class CreatePostRequestDTO { private String content; - private String userId; + private String email; } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostsPageDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostsPageDTO.java new file mode 100644 index 0000000..1a7dd0a --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostsPageDTO.java @@ -0,0 +1,11 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class PostsPageDTO { + private List posts; + private String nextCursor; +} \ No newline at end of file diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java index 72b7c22..33bd12f 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java @@ -18,6 +18,15 @@ public class User { @Column(unique = true, nullable = false) private String username; + @Column(unique = true, nullable = true) + private String email; + + @Column(nullable = true) + private String firstName; + + @Column(nullable = true) + private String lastName; + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List posts = new ArrayList<>(); } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java index 47eea1d..be9ff03 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/PostRepo.java @@ -3,6 +3,8 @@ import com.example.socialmediaservice.entity.Post; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import org.springframework.data.domain.Pageable; + import java.util.List; @@ -10,4 +12,7 @@ public interface PostRepo extends JpaRepository { List findByUser_UserId(String userId); Post findByPostId(String postId); + List findAllByOrderByCreatedAtDesc(Pageable pageable); + List findByPostIdLessThanOrderByCreatedAtDesc(String postId, Pageable pageable); + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java index cf35cf8..7a271b7 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java @@ -10,5 +10,7 @@ public interface UserRepo extends JpaRepository { Optional findByUserId(String userId); + Optional findByEmail(String username); + boolean existsByUsername(String username); // List findByUserProfile_PostId(String postId); } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java index 6c366ba..fa5fccc 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java @@ -1,10 +1,7 @@ package com.example.socialmediaservice.service; -import com.example.socialmediaservice.dto.CommentDTO; -import com.example.socialmediaservice.dto.CreatePostRequestDTO; -import com.example.socialmediaservice.dto.PostDTO; -import com.example.socialmediaservice.dto.UpdatePostRequestDTO; +import com.example.socialmediaservice.dto.*; import com.example.socialmediaservice.entity.Comment; import com.example.socialmediaservice.entity.Post; import com.example.socialmediaservice.entity.User; @@ -13,12 +10,14 @@ import com.example.socialmediaservice.repository.PostRepo; import com.example.socialmediaservice.repository.UserRepo; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor public class PostService { @@ -30,8 +29,9 @@ public class PostService { // 1. Create Post - public PostDTO createPost(String userId, CreatePostRequestDTO createPostRequestDTO) { - User user = userRepo.findByUserId(userId) + public PostDTO createPost(String email, CreatePostRequestDTO createPostRequestDTO) { + log.info("email :{} post content:{}", email, createPostRequestDTO.getContent()); + User user = userRepo.findByEmail(email) .orElseThrow(() -> new RuntimeException("User not found")); Post post = new Post(); @@ -167,4 +167,39 @@ public PostDTO updatePost(String postId, UpdatePostRequestDTO requestDTO) { return PostMapper.toDto(updatedPost); } + public PostsPageDTO getForYouFeed(String cursor, int size) { + // Assuming cursor = postId of the last post from previous page + List posts; + + if (cursor != null) { + posts = postRepo.findByPostIdLessThanOrderByCreatedAtDesc(cursor, PageRequest.of(0, size + 1)); + } else { + posts = postRepo.findAllByOrderByCreatedAtDesc(PageRequest.of(0, size + 1)); + } + + boolean hasNext = posts.size() > size; + if (hasNext) { + posts = posts.subList(0, size); + } + + List postDTOs = posts.stream().map(post -> { + PostDTO dto = PostMapper.toDto(post); + dto.setComments(commentService.getCommentsByPost(post).stream().map(comment -> { + CommentDTO c = new CommentDTO(); + c.setUserId(comment.getUser().getUserId()); + c.setContent(comment.getContent()); + c.setCreatedAt(comment.getCreatedAt()); + return c; + }).collect(Collectors.toList())); + dto.setReactionCounts(reactionService.getReactionCounts(post)); + return dto; + }).collect(Collectors.toList()); + + PostsPageDTO page = new PostsPageDTO(); + page.setPosts(postDTOs); + page.setNextCursor(hasNext ? postDTOs.get(postDTOs.size() - 1).getPostId() : null); + + return page; + } + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java new file mode 100644 index 0000000..1dabfeb --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java @@ -0,0 +1,118 @@ +package com.example.socialmediaservice.service; + +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.repository.UserRepo; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.http.MediaType; +import org.springframework.http.HttpHeaders; +import reactor.core.publisher.Mono; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserRepo userRepository; + private final WebClient.Builder webClientBuilder; + + private final String keycloakUrl = "http://localhost:8081"; + private final String adminUsername = "admin"; + private final String adminPassword = "admin"; + + @Transactional + public User registerUser(String username, String email, String password,String firstName,String lastName) { + if (userRepository.existsByUsername(username)) { + throw new RuntimeException("Username already exists"); + } + + User user = new User(); + user.setUsername(username); + user.setFirstName(firstName); + user.setLastName(lastName); + user.setEmail(email); + + userRepository.save(user); + + createUserInKeycloak(username, email, password,firstName,lastName); + + return user; + } + + private void createUserInKeycloak(String username, String email, String password, String firstName, String lastName) { + String adminToken = getAdminAccessToken(); + + WebClient webClient = webClientBuilder.build(); + + var response = webClient.post() + .uri(keycloakUrl + "/admin/realms/kong/users") + .header(HttpHeaders.AUTHORIZATION, "Bearer " + adminToken) + .contentType(MediaType.APPLICATION_JSON) + .bodyValue(new KeycloakUserRequest(username, email, password, firstName, lastName)) + .retrieve() + .toBodilessEntity() + .block(); + + if (response == null || !response.getStatusCode().is2xxSuccessful()) { + throw new RuntimeException("Failed to create user in Keycloak"); + } + } + + + private String getAdminAccessToken() { + WebClient webClient = webClientBuilder.build(); + + var tokenResponse = webClient.post() + .uri(keycloakUrl + "/realms/master/protocol/openid-connect/token") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .bodyValue("grant_type=password&client_id=admin-cli&username=" + adminUsername + "&password=" + adminPassword) + .retrieve() + .bodyToMono(TokenResponse.class) + .block(); + + if (tokenResponse == null || tokenResponse.getAccessToken() == null) { + throw new RuntimeException("Failed to authenticate with Keycloak"); + } + + return tokenResponse.getAccessToken(); + } + + @lombok.Data + static class TokenResponse { + private String access_token; + public String getAccessToken() { + return access_token; + } + } + + @lombok.Data + static class KeycloakUserRequest { + private String username; + private String email; + private String firstName; + private String lastName; + private boolean enabled = true; + private boolean emailVerified = true; + private Credential[] credentials; + + public KeycloakUserRequest(String username, String email, String password,String firstName,String lastName) { + this.username = username; + this.email = email; + this.firstName = firstName; + this.lastName = lastName; + this.credentials = new Credential[] { new Credential(password) }; + } + + @lombok.Data + static class Credential { + private String type = "password"; + private String value; + private boolean temporary = false; + + public Credential(String value) { + this.value = value; + } + } + } +} From 87f04ce7941727edba481b364b362c82e57198bb Mon Sep 17 00:00:00 2001 From: malinduGamage Date: Tue, 13 May 2025 10:28:24 +0530 Subject: [PATCH 006/134] api service initial implementation --- api-service/config/config.go | 21 +++ api-service/controllers/geocode.go | 29 +++ api-service/controllers/location_data.go | 68 +++++++ api-service/controllers/location_summery.go | 26 +++ api-service/go.mod | 48 +++++ api-service/go.sum | 186 ++++++++++++++++++++ api-service/main.go | 18 ++ api-service/models/geocode_model.go | 14 ++ api-service/models/places_model.go | 27 +++ api-service/routes/routes.go | 28 +++ api-service/services/gemini/gemini.go | 31 ++++ api-service/services/maps/geocode.go | 28 +++ api-service/services/maps/places.go | 30 ++++ 13 files changed, 554 insertions(+) create mode 100644 api-service/config/config.go create mode 100644 api-service/controllers/geocode.go create mode 100644 api-service/controllers/location_data.go create mode 100644 api-service/controllers/location_summery.go create mode 100644 api-service/go.mod create mode 100644 api-service/go.sum create mode 100644 api-service/main.go create mode 100644 api-service/models/geocode_model.go create mode 100644 api-service/models/places_model.go create mode 100644 api-service/routes/routes.go create mode 100644 api-service/services/gemini/gemini.go create mode 100644 api-service/services/maps/geocode.go create mode 100644 api-service/services/maps/places.go diff --git a/api-service/config/config.go b/api-service/config/config.go new file mode 100644 index 0000000..5251f55 --- /dev/null +++ b/api-service/config/config.go @@ -0,0 +1,21 @@ +package config + +import ( + "log" + "os" + + "github.com/joho/godotenv" +) + +func LoadEnv() { + if err := godotenv.Load(); err != nil { + log.Println("No .env file found") + } +} + +func GetEnv(key, fallback string) string { + if value := os.Getenv(key); value != "" { + return value + } + return fallback +} diff --git a/api-service/controllers/geocode.go b/api-service/controllers/geocode.go new file mode 100644 index 0000000..c9f1af3 --- /dev/null +++ b/api-service/controllers/geocode.go @@ -0,0 +1,29 @@ +package controllers + +import ( + "api-service/services/maps" + "net/http" + + "github.com/gin-gonic/gin" +) + +func GeocodeController(c *gin.Context) { + address := c.Query("address") + if address == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Missing address parameter"}) + return + } + + result, err := maps.CallGeocodeAPI(address) + if err != nil || result.Status != "OK" || len(result.Results) == 0 { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch location"}) + return + } + + res := result.Results[0] + c.JSON(http.StatusOK, gin.H{ + "formatted_address": res.FormattedAddress, + "latitude": res.Geometry.Location.Lat, + "longitude": res.Geometry.Location.Lng, + }) +} diff --git a/api-service/controllers/location_data.go b/api-service/controllers/location_data.go new file mode 100644 index 0000000..4429b20 --- /dev/null +++ b/api-service/controllers/location_data.go @@ -0,0 +1,68 @@ +package controllers + +import ( + "api-service/models" + "api-service/services/maps" + "net/http" + "strconv" + "sync" + + "github.com/gin-gonic/gin" +) + +func LocationDataController(c *gin.Context) { + location := c.Query("location") + radius, r_err := strconv.Atoi(c.Query("radius")) + placeTypes := c.QueryArray("types") + + if location == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Missing location parameter"}) + return + } + if r_err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Error in radius parameter"}) + return + } + if len(placeTypes) == 0 { + c.JSON(http.StatusBadRequest, gin.H{"error": "Missing type parameter"}) + return + } + + var wg sync.WaitGroup + results := make(chan *models.PlacesResponse, len(placeTypes)) + errors := make(chan error, len(placeTypes)) + + for _, placeType := range placeTypes { + wg.Add(1) + go func(placeType string) { + defer wg.Done() + result, err := maps.CallPlacesAPI(location, radius, placeType) + if err != nil || result.Status != "OK" || len(result.Results) == 0 { + errors <- err + return + } + results <- result + }(placeType) + } + + wg.Wait() + close(results) + close(errors) + + // Check if there were any errors + if len(errors) > 0 { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch location data"}) + return + } + + // Aggregate results + var aggregatedResults []models.PlacesResponse + for result := range results { + aggregatedResults = append(aggregatedResults, *result) + } + + c.JSON(http.StatusOK, gin.H{ + "status": "OK", + "results": aggregatedResults, + }) +} diff --git a/api-service/controllers/location_summery.go b/api-service/controllers/location_summery.go new file mode 100644 index 0000000..001a8ab --- /dev/null +++ b/api-service/controllers/location_summery.go @@ -0,0 +1,26 @@ +package controllers + +import ( + "api-service/services/gemini" + "net/http" + + "github.com/gin-gonic/gin" +) + +func LocationSummeryController(c *gin.Context) { + location := c.Query("location") + if location == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Missing location parameter"}) + return + } + + result, err := gemini.CallGeminiAPI("assume the role of a travel guide and provide a summery on " + location + " in 100 words") + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch location summary"}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "summary": result.Text(), // Assuming the response has a 'Content' field for the summary + }) +} diff --git a/api-service/go.mod b/api-service/go.mod new file mode 100644 index 0000000..f5c9a62 --- /dev/null +++ b/api-service/go.mod @@ -0,0 +1,48 @@ +module api-service + +go 1.24.2 + +require ( + github.com/gin-gonic/gin v1.10.0 + github.com/joho/godotenv v1.5.1 + google.golang.org/genai v1.4.0 +) + +require ( + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.9.3 // indirect + cloud.google.com/go/compute/metadata v0.5.0 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/gabriel-vasile/mimetype v1.4.9 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.26.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/s2a-go v0.1.8 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + go.opencensus.io v0.24.0 // indirect + golang.org/x/arch v0.16.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/net v0.39.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.24.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.66.2 // indirect + google.golang.org/protobuf v1.36.6 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/api-service/go.sum b/api-service/go.sum new file mode 100644 index 0000000..2178473 --- /dev/null +++ b/api-service/go.sum @@ -0,0 +1,186 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U= +cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= +github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= +github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U= +golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genai v1.4.0 h1:i3D6q5UTLoAHuXOaDtJnA4Lcz6v+aBP3phGBYOgzEm4= +google.golang.org/genai v1.4.0/go.mod h1:TyfOKRz/QyCaj6f/ZDt505x+YreXnY40l2I6k8TvgqY= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= +google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/api-service/main.go b/api-service/main.go new file mode 100644 index 0000000..4618886 --- /dev/null +++ b/api-service/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "api-service/config" + "api-service/routes" + + "github.com/gin-gonic/gin" +) + +func main() { + config.LoadEnv() + port := config.GetEnv("PORT", "8080") + + r := gin.Default() + routes.RegisterRoutes(r) + + r.Run(":" + port) +} diff --git a/api-service/models/geocode_model.go b/api-service/models/geocode_model.go new file mode 100644 index 0000000..fbad719 --- /dev/null +++ b/api-service/models/geocode_model.go @@ -0,0 +1,14 @@ +package models + +type GeocodeResponse struct { + Results []struct { + FormattedAddress string `json:"formatted_address"` + Geometry struct { + Location struct { + Lat float64 `json:"lat"` + Lng float64 `json:"lng"` + } `json:"location"` + } `json:"geometry"` + } `json:"results"` + Status string `json:"status"` +} diff --git a/api-service/models/places_model.go b/api-service/models/places_model.go new file mode 100644 index 0000000..bccde23 --- /dev/null +++ b/api-service/models/places_model.go @@ -0,0 +1,27 @@ +package models + +type PlacesResponse struct { + Results []struct { + Name string `json:"name"` + Address string `json:"vicinity"` + Rating float64 `json:"rating,omitempty"` + UserRatingsTotal int `json:"user_ratings_total,omitempty"` + PlaceID string `json:"place_id"` + Types []string `json:"types,omitempty"` + Geometry struct { + Location struct { + Lat float64 `json:"lat"` + Lng float64 `json:"lng"` + } `json:"location"` + } `json:"geometry"` + OpeningHours struct { + OpenNow bool `json:"open_now,omitempty"` + } `json:"opening_hours,omitempty"` + Photos []struct { + PhotoReference string `json:"photo_reference"` + Height int `json:"height"` + Width int `json:"width"` + } `json:"photos,omitempty"` + } `json:"results"` + Status string `json:"status"` +} diff --git a/api-service/routes/routes.go b/api-service/routes/routes.go new file mode 100644 index 0000000..b65af0a --- /dev/null +++ b/api-service/routes/routes.go @@ -0,0 +1,28 @@ +package routes + +import ( + "api-service/controllers" + + "github.com/gin-gonic/gin" +) + +func RegisterRoutes(r *gin.Engine) { + api := r.Group("/api") + { + maps := api.Group("/maps") + { + maps.GET("/geocode", controllers.GeocodeController) + maps.GET("/places", controllers.LocationDataController) + } + gemini := api.Group("/gemini") + { + gemini.GET("/location-summery", controllers.LocationSummeryController) + } + } + test := r.Group("/test") + { + test.GET("/", func(c *gin.Context) { + c.String(200, "hello world") + }) + } +} diff --git a/api-service/services/gemini/gemini.go b/api-service/services/gemini/gemini.go new file mode 100644 index 0000000..c8835cf --- /dev/null +++ b/api-service/services/gemini/gemini.go @@ -0,0 +1,31 @@ +package gemini + +import ( + "context" + + "api-service/config" + + "google.golang.org/genai" +) + +func CallGeminiAPI(prompt string) (*genai.GenerateContentResponse, error) { + ctx := context.Background() + client, err := genai.NewClient(ctx, &genai.ClientConfig{ + APIKey: config.GetEnv("GOOGLE_GEMINI_API_KEY", ""), + Backend: genai.BackendGeminiAPI, + }) + if err != nil { + return nil, err + } + resp, err := client.Models.GenerateContent( + ctx, + "gemini-2.0-flash", + genai.Text(prompt), + nil, + ) + if err != nil { + return nil, err + } + + return resp, nil +} diff --git a/api-service/services/maps/geocode.go b/api-service/services/maps/geocode.go new file mode 100644 index 0000000..85a7a77 --- /dev/null +++ b/api-service/services/maps/geocode.go @@ -0,0 +1,28 @@ +package maps + +import ( + "api-service/config" + "api-service/models" + "encoding/json" + "fmt" + "net/http" + "net/url" +) + +func CallGeocodeAPI(address string) (*models.GeocodeResponse, error) { + baseURL := "https://maps.googleapis.com/maps/api/geocode/json" + query := url.Values{} + query.Set("address", address) + query.Set("key", config.GetEnv("GOOGLE_MAPS_API_KEY", "")) + + fullURL := fmt.Sprintf("%s?%s", baseURL, query.Encode()) + resp, err := http.Get(fullURL) + if err != nil { + return nil, err + } + defer resp.Body.Close() //after the end of the function, close the response body + + var geocode models.GeocodeResponse + err = json.NewDecoder(resp.Body).Decode(&geocode) + return &geocode, err +} diff --git a/api-service/services/maps/places.go b/api-service/services/maps/places.go new file mode 100644 index 0000000..e111948 --- /dev/null +++ b/api-service/services/maps/places.go @@ -0,0 +1,30 @@ +package maps + +import ( + "api-service/config" + "api-service/models" + "encoding/json" + "fmt" + "net/http" + "net/url" +) + +func CallPlacesAPI(location string, radius int, placeType string) (*models.PlacesResponse, error) { + baseURL := "https://maps.googleapis.com/maps/api/place/nearbysearch/json" + query := url.Values{} + query.Set("location", location) + query.Set("radius", fmt.Sprintf("%d", radius)) + query.Set("type", placeType) + query.Set("key", config.GetEnv("GOOGLE_MAPS_API_KEY", "")) + + fullURL := fmt.Sprintf("%s?%s", baseURL, query.Encode()) + resp, err := http.Get(fullURL) + if err != nil { + return nil, err + } + defer resp.Body.Close() //after the end of the function, close the response body + + var place models.PlacesResponse + err = json.NewDecoder(resp.Body).Decode(&place) + return &place, err +} From c74a132145bd1e0a35c1a959791b66dc70bc60f0 Mon Sep 17 00:00:00 2001 From: Harshana Date: Tue, 13 May 2025 13:49:26 +0530 Subject: [PATCH 007/134] some fixed --- .../socialmediaservice/config/CorsConfig.java | 24 ++++ .../controller/MediaController.java | 30 ++++ .../controller/PostController.java | 13 +- .../controller/PostInteractionController.java | 70 ++++++++-- .../controller/UserController.java | 38 ++++++ .../socialmediaservice/dto/CommentDTO.java | 3 +- .../dto/CreatePostRequestDTO.java | 5 +- .../dto/CreatePostResponseDTO.java | 20 +++ .../dto/MediaCreateRequestDTO.java | 10 ++ .../socialmediaservice/dto/MediaDTO.java | 11 ++ .../socialmediaservice/dto/PostDTO.java | 22 ++- .../dto/RequestCommentDTO.java | 9 ++ .../dto/UpdatePostRequestDTO.java | 7 +- .../dto/UpdateProfileRequest.java | 10 ++ .../socialmediaservice/dto/UserDTO.java | 11 ++ .../socialmediaservice/entity/Media.java | 30 ++++ .../socialmediaservice/entity/Post.java | 8 +- .../socialmediaservice/entity/User.java | 22 +++ .../socialmediaservice/enums/MediaType.java | 6 + .../mapper/CommentMapper.java | 8 +- .../socialmediaservice/mapper/PostMapper.java | 58 +++++++- .../repository/CommentRepo.java | 4 +- .../repository/MediaRepo.java | 7 + .../repository/UserRepo.java | 1 + .../service/MediaService.java | 27 ++++ .../service/PostService.java | 128 +++++++++++------- .../service/ReactionService.java | 1 + .../service/UserService.java | 39 ++++++ .../src/main/resources/application.properties | 4 +- 29 files changed, 543 insertions(+), 83 deletions(-) create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/config/CorsConfig.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/controller/MediaController.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostResponseDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaCreateRequestDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/RequestCommentDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/UserDTO.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/entity/Media.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/enums/MediaType.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/repository/MediaRepo.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/service/MediaService.java diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/config/CorsConfig.java b/social-media-service/src/main/java/com/example/socialmediaservice/config/CorsConfig.java new file mode 100644 index 0000000..8aea696 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/config/CorsConfig.java @@ -0,0 +1,24 @@ +//package com.example.socialmediaservice.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.servlet.config.annotation.CorsRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +// +//@Configuration +//public class CorsConfig { +// @Bean +// public WebMvcConfigurer corsConfigurer() { +// return new WebMvcConfigurer() { +// @Override +// public void addCorsMappings(CorsRegistry registry) { +// registry.addMapping("/**") +// .allowedOriginPatterns("http://localhost:3000") // ✅ Specific origin +// .allowedMethods("*") +// .allowedHeaders("*") +// .allowCredentials(true); // ✅ Only works with specific origin +// } +// }; +// } +//} +// diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/MediaController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/MediaController.java new file mode 100644 index 0000000..0733f68 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/MediaController.java @@ -0,0 +1,30 @@ +package com.example.socialmediaservice.controller; + +import com.example.socialmediaservice.dto.MediaCreateRequestDTO; +import com.example.socialmediaservice.dto.MediaDTO; +import com.example.socialmediaservice.entity.Media; +import com.example.socialmediaservice.service.MediaService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/media") +@RequiredArgsConstructor +public class MediaController { + + private final MediaService mediaService; + + @PostMapping + public ResponseEntity createMedia(@RequestBody MediaCreateRequestDTO requestDTO) { + Media media = mediaService.createMedia(requestDTO.getUrl(), requestDTO.getType()); + MediaDTO dto = new MediaDTO(); + dto.setId(media.getId()); + dto.setUrl(media.getUrl()); + dto.setType(media.getType()); + return ResponseEntity.ok(dto); + } +} \ No newline at end of file diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java index f304b64..adcbb78 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostController.java @@ -1,19 +1,19 @@ package com.example.socialmediaservice.controller; -import com.example.socialmediaservice.dto.CreatePostRequestDTO; -import com.example.socialmediaservice.dto.PostDTO; -import com.example.socialmediaservice.dto.PostsPageDTO; -import com.example.socialmediaservice.dto.UpdatePostRequestDTO; +import com.example.socialmediaservice.dto.*; import com.example.socialmediaservice.service.CommentService; import com.example.socialmediaservice.service.PostService; import com.example.socialmediaservice.service.ReactionService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; +@Slf4j @RestController @RequestMapping("/api/posts") @RequiredArgsConstructor @@ -25,13 +25,15 @@ public class PostController { // 1. Create Post @PostMapping("/create") - public ResponseEntity createPost( + public ResponseEntity createPost( // @PathVariable String userId, @RequestBody CreatePostRequestDTO createPostRequestDTO) { + log.info("email: {} | caption: {}", createPostRequestDTO.getEmail(), createPostRequestDTO.getCaption()); return ResponseEntity.ok(postService.createPost(createPostRequestDTO.getEmail(), createPostRequestDTO)); } // 2. Get all posts created by a specific user + @CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true") @GetMapping("/user/{userId}") public ResponseEntity> getPostsByUser(@PathVariable String userId) { return ResponseEntity.ok(postService.getPostsByUser(userId)); @@ -51,6 +53,7 @@ public ResponseEntity updatePost( return ResponseEntity.ok(postService.updatePost(postId, requestDTO)); } + @CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true") @GetMapping("/for-you") public ResponseEntity getForYouPosts( @RequestParam(required = false) String cursor, diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java index df11575..31a7fe2 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java @@ -2,6 +2,8 @@ import com.example.socialmediaservice.dto.CommentDTO; import com.example.socialmediaservice.dto.ReplyCommentRequestDTO; +import com.example.socialmediaservice.dto.RequestCommentDTO; +import com.example.socialmediaservice.dto.UserDTO; import com.example.socialmediaservice.entity.Comment; import com.example.socialmediaservice.entity.Post; import com.example.socialmediaservice.entity.User; @@ -13,16 +15,25 @@ import com.example.socialmediaservice.service.ReactionService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +@Slf4j +@CrossOrigin(origins = "http://localhost:3000") @RestController @RequiredArgsConstructor -@RequestMapping("/posts") +@RequestMapping("/api/posts") public class PostInteractionController { private final PostRepo postRepo; @@ -33,24 +44,42 @@ public class PostInteractionController { // 1. Get all comments for a specific post @GetMapping("/{postId}/comments") - public ResponseEntity> getCommentsForPost( - @PathVariable String postId) { + public ResponseEntity> getCommentsForPost( + @PathVariable String postId, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "5") int size + ) { Post post = postRepo.findByPostId(postId); if (post == null) { return ResponseEntity.notFound().build(); } - List commentDTOs = commentService.getCommentsByPost(post).stream().map(comment -> { + Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending()); + Page commentPage = commentRepo.findByPost(post, pageable); + + List commentDTOs = commentPage.stream().map(comment -> { CommentDTO dto = new CommentDTO(); - dto.setUserId(comment.getUser().getUserId()); + UserDTO userDTO = new UserDTO(); + userDTO.setId(comment.getUser().getUserId()); + userDTO.setUsername(comment.getUser().getUsername()); + userDTO.setDisplayName(comment.getUser().getFirstName()); + userDTO.setAvatarUrl(comment.getUser().getAvatarUrl()); + dto.setCommentId(comment.getCommentId()); + dto.setUser(userDTO); dto.setContent(comment.getContent()); dto.setCreatedAt(comment.getCreatedAt()); return dto; - }).collect(Collectors.toList()); + }).toList(); + + Map response = new HashMap<>(); + response.put("comments", commentDTOs); + response.put("hasNext", commentPage.hasNext()); + response.put("nextPage", page + 1); - return ResponseEntity.ok(commentDTOs); + return ResponseEntity.ok(response); } + // 2. Get reaction counts for a specific post @GetMapping("/{postId}/reactions") public ResponseEntity> getReactionCounts(@PathVariable String postId) { @@ -67,10 +96,11 @@ public ResponseEntity> getReactionCounts(@PathVariable S @PostMapping("/{postId}/react") public ResponseEntity addOrUpdateReaction(@PathVariable String postId, @RequestParam String userId, - @RequestParam ReactionType type) { + @RequestParam ReactionType type) { + Post post = postRepo.findByPostId(postId); if (post == null) return ResponseEntity.notFound().build(); - + System.out.println("UserID received: " + userId); User user = userRepo.findByUserId(userId) .orElseThrow(() -> new RuntimeException("User not found")); @@ -81,8 +111,10 @@ public ResponseEntity addOrUpdateReaction(@PathVariable String postId, // 4. Add comments to a post @PostMapping("{postId}/comment") public ResponseEntity addCommentToPost(@PathVariable String postId, - @RequestBody CommentDTO requestDTO) { + @RequestBody RequestCommentDTO requestDTO) { + log.info("PostId: {}, User: {}", postId, requestDTO.getUserId()); Post post = postRepo.findByPostId(postId); + if (post == null) return ResponseEntity.notFound().build(); User user = userRepo.findByUserId(requestDTO.getUserId()) @@ -108,6 +140,24 @@ public ResponseEntity replyToComment(@PathVariable String commentId, return ResponseEntity.ok().build(); } + @DeleteMapping("/comments/{commentId}") + public ResponseEntity deleteComment( + @PathVariable String commentId, + @RequestParam String userId + ) { + log.info("CommentId: {}, UserId: {}", commentId, userId); + Comment comment = commentRepo.findById(commentId) + .orElseThrow(() -> new RuntimeException("Comment not found")); + +// log.info("Comment: {}", comment.toString()); + + if (!comment.getUser().getUserId().equals(userId)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + commentRepo.delete(comment); + return ResponseEntity.ok().build(); + } } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java index 4b8ee8c..dfec5b1 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java @@ -1,9 +1,11 @@ package com.example.socialmediaservice.controller; +import com.example.socialmediaservice.dto.UpdateProfileRequest; import com.example.socialmediaservice.entity.User; import com.example.socialmediaservice.service.UserService; import lombok.Data; import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @@ -25,6 +27,37 @@ public User registerUser(@RequestBody RegisterRequest request) { ); } + @PutMapping("/{userId}/avatar") + public User updateAvatar(@PathVariable String userId, @RequestBody AvatarUpdateRequest request) { + return userService.updateAvatar(userId, request.getAvatarUrl()); + } + +// @CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true") + @GetMapping("/email/{email}") + public ResponseEntity getUserByEmail(@PathVariable String email) { + if (email == null || email.isBlank()) { + throw new IllegalArgumentException("Email path variable is missing"); + } + User user = userService.getUserByEmail(email); + return ResponseEntity.ok(user); + } + + @GetMapping("/username/{username}") + public ResponseEntity getUserByUsername(@PathVariable String username) { + User user = userService.getUserByUsername(username); + return ResponseEntity.ok(user); + } + + @PutMapping("/{userId}/profile") + public ResponseEntity updateUserProfile( + @PathVariable String userId, + @RequestBody UpdateProfileRequest request + ) { + User updated = userService.updateUserProfile(userId, request); + return ResponseEntity.ok(updated); + } + + @Data static class RegisterRequest { private String username; @@ -33,4 +66,9 @@ static class RegisterRequest { private String firstName; private String lastName; } + + @Data + static class AvatarUpdateRequest { + private String avatarUrl; + } } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java index ca3e938..b6201de 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CommentDTO.java @@ -7,7 +7,8 @@ @Data public class CommentDTO { - private String userId; + private String commentId; + private UserDTO user; private String content; private LocalDateTime createdAt; private String parentCommentId; diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java index 5439b42..25c6c82 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostRequestDTO.java @@ -2,8 +2,11 @@ import lombok.Data; +import java.util.List; + @Data public class CreatePostRequestDTO { - private String content; + private String caption; private String email; + private List mediaIds; // Optional list of media IDs (UUID strings) } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostResponseDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostResponseDTO.java new file mode 100644 index 0000000..ce2a5d4 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/CreatePostResponseDTO.java @@ -0,0 +1,20 @@ +package com.example.socialmediaservice.dto; + +import com.example.socialmediaservice.enums.ReactionType; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Data +public class CreatePostResponseDTO { + private String postId; + private String caption; + private String userId; + private String username; + private LocalDateTime createdAt; + private List media; + private List comments; + private Map reactionCounts; +} \ No newline at end of file diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaCreateRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaCreateRequestDTO.java new file mode 100644 index 0000000..04f761e --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaCreateRequestDTO.java @@ -0,0 +1,10 @@ +package com.example.socialmediaservice.dto; + +import com.example.socialmediaservice.enums.MediaType; +import lombok.Data; + +@Data +public class MediaCreateRequestDTO { + private String url; + private MediaType type; // IMAGE or VIDEO +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaDTO.java new file mode 100644 index 0000000..18682ca --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/MediaDTO.java @@ -0,0 +1,11 @@ +package com.example.socialmediaservice.dto; + +import com.example.socialmediaservice.enums.MediaType; +import lombok.Data; + +@Data +public class MediaDTO { + private String id; + private String url; + private MediaType type; // IMAGE or VIDEO +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java index e0f063d..98e2896 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/PostDTO.java @@ -1,5 +1,6 @@ package com.example.socialmediaservice.dto; +import com.example.socialmediaservice.enums.MediaType; import com.example.socialmediaservice.enums.ReactionType; import lombok.Data; @@ -10,10 +11,25 @@ @Data public class PostDTO { private String postId; - private String content; - private String userId; - private String username; + private String caption; private LocalDateTime createdAt; + + private UserDTO user; + private List attachments; private List comments; private Map reactionCounts; + private List reactions; + + private CountDTO _count; + + @Data + public static class CountDTO { + private int likes; + private int comments; + } + @Data + public static class UserIdDTO { + private String userId; + } } + diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/RequestCommentDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/RequestCommentDTO.java new file mode 100644 index 0000000..4eaea86 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/RequestCommentDTO.java @@ -0,0 +1,9 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; + +@Data +public class RequestCommentDTO { + private String userId; + private String content; +} \ No newline at end of file diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java index 4b2769a..e9d75c2 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdatePostRequestDTO.java @@ -3,8 +3,11 @@ import lombok.Data; import lombok.RequiredArgsConstructor; +import java.util.List; + @Data @RequiredArgsConstructor public class UpdatePostRequestDTO { - private String content; -} + private String caption; + private List mediaIds; // Optional updates to media list +} \ No newline at end of file diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java new file mode 100644 index 0000000..467f586 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java @@ -0,0 +1,10 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; + +@Data +public class UpdateProfileRequest { + private String displayName; + private String bio; + private String avatarUrl; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UserDTO.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UserDTO.java new file mode 100644 index 0000000..81fbb4e --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UserDTO.java @@ -0,0 +1,11 @@ +package com.example.socialmediaservice.dto; + +import lombok.Data; + +@Data +public class UserDTO { + private String id; + private String username; + private String displayName; + private String avatarUrl; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Media.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Media.java new file mode 100644 index 0000000..5208c96 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Media.java @@ -0,0 +1,30 @@ +package com.example.socialmediaservice.entity; + +import com.example.socialmediaservice.enums.MediaType; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "media") +public class Media { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String id; + + @Column(nullable = false) + private String url; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private MediaType type; // IMAGE or VIDEO + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id") + private Post post; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java index 401f5d7..53459c5 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Post.java @@ -20,8 +20,8 @@ public class Post { @GeneratedValue(strategy = GenerationType.UUID) private String postId; - @Column(nullable = false, columnDefinition = "TEXT") - private String content; + @Column(columnDefinition = "TEXT") + private String caption; // ✅ Optional description field @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) @@ -36,4 +36,8 @@ public class Post { @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) private List comments = new ArrayList<>(); + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private List mediaList = new ArrayList<>(); // ✅ List of attached media (images/videos) + + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java index 33bd12f..00f4348 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java @@ -1,5 +1,6 @@ package com.example.socialmediaservice.entity; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.Data; @@ -27,6 +28,27 @@ public class User { @Column(nullable = true) private String lastName; + @Column(nullable = true, columnDefinition = "TEXT") + private String bio; + + @Column(nullable = true) + private String avatarUrl; + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnoreProperties("user") // Prevent recursion during serialization private List posts = new ArrayList<>(); + + @ManyToMany + @JoinTable( + name = "followers", + joinColumns = @JoinColumn(name = "user_id"), + inverseJoinColumns = @JoinColumn(name = "follower_id") + ) + @JsonIgnoreProperties("followers") // Prevent full circular graph + private List followers = new ArrayList<>(); + + @ManyToMany(mappedBy = "followers") + @JsonIgnoreProperties("following") + private List following = new ArrayList<>(); + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/enums/MediaType.java b/social-media-service/src/main/java/com/example/socialmediaservice/enums/MediaType.java new file mode 100644 index 0000000..4f92813 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/enums/MediaType.java @@ -0,0 +1,6 @@ +package com.example.socialmediaservice.enums; + +public enum MediaType { + IMAGE, + VIDEO +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java index a415bf8..2ec524d 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/CommentMapper.java @@ -2,6 +2,7 @@ import com.example.socialmediaservice.dto.CommentDTO; +import com.example.socialmediaservice.dto.UserDTO; import com.example.socialmediaservice.entity.Comment; import java.util.stream.Collectors; @@ -10,7 +11,12 @@ public class CommentMapper { private CommentDTO toDtoWithReplies(Comment comment) { CommentDTO dto = new CommentDTO(); - dto.setUserId(comment.getUser().getUserId()); + UserDTO userDTO = new UserDTO(); + userDTO.setId(comment.getUser().getUserId()); + userDTO.setUsername(comment.getUser().getUsername()); + userDTO.setDisplayName(comment.getUser().getFirstName()); + userDTO.setAvatarUrl(comment.getUser().getAvatarUrl()); + dto.setUser(userDTO); dto.setContent(comment.getContent()); dto.setCreatedAt(comment.getCreatedAt()); dto.setReplies(comment.getReplies().stream() diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java index cf452f2..2a59553 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/mapper/PostMapper.java @@ -1,17 +1,67 @@ package com.example.socialmediaservice.mapper; - +import com.example.socialmediaservice.dto.CreatePostResponseDTO; +import com.example.socialmediaservice.dto.MediaDTO; import com.example.socialmediaservice.dto.PostDTO; +import com.example.socialmediaservice.dto.UserDTO; +import com.example.socialmediaservice.entity.Media; import com.example.socialmediaservice.entity.Post; +import java.util.List; +import java.util.stream.Collectors; + public class PostMapper { - public static PostDTO toDto(Post post) { - PostDTO dto = new PostDTO(); + public static CreatePostResponseDTO toDto(Post post) { + CreatePostResponseDTO dto = new CreatePostResponseDTO(); dto.setPostId(post.getPostId()); - dto.setContent(post.getContent()); + dto.setCaption(post.getCaption()); // Updated from content → caption dto.setUserId(post.getUser().getUserId()); dto.setUsername(post.getUser().getUsername()); dto.setCreatedAt(post.getCreatedAt()); + + // Convert media list + dto.setMedia(post.getMediaList().stream() + .map(PostMapper::toMediaDto) + .collect(Collectors.toList())); + + return dto; + } + + private static MediaDTO toMediaDto(Media media) { + MediaDTO dto = new MediaDTO(); + dto.setId(media.getId()); + dto.setUrl(media.getUrl()); + dto.setType(media.getType()); + return dto; + } + + public static PostDTO toDto2(Post post) { + PostDTO dto = new PostDTO(); + dto.setPostId(post.getPostId()); + dto.setCaption(post.getCaption()); + dto.setCreatedAt(post.getCreatedAt()); + + // ✅ Set nested user + UserDTO userDTO = new UserDTO(); + userDTO.setId(post.getUser().getUserId()); + userDTO.setUsername(post.getUser().getUsername()); + userDTO.setDisplayName(post.getUser().getFirstName()); + userDTO.setAvatarUrl(post.getUser().getAvatarUrl()); + dto.setUser(userDTO); + + // ✅ Set attachments + if (post.getMediaList() != null) { + List attachments = post.getMediaList().stream() + .map(media -> { + MediaDTO mediaDTO = new MediaDTO(); + mediaDTO.setId(media.getId()); + mediaDTO.setUrl(media.getUrl()); + mediaDTO.setType(media.getType()); + return mediaDTO; + }).collect(Collectors.toList()); + dto.setAttachments(attachments); + } + return dto; } } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java index b4d98a0..01a0418 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/CommentRepo.java @@ -2,6 +2,8 @@ import com.example.socialmediaservice.entity.Comment; import com.example.socialmediaservice.entity.Post; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; @@ -9,6 +11,6 @@ public interface CommentRepo extends JpaRepository { List findByPost(Post post); List findByPostAndParentCommentIsNull(Post post); - + Page findByPost(Post post, Pageable pageable); List findByParentComment(Comment parentComment); } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/MediaRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/MediaRepo.java new file mode 100644 index 0000000..c9c7060 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/MediaRepo.java @@ -0,0 +1,7 @@ +package com.example.socialmediaservice.repository; + +import com.example.socialmediaservice.entity.Media; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MediaRepo extends JpaRepository { +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java index 7a271b7..24a50b9 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/UserRepo.java @@ -12,5 +12,6 @@ public interface UserRepo extends JpaRepository { Optional findByUserId(String userId); Optional findByEmail(String username); boolean existsByUsername(String username); + Optional findByUsername(String username); // List findByUserProfile_PostId(String postId); } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/MediaService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/MediaService.java new file mode 100644 index 0000000..23525aa --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/MediaService.java @@ -0,0 +1,27 @@ +package com.example.socialmediaservice.service; + +import com.example.socialmediaservice.entity.Media; +import com.example.socialmediaservice.enums.MediaType; +import com.example.socialmediaservice.repository.MediaRepo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class MediaService { + + private final MediaRepo mediaRepo; + + public Media createMedia(String url, MediaType type) { + Media media = new Media(); + media.setUrl(url); + media.setType(type); + return mediaRepo.save(media); + } + + public Optional getMediaById(String id) { + return mediaRepo.findById(id); + } +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java index fa5fccc..6e02e08 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/PostService.java @@ -3,6 +3,7 @@ import com.example.socialmediaservice.dto.*; import com.example.socialmediaservice.entity.Comment; +import com.example.socialmediaservice.entity.Media; import com.example.socialmediaservice.entity.Post; import com.example.socialmediaservice.entity.User; import com.example.socialmediaservice.enums.ReactionType; @@ -11,6 +12,7 @@ import com.example.socialmediaservice.repository.UserRepo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import java.util.List; @@ -29,36 +31,50 @@ public class PostService { // 1. Create Post - public PostDTO createPost(String email, CreatePostRequestDTO createPostRequestDTO) { - log.info("email :{} post content:{}", email, createPostRequestDTO.getContent()); + public CreatePostResponseDTO createPost(String email, CreatePostRequestDTO createPostRequestDTO) { + log.info("email: {} | caption: {}", email, createPostRequestDTO.getCaption()); + User user = userRepo.findByEmail(email) .orElseThrow(() -> new RuntimeException("User not found")); Post post = new Post(); - post.setContent(createPostRequestDTO.getContent()); + post.setCaption(createPostRequestDTO.getCaption()); post.setUser(user); + + // Link media if provided + if (createPostRequestDTO.getMediaIds() != null && !createPostRequestDTO.getMediaIds().isEmpty()) { + List mediaList = createPostRequestDTO.getMediaIds().stream() + .map(id -> { + Media media = new Media(); + media.setId(id); + media.setPost(post); // Set the back-reference + return media; + }) + .collect(Collectors.toList()); + post.setMediaList(mediaList); + } + postRepo.save(post); return PostMapper.toDto(post); } - // 2. Get all posts created by a specific user - -// public List getPostsByUser(String userId) { -// return postRepo.findByUser_UserId(userId).stream() -// .map(PostMapper::toDto) -// .collect(Collectors.toList()); -// } public List getPostsByUser(String userId) { return postRepo.findByUser_UserId(userId).stream() .map(post -> { - PostDTO dto = PostMapper.toDto(post); + PostDTO dto = PostMapper.toDto2(post); + + UserDTO user = new UserDTO(); + user.setId(post.getUser().getUserId()); + user.setUsername(post.getUser().getUsername()); + user.setDisplayName(post.getUser().getFirstName()); + user.setAvatarUrl(post.getUser().getAvatarUrl()); // Add comments dto.setComments(commentService.getCommentsByPost(post).stream().map(comment -> { CommentDTO c = new CommentDTO(); - c.setUserId(comment.getUser().getUserId()); + c.setUser(user); c.setContent(comment.getContent()); c.setCreatedAt(comment.getCreatedAt()); return c; @@ -73,38 +89,11 @@ public List getPostsByUser(String userId) { } - // 3. Get post by ID with comments and reaction counts -// public PostDTO getPostById(String postId) { -// Post post = postRepo.findByPostId(postId); -// if (post == null) throw new RuntimeException("Post not found"); -// -// PostDTO postDTO = PostMapper.toDto(post); -// -// // Fetch and map comments -// List comments = commentService.getCommentsByPost(post); -// List commentDTOs = comments.stream().map(comment -> { -// CommentDTO dto = new CommentDTO(); -// dto.setUserId(comment.getUser().getUserId()); // Assumes getUserId exists -// dto.setContent(comment.getContent()); -// dto.setCreatedAt(comment.getCreatedAt()); -// dto.setParentCommentId(comment.getParentComment().getCommentId()); -// List replies = commentService.getRepliesByParentComment(comment); -// return dto; -// }).collect(Collectors.toList()); -// postDTO.setComments(commentDTOs); -// -// // Get reaction counts -// Map reactionCounts = reactionService.getReactionCounts(post); -// postDTO.setReactionCounts(reactionCounts); -// -// return postDTO; -// } - public PostDTO getPostById(String postId) { Post post = postRepo.findByPostId(postId); if (post == null) throw new RuntimeException("Post not found"); - PostDTO postDTO = PostMapper.toDto(post); + PostDTO postDTO = PostMapper.toDto2(post); // Fetch all comments for the post List allComments = commentService.getCommentsByPost(post); @@ -134,8 +123,13 @@ public PostDTO getPostById(String postId) { } private CommentDTO mapCommentWithReplies(Comment comment, Map> repliesGroupedByParentId) { + UserDTO userDTO = new UserDTO(); + userDTO.setId(comment.getUser().getUserId()); + userDTO.setUsername(comment.getUser().getUsername()); + userDTO.setDisplayName(comment.getUser().getFirstName()); + userDTO.setAvatarUrl(comment.getUser().getAvatarUrl()); CommentDTO dto = new CommentDTO(); - dto.setUserId(comment.getUser().getUserId()); + dto.setUser(userDTO); dto.setContent(comment.getContent()); dto.setCreatedAt(comment.getCreatedAt()); dto.setParentCommentId(comment.getParentComment() != null ? comment.getParentComment().getCommentId() : null); @@ -153,25 +147,36 @@ private CommentDTO mapCommentWithReplies(Comment comment, Map updatedMediaList = requestDTO.getMediaIds().stream() + .map(id -> { + Media media = new Media(); + media.setId(id); + media.setPost(post); + return media; + }) + .collect(Collectors.toList()); + post.setMediaList(updatedMediaList); + } + Post updatedPost = postRepo.save(post); - return PostMapper.toDto(updatedPost); + return PostMapper.toDto2(updatedPost); } + public PostsPageDTO getForYouFeed(String cursor, int size) { // Assuming cursor = postId of the last post from previous page List posts; - if (cursor != null) { + if (cursor != null && !cursor.isBlank()) { posts = postRepo.findByPostIdLessThanOrderByCreatedAtDesc(cursor, PageRequest.of(0, size + 1)); } else { posts = postRepo.findAllByOrderByCreatedAtDesc(PageRequest.of(0, size + 1)); @@ -183,15 +188,34 @@ public PostsPageDTO getForYouFeed(String cursor, int size) { } List postDTOs = posts.stream().map(post -> { - PostDTO dto = PostMapper.toDto(post); + PostDTO dto = PostMapper.toDto2(post); + dto.setComments(commentService.getCommentsByPost(post).stream().map(comment -> { + UserDTO userDTO = new UserDTO(); + userDTO.setId(comment.getUser().getUserId()); + userDTO.setUsername(comment.getUser().getUsername()); + userDTO.setDisplayName(comment.getUser().getFirstName()); + userDTO.setAvatarUrl(comment.getUser().getAvatarUrl()); CommentDTO c = new CommentDTO(); - c.setUserId(comment.getUser().getUserId()); + c.setUser(userDTO); c.setContent(comment.getContent()); c.setCreatedAt(comment.getCreatedAt()); return c; }).collect(Collectors.toList())); dto.setReactionCounts(reactionService.getReactionCounts(post)); + PostDTO.CountDTO count = new PostDTO.CountDTO(); + count.setLikes(0); + count.setComments(0); + dto.set_count(count); + // Set flat list of users who reacted + dto.setReactions(post.getReactions() != null ? + post.getReactions().stream().map(reaction -> { + PostDTO.UserIdDTO r = new PostDTO.UserIdDTO(); + r.setUserId(reaction.getUser().getUserId()); + return r; + }).collect(Collectors.toList()) + : List.of() + ); return dto; }).collect(Collectors.toList()); diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java index cfe895d..0041128 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/ReactionService.java @@ -43,4 +43,5 @@ public Map getReactionCounts(Post post) { } return map; } + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java index 1dabfeb..3b748b6 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java @@ -1,7 +1,9 @@ package com.example.socialmediaservice.service; +import com.example.socialmediaservice.dto.UpdateProfileRequest; import com.example.socialmediaservice.entity.User; import com.example.socialmediaservice.repository.UserRepo; +import jakarta.persistence.EntityNotFoundException; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -59,6 +61,12 @@ private void createUserInKeycloak(String username, String email, String password } } + public User updateAvatar(String userId, String avatarUrl) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new EntityNotFoundException("User not found with ID: " + userId)); + user.setAvatarUrl(avatarUrl); + return userRepository.save(user); + } private String getAdminAccessToken() { WebClient webClient = webClientBuilder.build(); @@ -115,4 +123,35 @@ public Credential(String value) { } } } + + public User getUserByEmail(String email) { + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new EntityNotFoundException("User not found with email: " + email)); + user.setPosts(null); + return user; + } + + public User updateUserProfile(String userId, UpdateProfileRequest request) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new EntityNotFoundException("User not found")); + + if (request.getDisplayName() != null) { + user.setUsername(request.getDisplayName()); // or setDisplayName if you have a field + } + if (request.getBio() != null) { + user.setBio(request.getBio()); + } + if (request.getAvatarUrl() != null) { + user.setAvatarUrl(request.getAvatarUrl()); + } + + return userRepository.save(user); + } + + public User getUserByUsername(String username) { + return userRepository.findByUsername(username) + .orElseThrow(() -> new EntityNotFoundException("User not found with username: " + username)); + } + + } diff --git a/social-media-service/src/main/resources/application.properties b/social-media-service/src/main/resources/application.properties index 1604202..8a46c0a 100644 --- a/social-media-service/src/main/resources/application.properties +++ b/social-media-service/src/main/resources/application.properties @@ -15,4 +15,6 @@ spring.datasource.url=jdbc:postgresql://aws-0-ap-southeast-1.pooler.supabase.com # JPA & Hibernate Configuration spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.jpa.show-sql=true \ No newline at end of file +spring.jpa.show-sql=true + +logging.level.org.springframework.web.cors=DEBUG From cfde3e05e856b86eb625e028f793962ecf73727c Mon Sep 17 00:00:00 2001 From: Harshana Date: Tue, 13 May 2025 22:35:19 +0530 Subject: [PATCH 008/134] add bookmark logic and some follower logic --- .../controller/PostInteractionController.java | 31 ++++++++++ .../controller/UserController.java | 35 +++++++++++- .../socialmediaservice/dto/FollowerInfo.java | 13 +++++ .../dto/UpdateProfileRequest.java | 2 +- .../dto/UpdateProfileResponse.java | 14 +++++ .../socialmediaservice/entity/Bookmark.java | 31 ++++++++++ .../socialmediaservice/entity/User.java | 6 +- .../repository/BookmarkRepository.java | 16 ++++++ .../service/BookmarkService.java | 30 ++++++++++ .../service/UserService.java | 56 ++++++++++++++++++- 10 files changed, 225 insertions(+), 9 deletions(-) create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/FollowerInfo.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileResponse.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/entity/Bookmark.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/repository/BookmarkRepository.java create mode 100644 social-media-service/src/main/java/com/example/socialmediaservice/service/BookmarkService.java diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java index 31a7fe2..680bda5 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/PostInteractionController.java @@ -11,6 +11,7 @@ import com.example.socialmediaservice.repository.CommentRepo; import com.example.socialmediaservice.repository.PostRepo; import com.example.socialmediaservice.repository.UserRepo; +import com.example.socialmediaservice.service.BookmarkService; import com.example.socialmediaservice.service.CommentService; import com.example.socialmediaservice.service.ReactionService; import lombok.RequiredArgsConstructor; @@ -41,6 +42,7 @@ public class PostInteractionController { private final CommentRepo commentRepo; private final CommentService commentService; private final ReactionService reactionService; + private final BookmarkService bookmarkService; // 1. Get all comments for a specific post @GetMapping("/{postId}/comments") @@ -159,5 +161,34 @@ public ResponseEntity deleteComment( return ResponseEntity.ok().build(); } + @PostMapping("/{postId}/bookmark") + public ResponseEntity addBookmark(@PathVariable String postId, @RequestParam String userId) { + log.info("PostId: {}, UserId: {}", postId, userId); + Post post = postRepo.findById(postId) + .orElseThrow(() -> new RuntimeException("Post not found with ID: " + postId)); + User user = userRepo.findById(userId) + .orElseThrow(() -> new RuntimeException("User not found with ID: " + userId)); + bookmarkService.toggleBookmark(user, post); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/{postId}/bookmark") + public ResponseEntity removeBookmark(@PathVariable String postId, @RequestParam String userId) { + return addBookmark(postId, userId); // toggle logic is same + } + + @GetMapping("/{postId}/bookmark") + public ResponseEntity> checkBookmark(@PathVariable String postId, @RequestParam String userId) { + Post post = postRepo.findByPostId(postId); + if (post == null) { + throw new RuntimeException("Post not found"); + } + User user = userRepo.findByUserId(userId) + .orElseThrow(() -> new RuntimeException("User not found with ID: " + userId)); + + boolean isBookmarked = bookmarkService.isBookmarkedByUser(user, post); + return ResponseEntity.ok(Map.of("isBookmarkedByUser", isBookmarked)); + } + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java index dfec5b1..8766cb4 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/controller/UserController.java @@ -1,6 +1,8 @@ package com.example.socialmediaservice.controller; +import com.example.socialmediaservice.dto.FollowerInfo; import com.example.socialmediaservice.dto.UpdateProfileRequest; +import com.example.socialmediaservice.dto.UpdateProfileResponse; import com.example.socialmediaservice.entity.User; import com.example.socialmediaservice.service.UserService; import lombok.Data; @@ -49,15 +51,14 @@ public ResponseEntity getUserByUsername(@PathVariable String username) { } @PutMapping("/{userId}/profile") - public ResponseEntity updateUserProfile( + public ResponseEntity updateUserProfile( @PathVariable String userId, @RequestBody UpdateProfileRequest request ) { - User updated = userService.updateUserProfile(userId, request); + UpdateProfileResponse updated = userService.updateUserProfile(userId, request); return ResponseEntity.ok(updated); } - @Data static class RegisterRequest { private String username; @@ -71,4 +72,32 @@ static class RegisterRequest { static class AvatarUpdateRequest { private String avatarUrl; } + + @PostMapping("/{targetUserId}/followers") + public ResponseEntity followUser( + @PathVariable String targetUserId, + @RequestParam String followerUserId + ) { + userService.followUser(followerUserId, targetUserId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/{targetUserId}/followers") + public ResponseEntity unfollowUser( + @PathVariable String targetUserId, + @RequestParam String followerUserId + ) { + userService.unfollowUser(followerUserId, targetUserId); + return ResponseEntity.ok().build(); + } + + @GetMapping("/{targetUserId}/follower-info") + public ResponseEntity getFollowerInfo( + @PathVariable String targetUserId, + @RequestParam String currentUserId + ) { + FollowerInfo info = userService.getFollowerInfo(currentUserId, targetUserId); + return ResponseEntity.ok(info); + } + } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/FollowerInfo.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/FollowerInfo.java new file mode 100644 index 0000000..8c1f008 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/FollowerInfo.java @@ -0,0 +1,13 @@ +package com.example.socialmediaservice.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FollowerInfo { + private int followers; + private boolean isFollowedByUser; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java index 467f586..6329b2d 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileRequest.java @@ -6,5 +6,5 @@ public class UpdateProfileRequest { private String displayName; private String bio; - private String avatarUrl; + private String avatarUrl; // optional } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileResponse.java b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileResponse.java new file mode 100644 index 0000000..242906c --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/dto/UpdateProfileResponse.java @@ -0,0 +1,14 @@ +package com.example.socialmediaservice.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UpdateProfileResponse { + private String userId; + private String username; + private String displayName; + private String avatarUrl; + private String bio; +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/Bookmark.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Bookmark.java new file mode 100644 index 0000000..44f53b6 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/Bookmark.java @@ -0,0 +1,31 @@ +package com.example.socialmediaservice.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + + +@Entity +@Getter +@Setter +@NoArgsConstructor // required by JPA +@AllArgsConstructor +public class Bookmark { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String id; + + @ManyToOne + private User user; + + @ManyToOne + private Post post; + + // Optional: constructor without ID + public Bookmark(User user, Post post) { + this.user = user; + this.post = post; + } +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java index 00f4348..330e546 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/entity/User.java @@ -5,7 +5,9 @@ import lombok.Data; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Entity @Data @@ -45,10 +47,10 @@ public class User { inverseJoinColumns = @JoinColumn(name = "follower_id") ) @JsonIgnoreProperties("followers") // Prevent full circular graph - private List followers = new ArrayList<>(); + private Set followers = new HashSet<>(); @ManyToMany(mappedBy = "followers") @JsonIgnoreProperties("following") - private List following = new ArrayList<>(); + private Set following = new HashSet<>(); } diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/repository/BookmarkRepository.java b/social-media-service/src/main/java/com/example/socialmediaservice/repository/BookmarkRepository.java new file mode 100644 index 0000000..b10bd41 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/repository/BookmarkRepository.java @@ -0,0 +1,16 @@ +package com.example.socialmediaservice.repository; + +import com.example.socialmediaservice.entity.Bookmark; +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface BookmarkRepository extends JpaRepository { + Optional findByUserAndPost(User user, Post post); + boolean existsByUserAndPost(User user, Post post); +} + diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/BookmarkService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/BookmarkService.java new file mode 100644 index 0000000..4a57934 --- /dev/null +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/BookmarkService.java @@ -0,0 +1,30 @@ +package com.example.socialmediaservice.service; + +import com.example.socialmediaservice.entity.Bookmark; +import com.example.socialmediaservice.entity.Post; +import com.example.socialmediaservice.entity.User; +import com.example.socialmediaservice.repository.BookmarkRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class BookmarkService { + private final BookmarkRepository bookmarkRepository; + + public void toggleBookmark(User user, Post post) { + bookmarkRepository.findByUserAndPost(user, post).ifPresentOrElse( + bookmark -> bookmarkRepository.delete(bookmark), + () -> bookmarkRepository.save(new Bookmark( user, post)) + ); + } + + public boolean isBookmarkedByUser(User user, Post post) { + log.info("User: {} | Post: {}", user.getUserId(), post.getPostId()); + boolean isBookmarked = bookmarkRepository.existsByUserAndPost(user, post); + log.info("Is bookmarked: {}", isBookmarked); + return isBookmarked; + } +} diff --git a/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java b/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java index 3b748b6..d163f0e 100644 --- a/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java +++ b/social-media-service/src/main/java/com/example/socialmediaservice/service/UserService.java @@ -1,6 +1,8 @@ package com.example.socialmediaservice.service; +import com.example.socialmediaservice.dto.FollowerInfo; import com.example.socialmediaservice.dto.UpdateProfileRequest; +import com.example.socialmediaservice.dto.UpdateProfileResponse; import com.example.socialmediaservice.entity.User; import com.example.socialmediaservice.repository.UserRepo; import jakarta.persistence.EntityNotFoundException; @@ -131,12 +133,12 @@ public User getUserByEmail(String email) { return user; } - public User updateUserProfile(String userId, UpdateProfileRequest request) { + public UpdateProfileResponse updateUserProfile(String userId, UpdateProfileRequest request) { User user = userRepository.findById(userId) .orElseThrow(() -> new EntityNotFoundException("User not found")); if (request.getDisplayName() != null) { - user.setUsername(request.getDisplayName()); // or setDisplayName if you have a field + user.setFirstName(request.getDisplayName()); // ✅ assuming 'firstName' is your displayName } if (request.getBio() != null) { user.setBio(request.getBio()); @@ -145,13 +147,61 @@ public User updateUserProfile(String userId, UpdateProfileRequest request) { user.setAvatarUrl(request.getAvatarUrl()); } - return userRepository.save(user); + User saved = userRepository.save(user); + return new UpdateProfileResponse( + saved.getUserId(), + saved.getUsername(), + saved.getFirstName(), + saved.getAvatarUrl(), + saved.getBio() + ); } + public User getUserByUsername(String username) { return userRepository.findByUsername(username) .orElseThrow(() -> new EntityNotFoundException("User not found with username: " + username)); } + public void followUser(String followerId, String targetUserId) { + if (followerId.equals(targetUserId)) { + throw new IllegalArgumentException("You cannot follow yourself."); + } + + User follower = userRepository.findByUserId(followerId) + .orElseThrow(() -> new RuntimeException("Follower not found")); + User target = userRepository.findByUserId(targetUserId) + .orElseThrow(() -> new RuntimeException("Target user not found")); + + if (!follower.getFollowing().contains(target)) { + follower.getFollowing().add(target); + userRepository.save(follower); + } + } + + public void unfollowUser(String followerId, String targetUserId) { + User follower = userRepository.findByUserId(followerId) + .orElseThrow(() -> new RuntimeException("Follower not found")); + User target = userRepository.findByUserId(targetUserId) + .orElseThrow(() -> new RuntimeException("Target user not found")); + + if (follower.getFollowing().contains(target)) { + follower.getFollowing().remove(target); + userRepository.save(follower); + } + } + + public FollowerInfo getFollowerInfo(String currentUserId, String targetUserId) { + User current = userRepository.findByUserId(currentUserId) + .orElseThrow(() -> new RuntimeException("Current user not found")); + User target = userRepository.findByUserId(targetUserId) + .orElseThrow(() -> new RuntimeException("Target user not found")); + + boolean isFollowing = current.getFollowing().contains(target); + int followersCount = target.getFollowers().size(); + + return new FollowerInfo(followersCount, isFollowing); + } + } From 896d3254d2d19c36133851ed263241caf90395c0 Mon Sep 17 00:00:00 2001 From: Harshana Date: Sat, 17 May 2025 14:40:06 +0530 Subject: [PATCH 009/134] add snapshot for keycloack --- .idea/dataSources.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .idea/dataSources.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..2220f53 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://aws-0-ap-southeast-1.pooler.supabase.com:5432/postgres + + + + + + $ProjectFileDir$ + + + \ No newline at end of file From c62909a389f4463ffa311f470692bae078434bae Mon Sep 17 00:00:00 2001 From: Harshana Date: Sat, 17 May 2025 14:40:24 +0530 Subject: [PATCH 010/134] ad snapshot for keycloack --- .idea/dataSources.local.xml | 20 + .../1d7d931b-4a53-4a75-8fda-59484c44f07d.xml | 5926 +++++++++++++++++ .../_src_/database/postgres.edMnLQ.meta | 1 + .../schema/information_schema.FNRwLQ.meta | 2 + .../schema/pg_catalog.0S1ZNQ.meta | 2 + .../postgres.edMnLQ/schema/public.abK9xQ.meta | 2 + .idea/gradle.xml | 4 +- .idea/workspace.xml | 197 + apigateway/kong/docker-compose.yml | 171 +- .../kong/keycloak-import/kong-realm.json | 1829 +++++ .../.gradle/8.12/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.12/checksums/md5-checksums.bin | Bin 0 -> 36947 bytes .../.gradle/8.12/checksums/sha1-checksums.bin | Bin 0 -> 94955 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 708195 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/8.12/expanded/expanded.lock | Bin 0 -> 17 bytes .../.gradle/8.12/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.12/fileHashes/fileHashes.bin | Bin 0 -> 27847 bytes .../.gradle/8.12/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.12/fileHashes/resourceHashesCache.bin | Bin 0 -> 23801 bytes .../.gradle/8.12/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 19091 bytes .../.gradle/file-system.probe | Bin 0 -> 8 bytes .../.gradle/vcs-1/gc.properties | 0 social-media-service/.idea/.gitignore | 10 + social-media-service/.idea/compiler.xml | 18 + social-media-service/.idea/gradle.xml | 16 + social-media-service/.idea/misc.xml | 8 + social-media-service/.idea/modules.xml | 8 + social-media-service/.idea/vcs.xml | 6 + .../bin/main/application.properties | 20 + .../SocialMediaServiceApplication.class | Bin 0 -> 773 bytes .../controller/MediaController.class | Bin 0 -> 2327 bytes .../controller/PostController.class | Bin 0 -> 4863 bytes .../PostInteractionController.class | Bin 0 -> 14959 bytes .../UserController$AvatarUpdateRequest.class | Bin 0 -> 2106 bytes .../UserController$RegisterRequest.class | Bin 0 -> 3893 bytes .../controller/UserController.class | Bin 0 -> 6208 bytes .../socialmediaservice/dto/CommentDTO.class | Bin 0 -> 4891 bytes .../dto/CreatePostRequestDTO.class | Bin 0 -> 3159 bytes .../dto/CreatePostResponseDTO.class | Bin 0 -> 6336 bytes .../socialmediaservice/dto/FollowerInfo.class | Bin 0 -> 2120 bytes .../dto/MediaCreateRequestDTO.class | Bin 0 -> 2570 bytes .../socialmediaservice/dto/MediaDTO.class | Bin 0 -> 2929 bytes .../dto/PostDTO$CountDTO.class | Bin 0 -> 2016 bytes .../dto/PostDTO$UserIdDTO.class | Bin 0 -> 1989 bytes .../socialmediaservice/dto/PostDTO.class | Bin 0 -> 7570 bytes .../socialmediaservice/dto/PostsPageDTO.class | Bin 0 -> 2773 bytes .../socialmediaservice/dto/ReactionDTO.class | Bin 0 -> 2560 bytes .../dto/ReplyCommentRequestDTO.class | Bin 0 -> 2372 bytes .../dto/RequestCommentDTO.class | Bin 0 -> 2352 bytes .../dto/UpdatePostRequestDTO.class | Bin 0 -> 2727 bytes .../dto/UpdateProfileRequest.class | Bin 0 -> 2831 bytes .../dto/UpdateProfileResponse.class | Bin 0 -> 3918 bytes .../socialmediaservice/dto/UserDTO.class | Bin 0 -> 3231 bytes .../dto/UserProfileDTO.class | Bin 0 -> 337 bytes .../socialmediaservice/entity/Bookmark.class | Bin 0 -> 2050 bytes .../socialmediaservice/entity/Comment.class | Bin 0 -> 6483 bytes .../socialmediaservice/entity/Media.class | Bin 0 -> 4375 bytes .../socialmediaservice/entity/Post.class | Bin 0 -> 7466 bytes .../socialmediaservice/entity/Reaction.class | Bin 0 -> 4516 bytes .../socialmediaservice/entity/User.class | Bin 0 -> 5779 bytes .../socialmediaservice/enums/MediaType.class | Bin 0 -> 1121 bytes .../enums/ReactionType.class | Bin 0 -> 1344 bytes .../mapper/CommentMapper.class | Bin 0 -> 2643 bytes .../mapper/PostMapper.class | Bin 0 -> 4117 bytes .../repository/BookmarkRepository.class | Bin 0 -> 906 bytes .../repository/CommentRepo.class | Bin 0 -> 1174 bytes .../repository/MediaRepo.class | Bin 0 -> 363 bytes .../repository/PostRepo.class | Bin 0 -> 1183 bytes .../repository/ReactionRepo.class | Bin 0 -> 814 bytes .../repository/UserRepo.class | Bin 0 -> 723 bytes .../service/BookmarkService.class | Bin 0 -> 3519 bytes .../service/CommentService.class | Bin 0 -> 3024 bytes .../service/MediaService.class | Bin 0 -> 1646 bytes .../service/PostService.class | Bin 0 -> 14437 bytes .../service/ReactionService.class | Bin 0 -> 3230 bytes ...rvice$KeycloakUserRequest$Credential.class | Bin 0 -> 2969 bytes .../UserService$KeycloakUserRequest.class | Bin 0 -> 5165 bytes .../service/UserService$TokenResponse.class | Bin 0 -> 2157 bytes .../service/UserService.class | Bin 0 -> 12223 bytes .../SocialMediaServiceApplicationTests.class | Bin 0 -> 601 bytes .../SocialMediaServiceApplication.class | Bin 0 -> 803 bytes .../controller/MediaController.class | Bin 0 -> 2368 bytes .../controller/PostController.class | Bin 0 -> 4956 bytes .../PostInteractionController.class | Bin 0 -> 15177 bytes .../UserController$AvatarUpdateRequest.class | Bin 0 -> 2158 bytes .../UserController$RegisterRequest.class | Bin 0 -> 3989 bytes .../controller/UserController.class | Bin 0 -> 6357 bytes .../socialmediaservice/dto/CommentDTO.class | Bin 0 -> 4937 bytes .../dto/CreatePostRequestDTO.class | Bin 0 -> 3145 bytes .../dto/CreatePostResponseDTO.class | Bin 0 -> 6370 bytes .../socialmediaservice/dto/FollowerInfo.class | Bin 0 -> 2198 bytes .../dto/MediaCreateRequestDTO.class | Bin 0 -> 2577 bytes .../socialmediaservice/dto/MediaDTO.class | Bin 0 -> 2947 bytes .../dto/PostDTO$CountDTO.class | Bin 0 -> 2079 bytes .../dto/PostDTO$UserIdDTO.class | Bin 0 -> 2041 bytes .../socialmediaservice/dto/PostDTO.class | Bin 0 -> 7665 bytes .../socialmediaservice/dto/PostsPageDTO.class | Bin 0 -> 2748 bytes .../socialmediaservice/dto/ReactionDTO.class | Bin 0 -> 2570 bytes .../dto/ReplyCommentRequestDTO.class | Bin 0 -> 2435 bytes .../dto/RequestCommentDTO.class | Bin 0 -> 2415 bytes .../dto/UpdatePostRequestDTO.class | Bin 0 -> 2702 bytes .../dto/UpdateProfileRequest.class | Bin 0 -> 2905 bytes .../dto/UpdateProfileResponse.class | Bin 0 -> 4041 bytes .../socialmediaservice/dto/UserDTO.class | Bin 0 -> 3316 bytes .../dto/UserProfileDTO.class | Bin 0 -> 337 bytes .../socialmediaservice/entity/Bookmark.class | Bin 0 -> 2136 bytes .../socialmediaservice/entity/Comment.class | Bin 0 -> 6589 bytes .../socialmediaservice/entity/Media.class | Bin 0 -> 4450 bytes .../socialmediaservice/entity/Post.class | Bin 0 -> 7552 bytes .../socialmediaservice/entity/Reaction.class | Bin 0 -> 4594 bytes .../socialmediaservice/entity/User.class | Bin 0 -> 5826 bytes .../socialmediaservice/enums/MediaType.class | Bin 0 -> 1226 bytes .../enums/ReactionType.class | Bin 0 -> 1449 bytes .../mapper/CommentMapper.class | Bin 0 -> 2673 bytes .../mapper/PostMapper.class | Bin 0 -> 4166 bytes .../repository/BookmarkRepository.class | Bin 0 -> 969 bytes .../repository/CommentRepo.class | Bin 0 -> 1275 bytes .../repository/MediaRepo.class | Bin 0 -> 363 bytes .../repository/PostRepo.class | Bin 0 -> 1279 bytes .../repository/ReactionRepo.class | Bin 0 -> 884 bytes .../repository/UserRepo.class | Bin 0 -> 806 bytes .../service/BookmarkService.class | Bin 0 -> 3607 bytes .../service/CommentService.class | Bin 0 -> 3141 bytes .../service/MediaService.class | Bin 0 -> 1702 bytes .../service/PostService.class | Bin 0 -> 14690 bytes .../service/ReactionService.class | Bin 0 -> 3284 bytes ...rvice$KeycloakUserRequest$Credential.class | Bin 0 -> 3054 bytes .../UserService$KeycloakUserRequest.class | Bin 0 -> 5310 bytes .../service/UserService$TokenResponse.class | Bin 0 -> 2209 bytes .../service/UserService.class | Bin 0 -> 12459 bytes .../main/google/api/annotations.proto | 31 + .../main/google/api/auth.proto | 232 + .../main/google/api/backend.proto | 182 + .../main/google/api/billing.proto | 77 + .../main/google/api/client.proto | 99 + .../main/google/api/config_change.proto | 84 + .../main/google/api/consumer.proto | 82 + .../main/google/api/context.proto | 89 + .../main/google/api/control.proto | 32 + .../main/google/api/distribution.proto | 211 + .../main/google/api/documentation.proto | 162 + .../main/google/api/endpoint.proto | 68 + .../main/google/api/error_reason.proto | 397 ++ .../main/google/api/field_behavior.proto | 90 + .../main/google/api/http.proto | 375 ++ .../main/google/api/httpbody.proto | 81 + .../main/google/api/label.proto | 48 + .../main/google/api/launch_stage.proto | 72 + .../main/google/api/log.proto | 54 + .../main/google/api/logging.proto | 80 + .../main/google/api/metric.proto | 264 + .../main/google/api/monitored_resource.proto | 118 + .../main/google/api/monitoring.proto | 105 + .../main/google/api/quota.proto | 183 + .../main/google/api/resource.proto | 238 + .../main/google/api/routing.proto | 461 ++ .../main/google/api/service.proto | 175 + .../main/google/api/source_info.proto | 31 + .../main/google/api/system_parameter.proto | 95 + .../main/google/api/usage.proto | 95 + .../main/google/api/visibility.proto | 111 + .../main/google/cloud/audit/audit_log.proto | 283 + .../google/cloud/extended_operations.proto | 150 + .../main/google/geo/type/viewport.proto | 69 + .../google/logging/type/http_request.proto | 95 + .../google/logging/type/log_severity.proto | 71 + .../main/google/longrunning/operations.proto | 247 + .../main/google/protobuf/any.proto | 158 + .../main/google/protobuf/api.proto | 208 + .../google/protobuf/compiler/plugin.proto | 183 + .../main/google/protobuf/descriptor.proto | 921 +++ .../main/google/protobuf/duration.proto | 116 + .../main/google/protobuf/empty.proto | 51 + .../main/google/protobuf/field_mask.proto | 245 + .../main/google/protobuf/source_context.proto | 48 + .../main/google/protobuf/struct.proto | 95 + .../main/google/protobuf/timestamp.proto | 147 + .../main/google/protobuf/type.proto | 187 + .../main/google/protobuf/wrappers.proto | 123 + .../main/google/rpc/code.proto | 186 + .../rpc/context/attribute_context.proto | 343 + .../main/google/rpc/error_details.proto | 249 + .../main/google/rpc/status.proto | 47 + .../main/google/type/calendar_period.proto | 56 + .../main/google/type/color.proto | 174 + .../main/google/type/date.proto | 52 + .../main/google/type/datetime.proto | 104 + .../main/google/type/dayofweek.proto | 50 + .../main/google/type/decimal.proto | 95 + .../main/google/type/expr.proto | 73 + .../main/google/type/fraction.proto | 33 + .../main/google/type/interval.proto | 46 + .../main/google/type/latlng.proto | 37 + .../main/google/type/localized_text.proto | 36 + .../main/google/type/money.proto | 42 + .../main/google/type/month.proto | 65 + .../main/google/type/phone_number.proto | 113 + .../main/google/type/postal_address.proto | 134 + .../main/google/type/quaternion.proto | 94 + .../main/google/type/timeofday.proto | 44 + .../reports/problems/problems-report.html | 663 ++ .../resources/main/application.properties | 20 + ...roller$AvatarUpdateRequest.class.uniqueId3 | Bin 0 -> 2158 bytes ...Controller$RegisterRequest.class.uniqueId4 | Bin 0 -> 3989 bytes .../stash-dir/UserController.class.uniqueId1 | Bin 0 -> 6099 bytes ...loakUserRequest$Credential.class.uniqueId6 | Bin 0 -> 3054 bytes ...ervice$KeycloakUserRequest.class.uniqueId5 | Bin 0 -> 5310 bytes .../UserService$TokenResponse.class.uniqueId2 | Bin 0 -> 2209 bytes .../stash-dir/UserService.class.uniqueId0 | Bin 0 -> 12194 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 53840 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + social-media-service/gradlew | 251 + social-media-service/gradlew.bat | 94 + .../controller/UserController.java | 9 + .../socialmediaservice/entity/User.java | 28 +- .../service/UserService.java | 46 +- 221 files changed, 19143 insertions(+), 109 deletions(-) create mode 100644 .idea/dataSources.local.xml create mode 100644 .idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d.xml create mode 100644 .idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ.meta create mode 100644 .idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta create mode 100644 .idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta create mode 100644 .idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/public.abK9xQ.meta create mode 100644 .idea/workspace.xml create mode 100644 apigateway/kong/keycloak-import/kong-realm.json create mode 100644 social-media-service/.gradle/8.12/checksums/checksums.lock create mode 100644 social-media-service/.gradle/8.12/checksums/md5-checksums.bin create mode 100644 social-media-service/.gradle/8.12/checksums/sha1-checksums.bin create mode 100644 social-media-service/.gradle/8.12/executionHistory/executionHistory.bin create mode 100644 social-media-service/.gradle/8.12/executionHistory/executionHistory.lock create mode 100644 social-media-service/.gradle/8.12/expanded/expanded.lock create mode 100644 social-media-service/.gradle/8.12/fileChanges/last-build.bin create mode 100644 social-media-service/.gradle/8.12/fileHashes/fileHashes.bin create mode 100644 social-media-service/.gradle/8.12/fileHashes/fileHashes.lock create mode 100644 social-media-service/.gradle/8.12/fileHashes/resourceHashesCache.bin create mode 100644 social-media-service/.gradle/8.12/gc.properties create mode 100644 social-media-service/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 social-media-service/.gradle/buildOutputCleanup/cache.properties create mode 100644 social-media-service/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 social-media-service/.gradle/file-system.probe create mode 100644 social-media-service/.gradle/vcs-1/gc.properties create mode 100644 social-media-service/.idea/.gitignore create mode 100644 social-media-service/.idea/compiler.xml create mode 100644 social-media-service/.idea/gradle.xml create mode 100644 social-media-service/.idea/misc.xml create mode 100644 social-media-service/.idea/modules.xml create mode 100644 social-media-service/.idea/vcs.xml create mode 100644 social-media-service/bin/main/application.properties create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/SocialMediaServiceApplication.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/controller/MediaController.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/controller/PostController.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/controller/PostInteractionController.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/controller/UserController$AvatarUpdateRequest.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/controller/UserController$RegisterRequest.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/controller/UserController.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/CommentDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/CreatePostRequestDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/CreatePostResponseDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/FollowerInfo.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/MediaCreateRequestDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/MediaDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/PostDTO$CountDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/PostDTO$UserIdDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/PostDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/PostsPageDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/ReactionDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/ReplyCommentRequestDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/RequestCommentDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/UpdatePostRequestDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/UpdateProfileRequest.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/UpdateProfileResponse.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/UserDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/dto/UserProfileDTO.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/entity/Bookmark.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/entity/Comment.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/entity/Media.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/entity/Post.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/entity/Reaction.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/entity/User.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/enums/MediaType.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/enums/ReactionType.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/mapper/CommentMapper.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/mapper/PostMapper.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/repository/BookmarkRepository.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/repository/CommentRepo.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/repository/MediaRepo.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/repository/PostRepo.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/repository/ReactionRepo.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/repository/UserRepo.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/BookmarkService.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/CommentService.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/MediaService.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/PostService.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/ReactionService.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/UserService$KeycloakUserRequest$Credential.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/UserService$KeycloakUserRequest.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/UserService$TokenResponse.class create mode 100644 social-media-service/bin/main/com/example/socialmediaservice/service/UserService.class create mode 100644 social-media-service/bin/test/com/example/socialmediaservice/SocialMediaServiceApplicationTests.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/SocialMediaServiceApplication.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/controller/MediaController.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/controller/PostController.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/controller/PostInteractionController.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/controller/UserController$AvatarUpdateRequest.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/controller/UserController$RegisterRequest.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/controller/UserController.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/CommentDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/CreatePostRequestDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/CreatePostResponseDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/FollowerInfo.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/MediaCreateRequestDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/MediaDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/PostDTO$CountDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/PostDTO$UserIdDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/PostDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/PostsPageDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/ReactionDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/ReplyCommentRequestDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/RequestCommentDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/UpdatePostRequestDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/UpdateProfileRequest.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/UpdateProfileResponse.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/UserDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/dto/UserProfileDTO.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/entity/Bookmark.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/entity/Comment.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/entity/Media.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/entity/Post.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/entity/Reaction.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/entity/User.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/enums/MediaType.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/enums/ReactionType.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/mapper/CommentMapper.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/mapper/PostMapper.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/repository/BookmarkRepository.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/repository/CommentRepo.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/repository/MediaRepo.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/repository/PostRepo.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/repository/ReactionRepo.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/repository/UserRepo.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/BookmarkService.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/CommentService.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/MediaService.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/PostService.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/ReactionService.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/UserService$KeycloakUserRequest$Credential.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/UserService$KeycloakUserRequest.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/UserService$TokenResponse.class create mode 100644 social-media-service/build/classes/java/main/com/example/socialmediaservice/service/UserService.class create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/annotations.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/auth.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/backend.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/billing.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/client.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/config_change.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/consumer.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/context.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/control.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/distribution.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/documentation.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/endpoint.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/error_reason.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/field_behavior.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/http.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/httpbody.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/label.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/launch_stage.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/log.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/logging.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/metric.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/monitored_resource.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/monitoring.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/quota.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/resource.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/routing.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/service.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/source_info.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/system_parameter.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/usage.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/api/visibility.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/cloud/audit/audit_log.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/cloud/extended_operations.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/geo/type/viewport.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/logging/type/http_request.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/logging/type/log_severity.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/longrunning/operations.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/any.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/api.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/compiler/plugin.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/descriptor.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/duration.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/empty.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/field_mask.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/source_context.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/struct.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/timestamp.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/type.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/protobuf/wrappers.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/rpc/code.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/rpc/context/attribute_context.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/rpc/error_details.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/rpc/status.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/calendar_period.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/color.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/date.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/datetime.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/dayofweek.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/decimal.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/expr.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/fraction.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/interval.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/latlng.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/localized_text.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/money.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/month.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/phone_number.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/postal_address.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/quaternion.proto create mode 100644 social-media-service/build/extracted-include-protos/main/google/type/timeofday.proto create mode 100644 social-media-service/build/reports/problems/problems-report.html create mode 100644 social-media-service/build/resources/main/application.properties create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserController$AvatarUpdateRequest.class.uniqueId3 create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserController$RegisterRequest.class.uniqueId4 create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserController.class.uniqueId1 create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserService$KeycloakUserRequest$Credential.class.uniqueId6 create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserService$KeycloakUserRequest.class.uniqueId5 create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserService$TokenResponse.class.uniqueId2 create mode 100644 social-media-service/build/tmp/compileJava/compileTransaction/stash-dir/UserService.class.uniqueId0 create mode 100644 social-media-service/build/tmp/compileJava/previous-compilation-data.bin create mode 100644 social-media-service/gradle/wrapper/gradle-wrapper.jar create mode 100644 social-media-service/gradle/wrapper/gradle-wrapper.properties create mode 100755 social-media-service/gradlew create mode 100644 social-media-service/gradlew.bat diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml new file mode 100644 index 0000000..33ac4e9 --- /dev/null +++ b/.idea/dataSources.local.xml @@ -0,0 +1,20 @@ + + + + + + " + + + master_key + postgres.odffpjvuptssxaaggnsn + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d.xml b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d.xml new file mode 100644 index 0000000..9787bb0 --- /dev/null +++ b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d.xml @@ -0,0 +1,5926 @@ + + + + + mdy + 17164||-9223372036854775808|c|G +17164||16384|c|G +17164||16595|c|G +17164||16384|C|G +17164||16595|C|G +17164||-9223372036854775808|T|G +17164||16384|T|G +17164||16595|T|G + 1900 + 15.8 + 1745319820 + true ACDT +true ACSST +false ACST +false ACT +false ACWST +true ADT +true AEDT +true AESST +false AEST +false AFT +true AKDT +false AKST +true ALMST +false ALMT +false AMST +false AMT +false ANAST +false ANAT +false ARST +false ART +false AST +true AWSST +false AWST +true AZOST +false AZOT +false AZST +false AZT +false Africa/Abidjan +false Africa/Accra +false Africa/Addis_Ababa +false Africa/Algiers +false Africa/Asmara +false Africa/Asmera +false Africa/Bamako +false Africa/Bangui +false Africa/Banjul +false Africa/Bissau +false Africa/Blantyre +false Africa/Brazzaville +false Africa/Bujumbura +true Africa/Cairo +false Africa/Casablanca +true Africa/Ceuta +false Africa/Conakry +false Africa/Dakar +false Africa/Dar_es_Salaam +false Africa/Djibouti +false Africa/Douala +false Africa/El_Aaiun +false Africa/Freetown +false Africa/Gaborone +false Africa/Harare +false Africa/Johannesburg +false Africa/Juba +false Africa/Kampala +false Africa/Khartoum +false Africa/Kigali +false Africa/Kinshasa +false Africa/Lagos +false Africa/Libreville +false Africa/Lome +false Africa/Luanda +false Africa/Lubumbashi +false Africa/Lusaka +false Africa/Malabo +false Africa/Maputo +false Africa/Maseru +false Africa/Mbabane +false Africa/Mogadishu +false Africa/Monrovia +false Africa/Nairobi +false Africa/Ndjamena +false Africa/Niamey +false Africa/Nouakchott +false Africa/Ouagadougou +false Africa/Porto-Novo +false Africa/Sao_Tome +false Africa/Timbuktu +false Africa/Tripoli +false Africa/Tunis +false Africa/Windhoek +true America/Adak +true America/Anchorage +false America/Anguilla +false America/Antigua +false America/Araguaina +false America/Argentina/Buenos_Aires +false America/Argentina/Catamarca +false America/Argentina/ComodRivadavia +false America/Argentina/Cordoba +false America/Argentina/Jujuy +false America/Argentina/La_Rioja +false America/Argentina/Mendoza +false America/Argentina/Rio_Gallegos +false America/Argentina/Salta +false America/Argentina/San_Juan +false America/Argentina/San_Luis +false America/Argentina/Tucuman +false America/Argentina/Ushuaia +false America/Aruba +false America/Asuncion +false America/Atikokan +true America/Atka +false America/Bahia +false America/Bahia_Banderas +false America/Barbados +false America/Belem +false America/Belize +false America/Blanc-Sablon +false America/Boa_Vista +false America/Bogota +true America/Boise +false America/Buenos_Aires +true America/Cambridge_Bay +false America/Campo_Grande +false America/Cancun +false America/Caracas +false America/Catamarca +false America/Cayenne +false America/Cayman +true America/Chicago +false America/Chihuahua +true America/Ciudad_Juarez +false America/Coral_Harbour +false America/Cordoba +false America/Costa_Rica +false America/Creston +false America/Cuiaba +false America/Curacao +false America/Danmarkshavn +false America/Dawson +false America/Dawson_Creek +true America/Denver +true America/Detroit +false America/Dominica +true America/Edmonton +false America/Eirunepe +false America/El_Salvador +true America/Ensenada +false America/Fort_Nelson +true America/Fort_Wayne +false America/Fortaleza +true America/Glace_Bay +true America/Godthab +true America/Goose_Bay +true America/Grand_Turk +false America/Grenada +false America/Guadeloupe +false America/Guatemala +false America/Guayaquil +false America/Guyana +true America/Halifax +true America/Havana +false America/Hermosillo +true America/Indiana/Indianapolis +true America/Indiana/Knox +true America/Indiana/Marengo +true America/Indiana/Petersburg +true America/Indiana/Tell_City +true America/Indiana/Vevay +true America/Indiana/Vincennes +true America/Indiana/Winamac +true America/Indianapolis +true America/Inuvik +true America/Iqaluit +false America/Jamaica +false America/Jujuy +true America/Juneau +true America/Kentucky/Louisville +true America/Kentucky/Monticello +true America/Knox_IN +false America/Kralendijk +false America/La_Paz +false America/Lima +true America/Los_Angeles +true America/Louisville +false America/Lower_Princes +false America/Maceio +false America/Managua +false America/Manaus +false America/Marigot +false America/Martinique +true America/Matamoros +false America/Mazatlan +false America/Mendoza +true America/Menominee +false America/Merida +true America/Metlakatla +false America/Mexico_City +true America/Miquelon +true America/Moncton +false America/Monterrey +false America/Montevideo +true America/Montreal +false America/Montserrat +true America/Nassau +true America/New_York +true America/Nipigon +true America/Nome +false America/Noronha +true America/North_Dakota/Beulah +true America/North_Dakota/Center +true America/North_Dakota/New_Salem +true America/Nuuk +true America/Ojinaga +false America/Panama +true America/Pangnirtung +false America/Paramaribo +false America/Phoenix +true America/Port-au-Prince +false America/Port_of_Spain +false America/Porto_Acre +false America/Porto_Velho +false America/Puerto_Rico +false America/Punta_Arenas +true America/Rainy_River +true America/Rankin_Inlet +false America/Recife +false America/Regina +true America/Resolute +false America/Rio_Branco +false America/Rosario +true America/Santa_Isabel +false America/Santarem +false America/Santiago +false America/Santo_Domingo +false America/Sao_Paulo +true America/Scoresbysund +true America/Shiprock +true America/Sitka +false America/St_Barthelemy +true America/St_Johns +false America/St_Kitts +false America/St_Lucia +false America/St_Thomas +false America/St_Vincent +false America/Swift_Current +false America/Tegucigalpa +true America/Thule +true America/Thunder_Bay +true America/Tijuana +true America/Toronto +false America/Tortola +true America/Vancouver +false America/Virgin +false America/Whitehorse +true America/Winnipeg +true America/Yakutat +true America/Yellowknife +false Antarctica/Casey +false Antarctica/Davis +false Antarctica/DumontDUrville +false Antarctica/Macquarie +false Antarctica/Mawson +false Antarctica/McMurdo +false Antarctica/Palmer +false Antarctica/Rothera +false Antarctica/South_Pole +false Antarctica/Syowa +true Antarctica/Troll +false Antarctica/Vostok +true Arctic/Longyearbyen +false Asia/Aden +false Asia/Almaty +false Asia/Amman +false Asia/Anadyr +false Asia/Aqtau +false Asia/Aqtobe +false Asia/Ashgabat +false Asia/Ashkhabad +false Asia/Atyrau +false Asia/Baghdad +false Asia/Bahrain +false Asia/Baku +false Asia/Bangkok +false Asia/Barnaul +true Asia/Beirut +false Asia/Bishkek +false Asia/Brunei +false Asia/Calcutta +false Asia/Chita +false Asia/Choibalsan +false Asia/Chongqing +false Asia/Chungking +false Asia/Colombo +false Asia/Dacca +false Asia/Damascus +false Asia/Dhaka +false Asia/Dili +false Asia/Dubai +false Asia/Dushanbe +true Asia/Famagusta +true Asia/Gaza +false Asia/Harbin +true Asia/Hebron +false Asia/Ho_Chi_Minh +false Asia/Hong_Kong +false Asia/Hovd +false Asia/Irkutsk +false Asia/Istanbul +false Asia/Jakarta +false Asia/Jayapura +true Asia/Jerusalem +false Asia/Kabul +false Asia/Kamchatka +false Asia/Karachi +false Asia/Kashgar +false Asia/Kathmandu +false Asia/Katmandu +false Asia/Khandyga +false Asia/Kolkata +false Asia/Krasnoyarsk +false Asia/Kuala_Lumpur +false Asia/Kuching +false Asia/Kuwait +false Asia/Macao +false Asia/Macau +false Asia/Magadan +false Asia/Makassar +false Asia/Manila +false Asia/Muscat +true Asia/Nicosia +false Asia/Novokuznetsk +false Asia/Novosibirsk +false Asia/Omsk +false Asia/Oral +false Asia/Phnom_Penh +false Asia/Pontianak +false Asia/Pyongyang +false Asia/Qatar +false Asia/Qostanay +false Asia/Qyzylorda +false Asia/Rangoon +false Asia/Riyadh +false Asia/Saigon +false Asia/Sakhalin +false Asia/Samarkand +false Asia/Seoul +false Asia/Shanghai +false Asia/Singapore +false Asia/Srednekolymsk +false Asia/Taipei +false Asia/Tashkent +false Asia/Tbilisi +false Asia/Tehran +true Asia/Tel_Aviv +false Asia/Thimbu +false Asia/Thimphu +false Asia/Tokyo +false Asia/Tomsk +false Asia/Ujung_Pandang +false Asia/Ulaanbaatar +false Asia/Ulan_Bator +false Asia/Urumqi +false Asia/Ust-Nera +false Asia/Vientiane +false Asia/Vladivostok +false Asia/Yakutsk +false Asia/Yangon +false Asia/Yekaterinburg +false Asia/Yerevan +true Atlantic/Azores +true Atlantic/Bermuda +true Atlantic/Canary +false Atlantic/Cape_Verde +true Atlantic/Faeroe +true Atlantic/Faroe +true Atlantic/Jan_Mayen +true Atlantic/Madeira +false Atlantic/Reykjavik +false Atlantic/South_Georgia +false Atlantic/St_Helena +false Atlantic/Stanley +false Australia/ACT +false Australia/Adelaide +false Australia/Brisbane +false Australia/Broken_Hill +false Australia/Canberra +false Australia/Currie +false Australia/Darwin +false Australia/Eucla +false Australia/Hobart +false Australia/LHI +false Australia/Lindeman +false Australia/Lord_Howe +false Australia/Melbourne +false Australia/NSW +false Australia/North +false Australia/Perth +false Australia/Queensland +false Australia/South +false Australia/Sydney +false Australia/Tasmania +false Australia/Victoria +false Australia/West +false Australia/Yancowinna +true BDST +false BDT +false BNT +false BORT +false BOT +false BRA +true BRST +false BRT +true BST +false BTT +false Brazil/Acre +false Brazil/DeNoronha +false Brazil/East +false Brazil/West +true CADT +false CAST +false CCT +true CDT +true CEST +false CET +true CETDST +true CHADT +false CHAST +false CHUT +false CKT +true CLST +false CLT +false COT +false CST +true CST6CDT +false CXT +true Canada/Atlantic +true Canada/Central +true Canada/Eastern +true Canada/Mountain +true Canada/Newfoundland +true Canada/Pacific +false Canada/Saskatchewan +false Canada/Yukon +false Chile/Continental +false Chile/EasterIsland +true Cuba +false DAVT +false DDUT +false EASST +false EAST +false EAT +true EDT +true EEST +false EET +true EETDST +true EGST +false EGT +false EST +true EST5EDT +true Egypt +false Eire +false Etc/GMT +false Etc/GMT+0 +false Etc/GMT+1 +false Etc/GMT+10 +false Etc/GMT+11 +false Etc/GMT+12 +false Etc/GMT+2 +false Etc/GMT+3 +false Etc/GMT+4 +false Etc/GMT+5 +false Etc/GMT+6 +false Etc/GMT+7 +false Etc/GMT+8 +false Etc/GMT+9 +false Etc/GMT-0 +false Etc/GMT-1 +false Etc/GMT-10 +false Etc/GMT-11 +false Etc/GMT-12 +false Etc/GMT-13 +false Etc/GMT-14 +false Etc/GMT-2 +false Etc/GMT-3 +false Etc/GMT-4 +false Etc/GMT-5 +false Etc/GMT-6 +false Etc/GMT-7 +false Etc/GMT-8 +false Etc/GMT-9 +false Etc/GMT0 +false Etc/Greenwich +false Etc/UCT +false Etc/UTC +false Etc/Universal +false Etc/Zulu +true Europe/Amsterdam +true Europe/Andorra +false Europe/Astrakhan +true Europe/Athens +true Europe/Belfast +true Europe/Belgrade +true Europe/Berlin +true Europe/Bratislava +true Europe/Brussels +true Europe/Bucharest +true Europe/Budapest +true Europe/Busingen +true Europe/Chisinau +true Europe/Copenhagen +false Europe/Dublin +true Europe/Gibraltar +true Europe/Guernsey +true Europe/Helsinki +true Europe/Isle_of_Man +false Europe/Istanbul +true Europe/Jersey +false Europe/Kaliningrad +true Europe/Kiev +false Europe/Kirov +true Europe/Kyiv +true Europe/Lisbon +true Europe/Ljubljana +true Europe/London +true Europe/Luxembourg +true Europe/Madrid +true Europe/Malta +true Europe/Mariehamn +false Europe/Minsk +true Europe/Monaco +false Europe/Moscow +true Europe/Nicosia +true Europe/Oslo +true Europe/Paris +true Europe/Podgorica +true Europe/Prague +true Europe/Riga +true Europe/Rome +false Europe/Samara +true Europe/San_Marino +true Europe/Sarajevo +false Europe/Saratov +false Europe/Simferopol +true Europe/Skopje +true Europe/Sofia +true Europe/Stockholm +true Europe/Tallinn +true Europe/Tirane +true Europe/Tiraspol +false Europe/Ulyanovsk +true Europe/Uzhgorod +true Europe/Vaduz +true Europe/Vatican +true Europe/Vienna +true Europe/Vilnius +false Europe/Volgograd +true Europe/Warsaw +true Europe/Zagreb +true Europe/Zaporozhye +true Europe/Zurich +false FET +true FJST +false FJT +false FKST +false FKT +true FNST +false FNT +false Factory +false GALT +false GAMT +true GB +true GB-Eire +false GEST +false GET +false GFT +false GILT +false GMT +false GMT+0 +false GMT-0 +false GMT0 +false GYT +false Greenwich +false HKT +false HST +false Hongkong +false ICT +true IDT +false IOT +false IRKST +false IRKT +false IRT +false IST +false Iceland +false Indian/Antananarivo +false Indian/Chagos +false Indian/Christmas +false Indian/Cocos +false Indian/Comoro +false Indian/Kerguelen +false Indian/Mahe +false Indian/Maldives +false Indian/Mauritius +false Indian/Mayotte +false Indian/Reunion +false Iran +true Israel +false JAYT +false JST +false Jamaica +false Japan +true KDT +true KGST +false KGT +false KOST +false KRAST +false KRAT +false KST +false Kwajalein +false LHDT +false LHST +false LIGT +false LINT +false LKT +false Libya +false MAGST +false MAGT +false MART +false MAWT +true MDT +true MEST +true MESZ +true MET +true METDST +false MEZ +false MHT +false MMT +false MPT +true MSD +false MSK +false MST +true MST7MDT +true MUST +false MUT +false MVT +false MYT +true Mexico/BajaNorte +false Mexico/BajaSur +false Mexico/General +true NDT +false NFT +false NOVST +false NOVT +false NPT +false NST +false NUT +false NZ +false NZ-CHAT +true NZDT +false NZST +false NZT +true Navajo +false OMSST +false OMST +true PDT +false PET +false PETST +false PETT +false PGT +false PHT +true PKST +false PKT +true PMDT +false PMST +false PONT +false PRC +false PST +true PST8PDT +false PWT +true PYST +false PYT +false Pacific/Apia +false Pacific/Auckland +false Pacific/Bougainville +false Pacific/Chatham +false Pacific/Chuuk +false Pacific/Easter +false Pacific/Efate +false Pacific/Enderbury +false Pacific/Fakaofo +false Pacific/Fiji +false Pacific/Funafuti +false Pacific/Galapagos +false Pacific/Gambier +false Pacific/Guadalcanal +false Pacific/Guam +false Pacific/Honolulu +false Pacific/Johnston +false Pacific/Kanton +false Pacific/Kiritimati +false Pacific/Kosrae +false Pacific/Kwajalein +false Pacific/Majuro +false Pacific/Marquesas +false Pacific/Midway +false Pacific/Nauru +false Pacific/Niue +false Pacific/Norfolk +false Pacific/Noumea +false Pacific/Pago_Pago +false Pacific/Palau +false Pacific/Pitcairn +false Pacific/Pohnpei +false Pacific/Ponape +false Pacific/Port_Moresby +false Pacific/Rarotonga +false Pacific/Saipan +false Pacific/Samoa +false Pacific/Tahiti +false Pacific/Tarawa +false Pacific/Tongatapu +false Pacific/Truk +false Pacific/Wake +false Pacific/Wallis +false Pacific/Yap +true Poland +true Portugal +false RET +false ROC +false ROK +true SADT +false SAST +false SCT +false SGT +false Singapore +false TAHT +false TFT +false TJT +false TKT +false TMT +false TOT +false TRUT +false TVT +false Turkey +false UCT +true ULAST +false ULAT +true US/Alaska +true US/Aleutian +false US/Arizona +true US/Central +true US/East-Indiana +true US/Eastern +false US/Hawaii +true US/Indiana-Starke +true US/Michigan +true US/Mountain +true US/Pacific +false US/Samoa +false UT +false UTC +true UYST +false UYT +true UZST +false UZT +false Universal +false VET +false VLAST +false VLAT +false VOLT +false VUT +false W-SU +true WADT +false WAKT +false WAST +false WAT +true WDT +true WET +true WETDST +false WFT +true WGST +false WGT +false XJT +false YAKST +false YAKT +false YAPT +true YEKST +false YEKT +false Z +false Zulu +false posix/Africa/Abidjan +false posix/Africa/Accra +false posix/Africa/Addis_Ababa +false posix/Africa/Algiers +false posix/Africa/Asmara +false posix/Africa/Asmera +false posix/Africa/Bamako +false posix/Africa/Bangui +false posix/Africa/Banjul +false posix/Africa/Bissau +false posix/Africa/Blantyre +false posix/Africa/Brazzaville +false posix/Africa/Bujumbura +true posix/Africa/Cairo +false posix/Africa/Casablanca +true posix/Africa/Ceuta +false posix/Africa/Conakry +false posix/Africa/Dakar +false posix/Africa/Dar_es_Salaam +false posix/Africa/Djibouti +false posix/Africa/Douala +false posix/Africa/El_Aaiun +false posix/Africa/Freetown +false posix/Africa/Gaborone +false posix/Africa/Harare +false posix/Africa/Johannesburg +false posix/Africa/Juba +false posix/Africa/Kampala +false posix/Africa/Khartoum +false posix/Africa/Kigali +false posix/Africa/Kinshasa +false posix/Africa/Lagos +false posix/Africa/Libreville +false posix/Africa/Lome +false posix/Africa/Luanda +false posix/Africa/Lubumbashi +false posix/Africa/Lusaka +false posix/Africa/Malabo +false posix/Africa/Maputo +false posix/Africa/Maseru +false posix/Africa/Mbabane +false posix/Africa/Mogadishu +false posix/Africa/Monrovia +false posix/Africa/Nairobi +false posix/Africa/Ndjamena +false posix/Africa/Niamey +false posix/Africa/Nouakchott +false posix/Africa/Ouagadougou +false posix/Africa/Porto-Novo +false posix/Africa/Sao_Tome +false posix/Africa/Timbuktu +false posix/Africa/Tripoli +false posix/Africa/Tunis +false posix/Africa/Windhoek +true posix/America/Adak +true posix/America/Anchorage +false posix/America/Anguilla +false posix/America/Antigua +false posix/America/Araguaina +false posix/America/Argentina/Buenos_Aires +false posix/America/Argentina/Catamarca +false posix/America/Argentina/ComodRivadavia +false posix/America/Argentina/Cordoba +false posix/America/Argentina/Jujuy +false posix/America/Argentina/La_Rioja +false posix/America/Argentina/Mendoza +false posix/America/Argentina/Rio_Gallegos +false posix/America/Argentina/Salta +false posix/America/Argentina/San_Juan +false posix/America/Argentina/San_Luis +false posix/America/Argentina/Tucuman +false posix/America/Argentina/Ushuaia +false posix/America/Aruba +false posix/America/Asuncion +false posix/America/Atikokan +true posix/America/Atka +false posix/America/Bahia +false posix/America/Bahia_Banderas +false posix/America/Barbados +false posix/America/Belem +false posix/America/Belize +false posix/America/Blanc-Sablon +false posix/America/Boa_Vista +false posix/America/Bogota +true posix/America/Boise +false posix/America/Buenos_Aires +true posix/America/Cambridge_Bay +false posix/America/Campo_Grande +false posix/America/Cancun +false posix/America/Caracas +false posix/America/Catamarca +false posix/America/Cayenne +false posix/America/Cayman +true posix/America/Chicago +false posix/America/Chihuahua +true posix/America/Ciudad_Juarez +false posix/America/Coral_Harbour +false posix/America/Cordoba +false posix/America/Costa_Rica +false posix/America/Creston +false posix/America/Cuiaba +false posix/America/Curacao +false posix/America/Danmarkshavn +false posix/America/Dawson +false posix/America/Dawson_Creek +true posix/America/Denver +true posix/America/Detroit +false posix/America/Dominica +true posix/America/Edmonton +false posix/America/Eirunepe +false posix/America/El_Salvador +true posix/America/Ensenada +false posix/America/Fort_Nelson +true posix/America/Fort_Wayne +false posix/America/Fortaleza +true posix/America/Glace_Bay +true posix/America/Godthab +true posix/America/Goose_Bay +true posix/America/Grand_Turk +false posix/America/Grenada +false posix/America/Guadeloupe +false posix/America/Guatemala +false posix/America/Guayaquil +false posix/America/Guyana +true posix/America/Halifax +true posix/America/Havana +false posix/America/Hermosillo +true posix/America/Indiana/Indianapolis +true posix/America/Indiana/Knox +true posix/America/Indiana/Marengo +true posix/America/Indiana/Petersburg +true posix/America/Indiana/Tell_City +true posix/America/Indiana/Vevay +true posix/America/Indiana/Vincennes +true posix/America/Indiana/Winamac +true posix/America/Indianapolis +true posix/America/Inuvik +true posix/America/Iqaluit +false posix/America/Jamaica +false posix/America/Jujuy +true posix/America/Juneau +true posix/America/Kentucky/Louisville +true posix/America/Kentucky/Monticello +true posix/America/Knox_IN +false posix/America/Kralendijk +false posix/America/La_Paz +false posix/America/Lima +true posix/America/Los_Angeles +true posix/America/Louisville +false posix/America/Lower_Princes +false posix/America/Maceio +false posix/America/Managua +false posix/America/Manaus +false posix/America/Marigot +false posix/America/Martinique +true posix/America/Matamoros +false posix/America/Mazatlan +false posix/America/Mendoza +true posix/America/Menominee +false posix/America/Merida +true posix/America/Metlakatla +false posix/America/Mexico_City +true posix/America/Miquelon +true posix/America/Moncton +false posix/America/Monterrey +false posix/America/Montevideo +true posix/America/Montreal +false posix/America/Montserrat +true posix/America/Nassau +true posix/America/New_York +true posix/America/Nipigon +true posix/America/Nome +false posix/America/Noronha +true posix/America/North_Dakota/Beulah +true posix/America/North_Dakota/Center +true posix/America/North_Dakota/New_Salem +true posix/America/Nuuk +true posix/America/Ojinaga +false posix/America/Panama +true posix/America/Pangnirtung +false posix/America/Paramaribo +false posix/America/Phoenix +true posix/America/Port-au-Prince +false posix/America/Port_of_Spain +false posix/America/Porto_Acre +false posix/America/Porto_Velho +false posix/America/Puerto_Rico +false posix/America/Punta_Arenas +true posix/America/Rainy_River +true posix/America/Rankin_Inlet +false posix/America/Recife +false posix/America/Regina +true posix/America/Resolute +false posix/America/Rio_Branco +false posix/America/Rosario +true posix/America/Santa_Isabel +false posix/America/Santarem +false posix/America/Santiago +false posix/America/Santo_Domingo +false posix/America/Sao_Paulo +true posix/America/Scoresbysund +true posix/America/Shiprock +true posix/America/Sitka +false posix/America/St_Barthelemy +true posix/America/St_Johns +false posix/America/St_Kitts +false posix/America/St_Lucia +false posix/America/St_Thomas +false posix/America/St_Vincent +false posix/America/Swift_Current +false posix/America/Tegucigalpa +true posix/America/Thule +true posix/America/Thunder_Bay +true posix/America/Tijuana +true posix/America/Toronto +false posix/America/Tortola +true posix/America/Vancouver +false posix/America/Virgin +false posix/America/Whitehorse +true posix/America/Winnipeg +true posix/America/Yakutat +true posix/America/Yellowknife +false posix/Antarctica/Casey +false posix/Antarctica/Davis +false posix/Antarctica/DumontDUrville +false posix/Antarctica/Macquarie +false posix/Antarctica/Mawson +false posix/Antarctica/McMurdo +false posix/Antarctica/Palmer +false posix/Antarctica/Rothera +false posix/Antarctica/South_Pole +false posix/Antarctica/Syowa +true posix/Antarctica/Troll +false posix/Antarctica/Vostok +true posix/Arctic/Longyearbyen +false posix/Asia/Aden +false posix/Asia/Almaty +false posix/Asia/Amman +false posix/Asia/Anadyr +false posix/Asia/Aqtau +false posix/Asia/Aqtobe +false posix/Asia/Ashgabat +false posix/Asia/Ashkhabad +false posix/Asia/Atyrau +false posix/Asia/Baghdad +false posix/Asia/Bahrain +false posix/Asia/Baku +false posix/Asia/Bangkok +false posix/Asia/Barnaul +true posix/Asia/Beirut +false posix/Asia/Bishkek +false posix/Asia/Brunei +false posix/Asia/Calcutta +false posix/Asia/Chita +false posix/Asia/Choibalsan +false posix/Asia/Chongqing +false posix/Asia/Chungking +false posix/Asia/Colombo +false posix/Asia/Dacca +false posix/Asia/Damascus +false posix/Asia/Dhaka +false posix/Asia/Dili +false posix/Asia/Dubai +false posix/Asia/Dushanbe +true posix/Asia/Famagusta +true posix/Asia/Gaza +false posix/Asia/Harbin +true posix/Asia/Hebron +false posix/Asia/Ho_Chi_Minh +false posix/Asia/Hong_Kong +false posix/Asia/Hovd +false posix/Asia/Irkutsk +false posix/Asia/Istanbul +false posix/Asia/Jakarta +false posix/Asia/Jayapura +true posix/Asia/Jerusalem +false posix/Asia/Kabul +false posix/Asia/Kamchatka +false posix/Asia/Karachi +false posix/Asia/Kashgar +false posix/Asia/Kathmandu +false posix/Asia/Katmandu +false posix/Asia/Khandyga +false posix/Asia/Kolkata +false posix/Asia/Krasnoyarsk +false posix/Asia/Kuala_Lumpur +false posix/Asia/Kuching +false posix/Asia/Kuwait +false posix/Asia/Macao +false posix/Asia/Macau +false posix/Asia/Magadan +false posix/Asia/Makassar +false posix/Asia/Manila +false posix/Asia/Muscat +true posix/Asia/Nicosia +false posix/Asia/Novokuznetsk +false posix/Asia/Novosibirsk +false posix/Asia/Omsk +false posix/Asia/Oral +false posix/Asia/Phnom_Penh +false posix/Asia/Pontianak +false posix/Asia/Pyongyang +false posix/Asia/Qatar +false posix/Asia/Qostanay +false posix/Asia/Qyzylorda +false posix/Asia/Rangoon +false posix/Asia/Riyadh +false posix/Asia/Saigon +false posix/Asia/Sakhalin +false posix/Asia/Samarkand +false posix/Asia/Seoul +false posix/Asia/Shanghai +false posix/Asia/Singapore +false posix/Asia/Srednekolymsk +false posix/Asia/Taipei +false posix/Asia/Tashkent +false posix/Asia/Tbilisi +false posix/Asia/Tehran +true posix/Asia/Tel_Aviv +false posix/Asia/Thimbu +false posix/Asia/Thimphu +false posix/Asia/Tokyo +false posix/Asia/Tomsk +false posix/Asia/Ujung_Pandang +false posix/Asia/Ulaanbaatar +false posix/Asia/Ulan_Bator +false posix/Asia/Urumqi +false posix/Asia/Ust-Nera +false posix/Asia/Vientiane +false posix/Asia/Vladivostok +false posix/Asia/Yakutsk +false posix/Asia/Yangon +false posix/Asia/Yekaterinburg +false posix/Asia/Yerevan +true posix/Atlantic/Azores +true posix/Atlantic/Bermuda +true posix/Atlantic/Canary +false posix/Atlantic/Cape_Verde +true posix/Atlantic/Faeroe +true posix/Atlantic/Faroe +true posix/Atlantic/Jan_Mayen +true posix/Atlantic/Madeira +false posix/Atlantic/Reykjavik +false posix/Atlantic/South_Georgia +false posix/Atlantic/St_Helena +false posix/Atlantic/Stanley +false posix/Australia/ACT +false posix/Australia/Adelaide +false posix/Australia/Brisbane +false posix/Australia/Broken_Hill +false posix/Australia/Canberra +false posix/Australia/Currie +false posix/Australia/Darwin +false posix/Australia/Eucla +false posix/Australia/Hobart +false posix/Australia/LHI +false posix/Australia/Lindeman +false posix/Australia/Lord_Howe +false posix/Australia/Melbourne +false posix/Australia/NSW +false posix/Australia/North +false posix/Australia/Perth +false posix/Australia/Queensland +false posix/Australia/South +false posix/Australia/Sydney +false posix/Australia/Tasmania +false posix/Australia/Victoria +false posix/Australia/West +false posix/Australia/Yancowinna +false posix/Brazil/Acre +false posix/Brazil/DeNoronha +false posix/Brazil/East +false posix/Brazil/West +true posix/CET +true posix/CST6CDT +true posix/Canada/Atlantic +true posix/Canada/Central +true posix/Canada/Eastern +true posix/Canada/Mountain +true posix/Canada/Newfoundland +true posix/Canada/Pacific +false posix/Canada/Saskatchewan +false posix/Canada/Yukon +false posix/Chile/Continental +false posix/Chile/EasterIsland +true posix/Cuba +true posix/EET +false posix/EST +true posix/EST5EDT +true posix/Egypt +false posix/Eire +false posix/Etc/GMT +false posix/Etc/GMT+0 +false posix/Etc/GMT+1 +false posix/Etc/GMT+10 +false posix/Etc/GMT+11 +false posix/Etc/GMT+12 +false posix/Etc/GMT+2 +false posix/Etc/GMT+3 +false posix/Etc/GMT+4 +false posix/Etc/GMT+5 +false posix/Etc/GMT+6 +false posix/Etc/GMT+7 +false posix/Etc/GMT+8 +false posix/Etc/GMT+9 +false posix/Etc/GMT-0 +false posix/Etc/GMT-1 +false posix/Etc/GMT-10 +false posix/Etc/GMT-11 +false posix/Etc/GMT-12 +false posix/Etc/GMT-13 +false posix/Etc/GMT-14 +false posix/Etc/GMT-2 +false posix/Etc/GMT-3 +false posix/Etc/GMT-4 +false posix/Etc/GMT-5 +false posix/Etc/GMT-6 +false posix/Etc/GMT-7 +false posix/Etc/GMT-8 +false posix/Etc/GMT-9 +false posix/Etc/GMT0 +false posix/Etc/Greenwich +false posix/Etc/UCT +false posix/Etc/UTC +false posix/Etc/Universal +false posix/Etc/Zulu +true posix/Europe/Amsterdam +true posix/Europe/Andorra +false posix/Europe/Astrakhan +true posix/Europe/Athens +true posix/Europe/Belfast +true posix/Europe/Belgrade +true posix/Europe/Berlin +true posix/Europe/Bratislava +true posix/Europe/Brussels +true posix/Europe/Bucharest +true posix/Europe/Budapest +true posix/Europe/Busingen +true posix/Europe/Chisinau +true posix/Europe/Copenhagen +false posix/Europe/Dublin +true posix/Europe/Gibraltar +true posix/Europe/Guernsey +true posix/Europe/Helsinki +true posix/Europe/Isle_of_Man +false posix/Europe/Istanbul +true posix/Europe/Jersey +false posix/Europe/Kaliningrad +true posix/Europe/Kiev +false posix/Europe/Kirov +true posix/Europe/Kyiv +true posix/Europe/Lisbon +true posix/Europe/Ljubljana +true posix/Europe/London +true posix/Europe/Luxembourg +true posix/Europe/Madrid +true posix/Europe/Malta +true posix/Europe/Mariehamn +false posix/Europe/Minsk +true posix/Europe/Monaco +false posix/Europe/Moscow +true posix/Europe/Nicosia +true posix/Europe/Oslo +true posix/Europe/Paris +true posix/Europe/Podgorica +true posix/Europe/Prague +true posix/Europe/Riga +true posix/Europe/Rome +false posix/Europe/Samara +true posix/Europe/San_Marino +true posix/Europe/Sarajevo +false posix/Europe/Saratov +false posix/Europe/Simferopol +true posix/Europe/Skopje +true posix/Europe/Sofia +true posix/Europe/Stockholm +true posix/Europe/Tallinn +true posix/Europe/Tirane +true posix/Europe/Tiraspol +false posix/Europe/Ulyanovsk +true posix/Europe/Uzhgorod +true posix/Europe/Vaduz +true posix/Europe/Vatican +true posix/Europe/Vienna +true posix/Europe/Vilnius +false posix/Europe/Volgograd +true posix/Europe/Warsaw +true posix/Europe/Zagreb +true posix/Europe/Zaporozhye +true posix/Europe/Zurich +false posix/Factory +true posix/GB +true posix/GB-Eire +false posix/GMT +false posix/GMT+0 +false posix/GMT-0 +false posix/GMT0 +false posix/Greenwich +false posix/HST +false posix/Hongkong +false posix/Iceland +false posix/Indian/Antananarivo +false posix/Indian/Chagos +false posix/Indian/Christmas +false posix/Indian/Cocos +false posix/Indian/Comoro +false posix/Indian/Kerguelen +false posix/Indian/Mahe +false posix/Indian/Maldives +false posix/Indian/Mauritius +false posix/Indian/Mayotte +false posix/Indian/Reunion +false posix/Iran +true posix/Israel +false posix/Jamaica +false posix/Japan +false posix/Kwajalein +false posix/Libya +true posix/MET +false posix/MST +true posix/MST7MDT +true posix/Mexico/BajaNorte +false posix/Mexico/BajaSur +false posix/Mexico/General +false posix/NZ +false posix/NZ-CHAT +true posix/Navajo +false posix/PRC +true posix/PST8PDT +false posix/Pacific/Apia +false posix/Pacific/Auckland +false posix/Pacific/Bougainville +false posix/Pacific/Chatham +false posix/Pacific/Chuuk +false posix/Pacific/Easter +false posix/Pacific/Efate +false posix/Pacific/Enderbury +false posix/Pacific/Fakaofo +false posix/Pacific/Fiji +false posix/Pacific/Funafuti +false posix/Pacific/Galapagos +false posix/Pacific/Gambier +false posix/Pacific/Guadalcanal +false posix/Pacific/Guam +false posix/Pacific/Honolulu +false posix/Pacific/Johnston +false posix/Pacific/Kanton +false posix/Pacific/Kiritimati +false posix/Pacific/Kosrae +false posix/Pacific/Kwajalein +false posix/Pacific/Majuro +false posix/Pacific/Marquesas +false posix/Pacific/Midway +false posix/Pacific/Nauru +false posix/Pacific/Niue +false posix/Pacific/Norfolk +false posix/Pacific/Noumea +false posix/Pacific/Pago_Pago +false posix/Pacific/Palau +false posix/Pacific/Pitcairn +false posix/Pacific/Pohnpei +false posix/Pacific/Ponape +false posix/Pacific/Port_Moresby +false posix/Pacific/Rarotonga +false posix/Pacific/Saipan +false posix/Pacific/Samoa +false posix/Pacific/Tahiti +false posix/Pacific/Tarawa +false posix/Pacific/Tongatapu +false posix/Pacific/Truk +false posix/Pacific/Wake +false posix/Pacific/Wallis +false posix/Pacific/Yap +true posix/Poland +true posix/Portugal +false posix/ROC +false posix/ROK +false posix/Singapore +false posix/Turkey +false posix/UCT +true posix/US/Alaska +true posix/US/Aleutian +false posix/US/Arizona +true posix/US/Central +true posix/US/East-Indiana +true posix/US/Eastern +false posix/US/Hawaii +true posix/US/Indiana-Starke +true posix/US/Michigan +true posix/US/Mountain +true posix/US/Pacific +false posix/US/Samoa +false posix/UTC +false posix/Universal +false posix/W-SU +true posix/WET +false posix/Zulu + + + + 1 + 11||10|C|G +11||-9223372036854775808|U|G +11||10|U|G +2200||6171|C|G +2200||-9223372036854775808|U|G +2200||6171|U|G +2200||16384|U|G +2200||16478|U|G +2200||16479|U|G +2200||16480|U|G +13208||10|C|G +13208||-9223372036854775808|U|G +13208||10|U|G +17165||10|C|G +17165||16384|C|G +17165||16535|C|G +17165||16595|C|G +17165||10|U|G +17165||16384|U|G +17165||16478|U|G +17165||16479|U|G +17165||16480|U|G +17165||16535|U|G +17165||16595|U|G +17166||16384|C|G +17166||16595|C|G +17166||16384|U|G +17166||16478|U|G +17166||16479|U|G +17166||16480|U|G +17166||16595|U|G +17167||10|C|G +17167||10|U|G +17167||16478|U|G +17167||16479|U|G +17167||16480|U|G +17167||16384|U|O +17168||10|C|G +17168||10|U|G +17168||16478|U|G +17168||16479|U|G +17168||16480|U|G +17168||16384|U|O +17170||10|C|G +17170||-9223372036854775808|U|G +17170||10|U|G +17294||10|C|G +17294||10|U|G +17294||17161|U|G +17471||10|C|G +17471||17122|C|G +17471||10|U|G +17471||16384|U|G +17471||16478|U|G +17471||16479|U|G +17471||16480|U|G +17471||17122|U|G +17472||10|C|G +17472||16384|C|G +17472||16590|C|G +17472||16595|C|G +17472||10|U|G +17472||16384|U|G +17472||16478|U|G +17472||16479|U|G +17472||16480|U|G +17472||16590|U|G +17472||16595|U|G +17473||10|C|G +17473||10|U|G +17473||16384|U|O + 1900 + 17164 + postgres + + + statement_timeout=3s + 16478 + + + statement_timeout=8s + 16479 + + + 1 + session_preload_libraries=safeupdate +statement_timeout=8s +lock_timeout=8s + 0 + 16481 + 16478 +16479 +16480 + + + 1 + 1 + 16595 + 1 + + + 4544 + + + 6171 + + + 4571 + + + 3373 + 3374 +3375 +3377 + + + 6181 + + + 3374 + + + 3375 + + + 4569 + + + 4200 + + + 3377 + + + 6182 + + + 4570 + + + 1 + 16385 + + + 17160 + 17161 + + + 17161 + + + 17162 + 17160 +17161 + + + 1 + 1 + search_path="\\$user", public, extensions + 1 + 1 + 16384 + 1 + 16478 +16479 +16480 +16535 +16590 +17122 +17160! +17161! +17162! +3373 +4200 +6181 + + + 1 + 16480 + 17160 + + + 1 + 1 + search_path="$user", public, auth, extensions +log_statement=none + 1 + 1 + 10 + 1 + 1 + + + 1 + search_path=auth +idle_in_transaction_session_timeout=60000 +log_statement=none + 1 + 0 + 16535 + + + 1 + 1 + 16422 + 6181 + + + 0 + 17122 + + + 1 + 16421 + 1 + + + 1 + search_path=storage +log_statement=none + 1 + 0 + 16590 + 16481 + + + 1663 + 1 + supabase_admin + + + 1664 + 1 + supabase_admin + + + block range index (BRIN) access method + 3580 + 1 + index + 335 + brinhandler + pg_catalog + + + b-tree index access method + 403 + 1 + index + 330 + bthandler + pg_catalog + + + GIN index access method + 2742 + 1 + index + 333 + ginhandler + pg_catalog + + + GiST index access method + 783 + 1 + index + 332 + gisthandler + pg_catalog + + + hash index access method + 405 + 1 + index + 331 + hashhandler + pg_catalog + + + heap table access method + 2 + 1 + table + 3 + heap_tableam_handler + pg_catalog + + + SP-GiST index access method + 4000 + 1 + index + 334 + spghandler + pg_catalog + + + explicit + function + 10216 + 1 + 3556 + bool + pg_catalog + 3802 + jsonb + pg_catalog + 16 + bool + pg_catalog + + + explicit + function + 10034 + 1 + 2557 + bool + pg_catalog + 23 + int4 + pg_catalog + 16 + bool + pg_catalog + + + implicit + binary + 10148 + 1 + 3402 + pg_dependencies + pg_catalog + 17 + bytea + pg_catalog + + + implicit + binary + 10146 + 1 + 3361 + pg_ndistinct + pg_catalog + 17 + bytea + pg_catalog + + + implicit + binary + 10150 + 1 + 5017 + pg_mcv_list + pg_catalog + 17 + bytea + pg_catalog + + + assignment + function + 10138 + 1 + 944 + char + pg_catalog + 1042 + bpchar + pg_catalog + 18 + char + pg_catalog + + + assignment + function + 10139 + 1 + 944 + char + pg_catalog + 1043 + varchar + pg_catalog + 18 + char + pg_catalog + + + assignment + function + 10137 + 1 + 944 + char + pg_catalog + 25 + text + pg_catalog + 18 + char + pg_catalog + + + explicit + function + 10144 + 1 + 78 + char + pg_catalog + 23 + int4 + pg_catalog + 18 + char + pg_catalog + + + implicit + function + 10142 + 1 + 1400 + name + pg_catalog + 1043 + varchar + pg_catalog + 19 + name + pg_catalog + + + implicit + function + 10140 + 1 + 407 + name + pg_catalog + 25 + text + pg_catalog + 19 + name + pg_catalog + + + implicit + function + 10141 + 1 + 409 + name + pg_catalog + 1042 + bpchar + pg_catalog + 19 + name + pg_catalog + + + assignment + function + 10015 + 1 + 653 + int8 + pg_catalog + 700 + float4 + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10040 + 1 + 1288 + int8 + pg_catalog + 26 + oid + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10123 + 1 + 1288 + int8 + pg_catalog + 4089 + regnamespace + pg_catalog + 20 + int8 + pg_catalog + + + implicit + function + 10005 + 1 + 754 + int8 + pg_catalog + 21 + int2 + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10107 + 1 + 1288 + int8 + pg_catalog + 3769 + regdictionary + pg_catalog + 20 + int8 + pg_catalog + + + explicit + function + 10187 + 1 + 2076 + int8 + pg_catalog + 1560 + bit + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10047 + 1 + 1288 + int8 + pg_catalog + 24 + regproc + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10079 + 1 + 1288 + int8 + pg_catalog + 2205 + regclass + pg_catalog + 20 + int8 + pg_catalog + + + explicit + function + 10220 + 1 + 3452 + int8 + pg_catalog + 3802 + jsonb + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10093 + 1 + 1288 + int8 + pg_catalog + 2206 + regtype + pg_catalog + 20 + int8 + pg_catalog + + + implicit + function + 10010 + 1 + 481 + int8 + pg_catalog + 23 + int4 + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10086 + 1 + 1288 + int8 + pg_catalog + 4191 + regcollation + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10025 + 1 + 1779 + int8 + pg_catalog + 1700 + numeric + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10056 + 1 + 1288 + int8 + pg_catalog + 2202 + regprocedure + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10116 + 1 + 1288 + int8 + pg_catalog + 4096 + regrole + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10020 + 1 + 483 + int8 + pg_catalog + 701 + float8 + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10100 + 1 + 1288 + int8 + pg_catalog + 3734 + regconfig + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10072 + 1 + 1288 + int8 + pg_catalog + 2204 + regoperator + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10063 + 1 + 1288 + int8 + pg_catalog + 2203 + regoper + pg_catalog + 20 + int8 + pg_catalog + + + assignment + function + 10011 + 1 + 314 + int2 + pg_catalog + 23 + int4 + pg_catalog + 21 + int2 + pg_catalog + + + explicit + function + 10218 + 1 + 3450 + int2 + pg_catalog + 3802 + jsonb + pg_catalog + 21 + int2 + pg_catalog + + + assignment + function + 10000 + 1 + 714 + int2 + pg_catalog + 20 + int8 + pg_catalog + 21 + int2 + pg_catalog + + + assignment + function + 10016 + 1 + 238 + int2 + pg_catalog + 700 + float4 + pg_catalog + 21 + int2 + pg_catalog + + + assignment + function + 10021 + 1 + 237 + int2 + pg_catalog + 701 + float8 + pg_catalog + 21 + int2 + pg_catalog + + + assignment + function + 10026 + 1 + 1783 + int2 + pg_catalog + 1700 + numeric + pg_catalog + 21 + int2 + pg_catalog + + + explicit + function + 10219 + 1 + 3451 + int4 + pg_catalog + 3802 + jsonb + pg_catalog + 23 + int4 + pg_catalog + + + explicit + function + 10035 + 1 + 2558 + int4 + pg_catalog + 16 + bool + pg_catalog + 23 + int4 + pg_catalog + + + explicit + function + 10188 + 1 + 1684 + int4 + pg_catalog + 1560 + bit + pg_catalog + 23 + int4 + pg_catalog + + + assignment + function + 10001 + 1 + 480 + int4 + pg_catalog + 20 + int8 + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10087 + 1 + 4191 + regcollation + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10117 + 1 + 4096 + regrole + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10124 + 1 + 4089 + regnamespace + pg_catalog + 23 + int4 + pg_catalog + + + implicit + function + 10006 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10108 + 1 + 3769 + regdictionary + pg_catalog + 23 + int4 + pg_catalog + + + assignment + function + 10022 + 1 + 317 + int4 + pg_catalog + 701 + float8 + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10101 + 1 + 3734 + regconfig + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10094 + 1 + 2206 + regtype + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10080 + 1 + 2205 + regclass + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10048 + 1 + 24 + regproc + pg_catalog + 23 + int4 + pg_catalog + + + assignment + function + 10027 + 1 + 1744 + int4 + pg_catalog + 1700 + numeric + pg_catalog + 23 + int4 + pg_catalog + + + explicit + function + 10143 + 1 + 77 + int4 + pg_catalog + 18 + char + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10073 + 1 + 2204 + regoperator + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10041 + 1 + 26 + oid + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10064 + 1 + 2203 + regoper + pg_catalog + 23 + int4 + pg_catalog + + + assignment + binary + 10057 + 1 + 2202 + regprocedure + pg_catalog + 23 + int4 + pg_catalog + + + assignment + function + 10017 + 1 + 319 + int4 + pg_catalog + 700 + float4 + pg_catalog + 23 + int4 + pg_catalog + + + implicit + binary + 10046 + 1 + 23 + int4 + pg_catalog + 24 + regproc + pg_catalog + + + implicit + binary + 10050 + 1 + 2202 + regprocedure + pg_catalog + 24 + regproc + pg_catalog + + + implicit + binary + 10042 + 1 + 26 + oid + pg_catalog + 24 + regproc + pg_catalog + + + implicit + function + 10045 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 24 + regproc + pg_catalog + + + implicit + function + 10044 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 24 + regproc + pg_catalog + + + implicit + function + 10127 + 1 + 401 + text + pg_catalog + 1042 + bpchar + pg_catalog + 25 + text + pg_catalog + + + implicit + binary + 10145 + 1 + 194 + pg_node_tree + pg_catalog + 25 + text + pg_catalog + + + implicit + io + 10147 + 1 + 3361 + pg_ndistinct + pg_catalog + 25 + text + pg_catalog + + + assignment + function + 10189 + 1 + 730 + text + pg_catalog + 650 + cidr + pg_catalog + 25 + text + pg_catalog + + + assignment + function + 10190 + 1 + 730 + text + pg_catalog + 869 + inet + pg_catalog + 25 + text + pg_catalog + + + implicit + function + 10131 + 1 + 946 + text + pg_catalog + 18 + char + pg_catalog + 25 + text + pg_catalog + + + implicit + binary + 10129 + 1 + 1043 + varchar + pg_catalog + 25 + text + pg_catalog + + + assignment + binary + 10192 + 1 + 142 + xml + pg_catalog + 25 + text + pg_catalog + + + implicit + io + 10149 + 1 + 3402 + pg_dependencies + pg_catalog + 25 + text + pg_catalog + + + implicit + function + 10134 + 1 + 406 + text + pg_catalog + 19 + name + pg_catalog + 25 + text + pg_catalog + + + assignment + function + 10191 + 1 + 2971 + text + pg_catalog + 16 + bool + pg_catalog + 25 + text + pg_catalog + + + implicit + io + 10151 + 1 + 5017 + pg_mcv_list + pg_catalog + 25 + text + pg_catalog + + + implicit + binary + 10039 + 1 + 23 + int4 + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10119 + 1 + 4089 + regnamespace + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10112 + 1 + 4096 + regrole + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10089 + 1 + 2206 + regtype + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10082 + 1 + 4191 + regcollation + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10075 + 1 + 2205 + regclass + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10043 + 1 + 24 + regproc + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10068 + 1 + 2204 + regoperator + pg_catalog + 26 + oid + pg_catalog + + + implicit + function + 10037 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10059 + 1 + 2203 + regoper + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10052 + 1 + 2202 + regprocedure + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10096 + 1 + 3734 + regconfig + pg_catalog + 26 + oid + pg_catalog + + + implicit + binary + 10103 + 1 + 3769 + regdictionary + pg_catalog + 26 + oid + pg_catalog + + + implicit + function + 10038 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 26 + oid + pg_catalog + + + explicit + function + 10036 + 1 + 5071 + xid + pg_catalog + 5069 + xid8 + pg_catalog + 28 + xid + pg_catalog + + + assignment + io + 10215 + 1 + 3802 + jsonb + pg_catalog + 114 + json + pg_catalog + + + explicit + function + 10203 + 1 + 2896 + xml + pg_catalog + 1042 + bpchar + pg_catalog + 142 + xml + pg_catalog + + + explicit + function + 10193 + 1 + 2896 + xml + pg_catalog + 25 + text + pg_catalog + 142 + xml + pg_catalog + + + explicit + function + 10198 + 1 + 2896 + xml + pg_catalog + 1043 + varchar + pg_catalog + 142 + xml + pg_catalog + + + explicit + function + 10168 + 1 + 1534 + point + pg_catalog + 603 + box + pg_catalog + 600 + point + pg_catalog + + + explicit + function + 10172 + 1 + 1540 + point + pg_catalog + 604 + polygon + pg_catalog + 600 + point + pg_catalog + + + explicit + function + 10176 + 1 + 1416 + point + pg_catalog + 718 + circle + pg_catalog + 600 + point + pg_catalog + + + explicit + function + 10166 + 1 + 1532 + point + pg_catalog + 601 + lseg + pg_catalog + 600 + point + pg_catalog + + + explicit + function + 10169 + 1 + 1541 + lseg + pg_catalog + 603 + box + pg_catalog + 601 + lseg + pg_catalog + + + assignment + function + 10173 + 1 + 1447 + path + pg_catalog + 604 + polygon + pg_catalog + 602 + path + pg_catalog + + + explicit + function + 10177 + 1 + 1480 + box + pg_catalog + 718 + circle + pg_catalog + 603 + box + pg_catalog + + + assignment + function + 10165 + 1 + 4091 + box + pg_catalog + 600 + point + pg_catalog + 603 + box + pg_catalog + + + explicit + function + 10174 + 1 + 1446 + box + pg_catalog + 604 + polygon + pg_catalog + 603 + box + pg_catalog + + + assignment + function + 10170 + 1 + 1448 + polygon + pg_catalog + 603 + box + pg_catalog + 604 + polygon + pg_catalog + + + assignment + function + 10167 + 1 + 1449 + polygon + pg_catalog + 602 + path + pg_catalog + 604 + polygon + pg_catalog + + + explicit + function + 10178 + 1 + 1544 + polygon + pg_catalog + 718 + circle + pg_catalog + 604 + polygon + pg_catalog + + + assignment + function + 10182 + 1 + 1715 + cidr + pg_catalog + 869 + inet + pg_catalog + 650 + cidr + pg_catalog + + + implicit + function + 10002 + 1 + 652 + float4 + pg_catalog + 20 + int8 + pg_catalog + 700 + float4 + pg_catalog + + + assignment + function + 10023 + 1 + 312 + float4 + pg_catalog + 701 + float8 + pg_catalog + 700 + float4 + pg_catalog + + + implicit + function + 10007 + 1 + 236 + float4 + pg_catalog + 21 + int2 + pg_catalog + 700 + float4 + pg_catalog + + + implicit + function + 10028 + 1 + 1745 + float4 + pg_catalog + 1700 + numeric + pg_catalog + 700 + float4 + pg_catalog + + + explicit + function + 10221 + 1 + 3453 + float4 + pg_catalog + 3802 + jsonb + pg_catalog + 700 + float4 + pg_catalog + + + implicit + function + 10012 + 1 + 318 + float4 + pg_catalog + 23 + int4 + pg_catalog + 700 + float4 + pg_catalog + + + implicit + function + 10008 + 1 + 235 + float8 + pg_catalog + 21 + int2 + pg_catalog + 701 + float8 + pg_catalog + + + implicit + function + 10018 + 1 + 311 + float8 + pg_catalog + 700 + float4 + pg_catalog + 701 + float8 + pg_catalog + + + implicit + function + 10003 + 1 + 482 + float8 + pg_catalog + 20 + int8 + pg_catalog + 701 + float8 + pg_catalog + + + explicit + function + 10222 + 1 + 2580 + float8 + pg_catalog + 3802 + jsonb + pg_catalog + 701 + float8 + pg_catalog + + + implicit + function + 10013 + 1 + 316 + float8 + pg_catalog + 23 + int4 + pg_catalog + 701 + float8 + pg_catalog + + + implicit + function + 10029 + 1 + 1746 + float8 + pg_catalog + 1700 + numeric + pg_catalog + 701 + float8 + pg_catalog + + + explicit + function + 10171 + 1 + 1479 + circle + pg_catalog + 603 + box + pg_catalog + 718 + circle + pg_catalog + + + explicit + function + 10175 + 1 + 1474 + circle + pg_catalog + 604 + polygon + pg_catalog + 718 + circle + pg_catalog + + + implicit + function + 10179 + 1 + 4123 + macaddr8 + pg_catalog + 829 + macaddr + pg_catalog + 774 + macaddr8 + pg_catalog + + + assignment + function + 10033 + 1 + 3812 + money + pg_catalog + 20 + int8 + pg_catalog + 790 + money + pg_catalog + + + assignment + function + 10031 + 1 + 3824 + money + pg_catalog + 1700 + numeric + pg_catalog + 790 + money + pg_catalog + + + assignment + function + 10032 + 1 + 3811 + money + pg_catalog + 23 + int4 + pg_catalog + 790 + money + pg_catalog + + + implicit + function + 10180 + 1 + 4124 + macaddr + pg_catalog + 774 + macaddr8 + pg_catalog + 829 + macaddr + pg_catalog + + + implicit + binary + 10181 + 1 + 650 + cidr + pg_catalog + 869 + inet + pg_catalog + + + assignment + binary + 10202 + 1 + 142 + xml + pg_catalog + 1042 + bpchar + pg_catalog + + + assignment + function + 10135 + 1 + 408 + bpchar + pg_catalog + 19 + name + pg_catalog + 1042 + bpchar + pg_catalog + + + implicit + binary + 10130 + 1 + 1043 + varchar + pg_catalog + 1042 + bpchar + pg_catalog + + + assignment + function + 10199 + 1 + 730 + text + pg_catalog + 650 + cidr + pg_catalog + 1042 + bpchar + pg_catalog + + + implicit + function + 10204 + 1 + 668 + bpchar + pg_catalog + 1042 + bpchar + pg_catalog + 1042 + bpchar + pg_catalog + + + assignment + function + 10132 + 1 + 860 + bpchar + pg_catalog + 18 + char + pg_catalog + 1042 + bpchar + pg_catalog + + + implicit + binary + 10125 + 1 + 25 + text + pg_catalog + 1042 + bpchar + pg_catalog + + + assignment + function + 10200 + 1 + 730 + text + pg_catalog + 869 + inet + pg_catalog + 1042 + bpchar + pg_catalog + + + assignment + function + 10201 + 1 + 2971 + text + pg_catalog + 16 + bool + pg_catalog + 1042 + bpchar + pg_catalog + + + implicit + function + 10205 + 1 + 669 + varchar + pg_catalog + 1043 + varchar + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + function + 10196 + 1 + 2971 + text + pg_catalog + 16 + bool + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + function + 10133 + 1 + 946 + text + pg_catalog + 18 + char + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + function + 10136 + 1 + 1401 + varchar + pg_catalog + 19 + name + pg_catalog + 1043 + varchar + pg_catalog + + + implicit + binary + 10126 + 1 + 25 + text + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + binary + 10197 + 1 + 142 + xml + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + function + 10194 + 1 + 730 + text + pg_catalog + 650 + cidr + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + function + 10195 + 1 + 730 + text + pg_catalog + 869 + inet + pg_catalog + 1043 + varchar + pg_catalog + + + implicit + function + 10128 + 1 + 401 + text + pg_catalog + 1042 + bpchar + pg_catalog + 1043 + varchar + pg_catalog + + + assignment + function + 10156 + 1 + 2029 + date + pg_catalog + 1114 + timestamp + pg_catalog + 1082 + date + pg_catalog + + + assignment + function + 10159 + 1 + 1178 + date + pg_catalog + 1184 + timestamptz + pg_catalog + 1082 + date + pg_catalog + + + implicit + function + 10206 + 1 + 1968 + time + pg_catalog + 1083 + time + pg_catalog + 1083 + time + pg_catalog + + + assignment + function + 10157 + 1 + 1316 + time + pg_catalog + 1114 + timestamp + pg_catalog + 1083 + time + pg_catalog + + + assignment + function + 10160 + 1 + 2019 + time + pg_catalog + 1184 + timestamptz + pg_catalog + 1083 + time + pg_catalog + + + assignment + function + 10163 + 1 + 1419 + time + pg_catalog + 1186 + interval + pg_catalog + 1083 + time + pg_catalog + + + assignment + function + 10164 + 1 + 2046 + time + pg_catalog + 1266 + timetz + pg_catalog + 1083 + time + pg_catalog + + + assignment + function + 10161 + 1 + 2027 + timestamp + pg_catalog + 1184 + timestamptz + pg_catalog + 1114 + timestamp + pg_catalog + + + implicit + function + 10207 + 1 + 1961 + timestamp + pg_catalog + 1114 + timestamp + pg_catalog + 1114 + timestamp + pg_catalog + + + implicit + function + 10152 + 1 + 2024 + timestamp + pg_catalog + 1082 + date + pg_catalog + 1114 + timestamp + pg_catalog + + + implicit + function + 10158 + 1 + 2028 + timestamptz + pg_catalog + 1114 + timestamp + pg_catalog + 1184 + timestamptz + pg_catalog + + + implicit + function + 10208 + 1 + 1967 + timestamptz + pg_catalog + 1184 + timestamptz + pg_catalog + 1184 + timestamptz + pg_catalog + + + implicit + function + 10153 + 1 + 1174 + timestamptz + pg_catalog + 1082 + date + pg_catalog + 1184 + timestamptz + pg_catalog + + + implicit + function + 10154 + 1 + 1370 + interval + pg_catalog + 1083 + time + pg_catalog + 1186 + interval + pg_catalog + + + implicit + function + 10209 + 1 + 1200 + interval + pg_catalog + 1186 + interval + pg_catalog + 1186 + interval + pg_catalog + + + implicit + function + 10210 + 1 + 1969 + timetz + pg_catalog + 1266 + timetz + pg_catalog + 1266 + timetz + pg_catalog + + + implicit + function + 10155 + 1 + 2047 + timetz + pg_catalog + 1083 + time + pg_catalog + 1266 + timetz + pg_catalog + + + assignment + function + 10162 + 1 + 1388 + timetz + pg_catalog + 1184 + timestamptz + pg_catalog + 1266 + timetz + pg_catalog + + + explicit + function + 10186 + 1 + 1683 + bit + pg_catalog + 23 + int4 + pg_catalog + 1560 + bit + pg_catalog + + + explicit + function + 10185 + 1 + 2075 + bit + pg_catalog + 20 + int8 + pg_catalog + 1560 + bit + pg_catalog + + + implicit + function + 10211 + 1 + 1685 + bit + pg_catalog + 1560 + bit + pg_catalog + 1560 + bit + pg_catalog + + + implicit + binary + 10184 + 1 + 1562 + varbit + pg_catalog + 1560 + bit + pg_catalog + + + implicit + binary + 10183 + 1 + 1560 + bit + pg_catalog + 1562 + varbit + pg_catalog + + + implicit + function + 10212 + 1 + 1687 + varbit + pg_catalog + 1562 + varbit + pg_catalog + 1562 + varbit + pg_catalog + + + assignment + function + 10024 + 1 + 1743 + numeric + pg_catalog + 701 + float8 + pg_catalog + 1700 + numeric + pg_catalog + + + assignment + function + 10019 + 1 + 1742 + numeric + pg_catalog + 700 + float4 + pg_catalog + 1700 + numeric + pg_catalog + + + implicit + function + 10004 + 1 + 1781 + numeric + pg_catalog + 20 + int8 + pg_catalog + 1700 + numeric + pg_catalog + + + explicit + function + 10217 + 1 + 3449 + numeric + pg_catalog + 3802 + jsonb + pg_catalog + 1700 + numeric + pg_catalog + + + implicit + function + 10009 + 1 + 1782 + numeric + pg_catalog + 21 + int2 + pg_catalog + 1700 + numeric + pg_catalog + + + implicit + function + 10213 + 1 + 1703 + numeric + pg_catalog + 1700 + numeric + pg_catalog + 1700 + numeric + pg_catalog + + + implicit + function + 10014 + 1 + 1740 + numeric + pg_catalog + 23 + int4 + pg_catalog + 1700 + numeric + pg_catalog + + + assignment + function + 10030 + 1 + 3823 + numeric + pg_catalog + 790 + money + pg_catalog + 1700 + numeric + pg_catalog + + + implicit + function + 10054 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 2202 + regprocedure + pg_catalog + + + implicit + binary + 10051 + 1 + 26 + oid + pg_catalog + 2202 + regprocedure + pg_catalog + + + implicit + binary + 10049 + 1 + 24 + regproc + pg_catalog + 2202 + regprocedure + pg_catalog + + + implicit + binary + 10055 + 1 + 23 + int4 + pg_catalog + 2202 + regprocedure + pg_catalog + + + implicit + function + 10053 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 2202 + regprocedure + pg_catalog + + + implicit + binary + 10058 + 1 + 26 + oid + pg_catalog + 2203 + regoper + pg_catalog + + + implicit + function + 10060 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 2203 + regoper + pg_catalog + + + implicit + function + 10061 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 2203 + regoper + pg_catalog + + + implicit + binary + 10062 + 1 + 23 + int4 + pg_catalog + 2203 + regoper + pg_catalog + + + implicit + binary + 10066 + 1 + 2204 + regoperator + pg_catalog + 2203 + regoper + pg_catalog + + + implicit + function + 10070 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 2204 + regoperator + pg_catalog + + + implicit + binary + 10067 + 1 + 26 + oid + pg_catalog + 2204 + regoperator + pg_catalog + + + implicit + function + 10069 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 2204 + regoperator + pg_catalog + + + implicit + binary + 10065 + 1 + 2203 + regoper + pg_catalog + 2204 + regoperator + pg_catalog + + + implicit + binary + 10071 + 1 + 23 + int4 + pg_catalog + 2204 + regoperator + pg_catalog + + + implicit + function + 10109 + 1 + 1079 + regclass + pg_catalog + 25 + text + pg_catalog + 2205 + regclass + pg_catalog + + + implicit + binary + 10078 + 1 + 23 + int4 + pg_catalog + 2205 + regclass + pg_catalog + + + implicit + function + 10077 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 2205 + regclass + pg_catalog + + + implicit + binary + 10074 + 1 + 26 + oid + pg_catalog + 2205 + regclass + pg_catalog + + + implicit + function + 10110 + 1 + 1079 + regclass + pg_catalog + 1043 + varchar + pg_catalog + 2205 + regclass + pg_catalog + + + implicit + function + 10076 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 2205 + regclass + pg_catalog + + + implicit + binary + 10092 + 1 + 23 + int4 + pg_catalog + 2206 + regtype + pg_catalog + + + implicit + function + 10091 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 2206 + regtype + pg_catalog + + + implicit + function + 10090 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 2206 + regtype + pg_catalog + + + implicit + binary + 10088 + 1 + 26 + oid + pg_catalog + 2206 + regtype + pg_catalog + + + implicit + binary + 10099 + 1 + 23 + int4 + pg_catalog + 3734 + regconfig + pg_catalog + + + implicit + function + 10097 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 3734 + regconfig + pg_catalog + + + implicit + binary + 10095 + 1 + 26 + oid + pg_catalog + 3734 + regconfig + pg_catalog + + + implicit + function + 10098 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 3734 + regconfig + pg_catalog + + + implicit + function + 10105 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 3769 + regdictionary + pg_catalog + + + implicit + binary + 10106 + 1 + 23 + int4 + pg_catalog + 3769 + regdictionary + pg_catalog + + + implicit + function + 10104 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 3769 + regdictionary + pg_catalog + + + implicit + binary + 10102 + 1 + 26 + oid + pg_catalog + 3769 + regdictionary + pg_catalog + + + assignment + io + 10214 + 1 + 114 + json + pg_catalog + 3802 + jsonb + pg_catalog + + + implicit + function + 10121 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 4089 + regnamespace + pg_catalog + + + implicit + binary + 10122 + 1 + 23 + int4 + pg_catalog + 4089 + regnamespace + pg_catalog + + + implicit + binary + 10118 + 1 + 26 + oid + pg_catalog + 4089 + regnamespace + pg_catalog + + + implicit + function + 10120 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 4089 + regnamespace + pg_catalog + + + implicit + binary + 10111 + 1 + 26 + oid + pg_catalog + 4096 + regrole + pg_catalog + + + implicit + binary + 10115 + 1 + 23 + int4 + pg_catalog + 4096 + regrole + pg_catalog + + + implicit + function + 10114 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 4096 + regrole + pg_catalog + + + implicit + function + 10113 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 4096 + regrole + pg_catalog + + + implicit + function + 10084 + 1 + 313 + int4 + pg_catalog + 21 + int2 + pg_catalog + 4191 + regcollation + pg_catalog + + + implicit + function + 10083 + 1 + 1287 + oid + pg_catalog + 20 + int8 + pg_catalog + 4191 + regcollation + pg_catalog + + + implicit + binary + 10081 + 1 + 26 + oid + pg_catalog + 4191 + regcollation + pg_catalog + + + implicit + binary + 10085 + 1 + 23 + int4 + pg_catalog + 4191 + regcollation + pg_catalog + + + explicit + function + 10223 + 1 + 4281 + int4multirange + pg_catalog + 3904 + int4range + pg_catalog + 4451 + int4multirange + pg_catalog + + + explicit + function + 10225 + 1 + 4284 + nummultirange + pg_catalog + 3906 + numrange + pg_catalog + 4532 + nummultirange + pg_catalog + + + explicit + function + 10227 + 1 + 4287 + tsmultirange + pg_catalog + 3908 + tsrange + pg_catalog + 4533 + tsmultirange + pg_catalog + + + explicit + function + 10228 + 1 + 4290 + tstzmultirange + pg_catalog + 3910 + tstzrange + pg_catalog + 4534 + tstzmultirange + pg_catalog + + + explicit + function + 10226 + 1 + 4293 + datemultirange + pg_catalog + 3912 + daterange + pg_catalog + 4535 + datemultirange + pg_catalog + + + explicit + function + 10224 + 1 + 4296 + int8multirange + pg_catalog + 3926 + int8range + pg_catalog + 4536 + int8multirange + pg_catalog + + + pg_graphql: GraphQL support + 18182 + 1760 + 1.5.11 + 17167 + graphql + 18183 +18184 +18185 +18186 +18187 +18188 +18189 +18190 +18191 +18192 + + + 1.4 +1.8 +1.9 +1.5 +1.6 +1.7 + track planning and execution statistics of all SQL statements executed + 17484 + 1143 + 1.10 + 17166 + extensions + 17491 +17498 +17499 +17509 +17510 + + + cryptographic functions + 17515 + 1145 + 1.3 + 17166 + extensions + 17516 +17517 +17518 +17519 +17520 +17521 +17522 +17523 +17524 +17525 +17526 +17527 +17528 +17529 +17530 +17531 +17532 +17533 +17534 +17535 +17536 +17537 +17538 +17539 +17540 +17541 +17542 +17543 +17544 +17545 +17546 +17547 +17548 +17549 +17550 +17551 + + + JSON Web Token API for Postgresql + 17552 + 1147 + 0.2.0 + 17166 + extensions + 17553 +17554 +17555 +17556 +17557 +17558 + + + Pgsodium is a modern cryptography library for Postgres. + 17171 + 1135 + 3.1.8 + 17170 + pgsodium + 17172 +17173 +17174 +17175 +17176 +17177 +17178 +17179 +17180 +17181 +17182 +17183 +17186 +17188 +17189 +17190 +17193 +17195 +17196 +17197 +17198 +17199 +17200 +17201 +17202 +17203 +17204 +17205 +17209 +17210 +17211 +17212 +17215 +17216 +17217 +17218 +17219 +17220 +17221 +17222 +17223 +17224 +17225 +17226 +17227 +17228 +17229 +17230 +17231 +17232 +17233 +17234 +17235 +17236 +17237 +17238 +17239 +17240 +17241 +17242 +17243 +17244 +17245 +17246 +17247 +17248 +17249 +17250 +17251 +17252 +17253 +17254 +17255 +17256 +17257 +17258 +17259 +17260 +17261 +17262 +17263 +17264 +17265 +17266 +17267 +17268 +17269 +17270 +17271 +17272 +17273 +17274 +17275 +17276 +17277 +17280 +17283 +17284 +17285 +17286 +17287 +17288 +17289 +17290 +17291 +17294 +17295 +17297 +17306 +17311 +17312 +17335 +17336 +17337 +17338 +17339 +17340 +17341 +17342 +17348 +17349 +17350 +17351 +17352 +17353 +17354 +17416 +17420 +17421 +17422 +17423 +17424 +17425 +17426 +17427 +17428 +17429 +17430 +17431 +17432 +17437 +17442 +17452 +17453 +17454 +17455 +17456 +17457 +17458 +17459 +17461 +17462 +17467 +17469 + + + PL/pgSQL procedural language + 13560 + 677 + 1.0 + 11 + pg_catalog + 13561 +13562 +13563 +13564 + + + Supabase Vault Extension + 17559 + 1149 + 0.3.1 + 17473 + vault + 17560 +17561 +17562 +17563 +17576 +17580 +17581 + + + generate universally unique identifiers (UUIDs) + 17582 + 1152 + 1.1 + 17166 + extensions + 17583 +17584 +17585 +17586 +17587 +17588 +17589 +17590 +17591 +17592 + + + dynamically-loaded C functions + 13 + 1 + fmgr_c_validator + pg_catalog + + + built-in functions + 12 + 1 + fmgr_internal_validator + pg_catalog + + + PL/pgSQL procedural language + plpgsql_call_handler + pg_catalog + plpgsql_inline_handler + pg_catalog + 13564 + 677 + 1 + plpgsql_validator + pg_catalog + + + SQL-language functions + 14 + 1 + 1 + fmgr_sql_validator + pg_catalog + + + 17165 + 1690 + supabase_admin + + + 17166 + 1672 + postgres + + + 17167 + 1760 + supabase_admin + + + 17168 + 1760 + supabase_admin + + + 13208 + 523 + supabase_admin + + + system catalog schema + 11 + 517 + supabase_admin + + + 17169 + 1133 + pgbouncer + + + 17170 + 1135 + supabase_admin + + + 17294 + 1135 + supabase_admin + + + standard public schema + 1 + 17808||16384|d|G +17808||16478|d|G +17808||16479|d|G +17808||16480|d|G +17808||16384|a|G +17808||16478|a|G +17808||16479|a|G +17808||16480|a|G +17808||16384|x|G +17808||16478|x|G +17808||16479|x|G +17808||16480|x|G +17808||16384|r|G +17808||16478|r|G +17808||16479|r|G +17808||16480|r|G +17808||16384|t|G +17808||16478|t|G +17808||16479|t|G +17808||16480|t|G +17808||16384|D|G +17808||16478|D|G +17808||16479|D|G +17808||16480|D|G +17808||16384|w|G +17808||16478|w|G +17808||16479|w|G +17808||16480|w|G +17813||16384|d|G +17813||16478|d|G +17813||16479|d|G +17813||16480|d|G +17813||16384|a|G +17813||16478|a|G +17813||16479|a|G +17813||16480|a|G +17813||16384|x|G +17813||16478|x|G +17813||16479|x|G +17813||16480|x|G +17813||16384|r|G +17813||16478|r|G +17813||16479|r|G +17813||16480|r|G +17813||16384|t|G +17813||16478|t|G +17813||16479|t|G +17813||16480|t|G +17813||16384|D|G +17813||16478|D|G +17813||16479|D|G +17813||16480|D|G +17813||16384|w|G +17813||16478|w|G +17813||16479|w|G +17813||16480|w|G +17818||16384|d|G +17818||16478|d|G +17818||16479|d|G +17818||16480|d|G +17818||16384|a|G +17818||16478|a|G +17818||16479|a|G +17818||16480|a|G +17818||16384|x|G +17818||16478|x|G +17818||16479|x|G +17818||16480|x|G +17818||16384|r|G +17818||16478|r|G +17818||16479|r|G +17818||16480|r|G +17818||16384|t|G +17818||16478|t|G +17818||16479|t|G +17818||16480|t|G +17818||16384|D|G +17818||16478|D|G +17818||16479|D|G +17818||16480|D|G +17818||16384|w|G +17818||16478|w|G +17818||16479|w|G +17818||16480|w|G +17824||16384|d|G +17824||16478|d|G +17824||16479|d|G +17824||16480|d|G +17824||16384|a|G +17824||16478|a|G +17824||16479|a|G +17824||16480|a|G +17824||16384|x|G +17824||16478|x|G +17824||16479|x|G +17824||16480|x|G +17824||16384|r|G +17824||16478|r|G +17824||16479|r|G +17824||16480|r|G +17824||16384|t|G +17824||16478|t|G +17824||16479|t|G +17824||16480|t|G +17824||16384|D|G +17824||16478|D|G +17824||16479|D|G +17824||16480|D|G +17824||16384|w|G +17824||16478|w|G +17824||16479|w|G +17824||16480|w|G +38092||16384|d|G +38092||16478|d|G +38092||16479|d|G +38092||16480|d|G +38092||16384|a|G +38092||16478|a|G +38092||16479|a|G +38092||16480|a|G +38092||16384|x|G +38092||16478|x|G +38092||16479|x|G +38092||16480|x|G +38092||16384|r|G +38092||16478|r|G +38092||16479|r|G +38092||16480|r|G +38092||16384|t|G +38092||16478|t|G +38092||16479|t|G +38092||16480|t|G +38092||16384|D|G +38092||16478|D|G +38092||16479|D|G +38092||16480|D|G +38092||16384|w|G +38092||16478|w|G +38092||16479|w|G +38092||16480|w|G + 1900 + 2025-05-11.06:20:22 + 2200 + 1443 + pg_database_owner + + + 17471 + 1697 + supabase_admin + + + 17472 + 1673 + supabase_admin + + + 17473 + 1746 + supabase_admin + + + ddl_command_end + 18188 + 1760 + 18186 + + + sql_drop + 18189 + 1760 + 18186 + + + sql_drop + 18155 + 1728 + DROP EXTENSION + 17681 + + + ddl_command_end + 18193 + 1763 + CREATE EXTENSION + 17676 + + + ddl_command_end + 18154 + 1724 + CREATE FUNCTION + 17677 + + + ddl_command_end + 18147 + 1595 + CREATE EXTENSION + 17678 + + + ddl_command_end + 18156 + 1733 + 17679 + + + sql_drop + 18157 + 1735 + 17680 + + + ddl_command_end + 17469 + 1668 + SECURITY LABEL +ALTER TABLE + 17353 + + + 17808 + 1549 + 2 + postgres +
+ + 38092 + 1891 + 2 + postgres +
+ + 17813 + 1892 + 2 + postgres +
+ + 17818 + 1551 + 2 + postgres +
+ + 17824 + 1893 + 2 + postgres +
+ + 1 + 1 + 1281 + varchar(255)|0s + 1043 + + + 1 + 2 + 1281 + text|0s + 25 + + + 3 + 1281 + timestamp(6)|0s + 1114 + + + 4 + 1281 + varchar(255)|0s + 1043 + + + 1 + 5 + 1281 + varchar(255)|0s + 1043 + + + 1 + 6 + 1281 + varchar(255)|0s + 1043 + + + parent_comment_id + 18068 + 1408 + 1 + 17808 + + + post_id + 18078 + 1410 + 1 + 17813 + + + user_id + 18073 + 1409 + 1 + 17824 + + + comment_id + 1 + 17931 + 1 + 1332 + 1 + 403 + default + 100 + pg_catalog + + + 1 + 17932 + 1 + 1332 + 17931 + + + type + 38095 + (type)::text = ANY ((ARRAY['IMAGE'::character varying, 'VIDEO'::character varying])::text[]) + 1889 + + + 1 + 1 + 1889 + varchar(255)|0s + 1043 + + + 1 + 2 + 1889 + varchar(255)|0s + 1043 + + + 1 + 3 + 1889 + varchar(255)|0s + 1043 + + + 4 + 1889 + varchar(255)|0s + 1043 + + + post_id + 38100 + 1891 + 1 + 17813 + + + id + 1 + 38098 + 1 + 1889 + 1 + 403 + default + 100 + pg_catalog + + + 1 + 38099 + 1 + 1889 + 38098 + + + 1 + 1 + 1283 + varchar(255)|0s + 1043 + + + 3 + 1283 + timestamp(6)|0s + 1114 + + + 1 + 4 + 1283 + varchar(255)|0s + 1043 + + + 5 + 1892 + text|0s + 25 + + + user_id + 18063 + 1407 + 1 + 17824 + + + post_id + 1 + 17933 + 1 + 1333 + 1 + 403 + default + 100 + pg_catalog + + + 1 + 17934 + 1 + 1333 + 17933 + + + type + 17821 + (type)::text = ANY (ARRAY[('LIKE'::character varying)::text, ('LOVE'::character varying)::text, ('HAHA'::character varying)::text, ('WOW'::character varying)::text, ('SAD'::character varying)::text, ('ANGRY'::character varying)::text]) + 1285 + + + 1 + 1 + 1285 + varchar(255)|0s + 1043 + + + 1 + 2 + 1285 + varchar(255)|0s + 1043 + + + 1 + 3 + 1285 + varchar(255)|0s + 1043 + + + 1 + 4 + 1285 + varchar(255)|0s + 1043 + + + post_id + 18083 + 1411 + 1 + 17813 + + + user_id + 18088 + 1412 + 1 + 17824 + + + reaction_id + 1 + 17935 + 1 + 1334 + 1 + 403 + default + 100 + pg_catalog + + + post_id +user_id + 17937 + 1335 + 1 + 403 + 100 +100 + default +default + pg_catalog +pg_catalog + + + 1 + 17936 + 1 + 1334 + 17935 + + + 17938 + 1335 + 17937 + + + 1 + 1 + 1287 + varchar(255)|0s + 1043 + + + 1 + 2 + 1287 + varchar(255)|0s + 1043 + + + 3 + 1814 + varchar(255)|0s + 1043 + + + 4 + 1815 + varchar(255)|0s + 1043 + + + 5 + 1859 + varchar(255)|0s + 1043 + + + 6 + 1893 + varchar(255)|0s + 1043 + + + user_id + 1 + 17941 + 1 + 1337 + 1 + 403 + default + 100 + pg_catalog + + + username + 17939 + 1336 + 1 + 403 + default + 100 + pg_catalog + + + email + 31460 + 1861 + 1 + 403 + default + 100 + pg_catalog + + + 1 + 17942 + 1 + 1337 + 17941 + + + 17940 + 1336 + 17939 + + + 31461 + 1861 + 31460 + +
+
\ No newline at end of file diff --git a/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ.meta b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ.meta new file mode 100644 index 0000000..5b99209 --- /dev/null +++ b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ.meta @@ -0,0 +1 @@ +#n:postgres \ No newline at end of file diff --git a/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta new file mode 100644 index 0000000..1ff3db2 --- /dev/null +++ b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta @@ -0,0 +1,2 @@ +#n:information_schema +! [null, 0, null, null, -2147483648, -2147483648] diff --git a/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta new file mode 100644 index 0000000..44e65b1 --- /dev/null +++ b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta @@ -0,0 +1,2 @@ +#n:pg_catalog +! [null, 0, null, null, -2147483648, -2147483648] diff --git a/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/public.abK9xQ.meta b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/public.abK9xQ.meta new file mode 100644 index 0000000..1fa8b6c --- /dev/null +++ b/.idea/dataSources/1d7d931b-4a53-4a75-8fda-59484c44f07d/storage_v2/_src_/database/postgres.edMnLQ/schema/public.abK9xQ.meta @@ -0,0 +1,2 @@ +#n:public +! [1900, 0, null, null, -2147483648, -2147483648] diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 22f0805..1811883 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -5,11 +5,11 @@