├── .github └── ISSUE_TEMPLATE │ ├── relatório-de-bug.md │ └── sugestão-de-funcionalidade.md ├── .gitignore ├── API ├── .mvn │ └── wrapper │ │ └── maven-wrapper.properties ├── README.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src │ ├── main │ ├── java │ │ └── br │ │ │ └── com │ │ │ └── opengotchi │ │ │ └── api │ │ │ ├── ApiApplication.java │ │ │ ├── Config │ │ │ └── Exception │ │ │ │ ├── Gotchi │ │ │ │ └── GotchiNaoEncontradoExeption.java │ │ │ │ └── SecureSave │ │ │ │ └── SecureSaveException.java │ │ │ ├── Model │ │ │ └── Gotchi │ │ │ │ ├── Gotchi.java │ │ │ │ ├── Needs.java │ │ │ │ ├── Physical.java │ │ │ │ └── Skills.java │ │ │ ├── Repository │ │ │ ├── ColorRepository.java │ │ │ ├── GotchiRepository.java │ │ │ └── PersonalityRepository.java │ │ │ └── Util │ │ │ ├── DataLoader │ │ │ ├── ColorDataLoader.java │ │ │ └── PersonalityDataLoader.java │ │ │ ├── List │ │ │ ├── GenderList.java │ │ │ └── LifeStageList.java │ │ │ └── Model │ │ │ ├── Color.java │ │ │ ├── Personality.java │ │ │ └── Response.java │ └── resources │ │ ├── application-dev.properties │ │ ├── application-prod.properties │ │ └── application.properties │ └── test │ └── java │ └── br │ └── com │ └── opengotchi │ └── api │ └── ApiApplicationTests.java ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md └── SECURITY.md /.github/ISSUE_TEMPLATE/relatório-de-bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Relatório de Bug 3 | about: Crie um relatório para nos ajudar a melhorar 4 | title: "[BUG] Descreva brevemente o bug'" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Descrição do Bug** 11 | Uma descrição clara e concisa do que o bug é. 12 | 13 | **Para Reproduzir** 14 | Passos para reproduzir o comportamento: 15 | 1. Vá para '...' 16 | 2. Clique em '....' 17 | 3. Role para baixo até '....' 18 | 4. Veja o erro 19 | 20 | **Comportamento Esperado** 21 | Uma descrição clara e concisa do que você esperava que acontecesse. 22 | 23 | **Capturas de Tela** 24 | Se aplicável, adicione capturas de tela para ajudar a explicar seu problema. 25 | 26 | **Ambiente (preencha as seguintes informações):** 27 | - SO: [e.g. Windows, MacOS] 28 | - Navegador [e.g. Chrome, Safari] 29 | - Versão [e.g. 22] 30 | 31 | **Informações Adicionais** 32 | Adicione qualquer outra informação sobre o problema aqui. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/sugestão-de-funcionalidade.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Sugestão de Funcionalidade 3 | about: Sugira uma ideia para este projeto 4 | title: "[FEATURE] Descreva brevemente a sugestão" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Sua solicitação de funcionalidade está relacionada a um problema? Por favor descreva.** 11 | Uma descrição clara e concisa de qual é o problema. Ex. Eu sempre fico frustrado quando [...] 12 | 13 | **Descreva a solução que você gostaria** 14 | Uma descrição clara e concisa do que você gostaria que acontecesse. 15 | 16 | **Descreva as alternativas que você considerou** 17 | Uma descrição clara e concisa de qualquer solução ou funcionalidade alternativa que você tenha considerado. 18 | 19 | **Informações Adicionais** 20 | Adicione qualquer outra informação ou capturas de tela sobre a solicitação de funcionalidade aqui. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Padrões Gerais 2 | *.class 3 | *.log 4 | *.ctxt 5 | *.mtj.tmp/ 6 | hs_err_pid* 7 | replay_pid* 8 | 9 | # Artefatos de Build 10 | target/ 11 | build/ 12 | dist/ 13 | out/ 14 | 15 | # Dependências e Configurações 16 | .gradle/ 17 | .idea/ 18 | .mvn/ 19 | .settings/ 20 | .project 21 | .classpath 22 | .factorypath 23 | .metadata 24 | .vscode/ 25 | 26 | # IDEs e Editores 27 | *.iws 28 | *.iml 29 | *.ipr 30 | .apt_generated 31 | .springBeans 32 | .sts4-cache 33 | 34 | # NetBeans 35 | /nbproject/private/ 36 | /nbbuild/ 37 | /nbdist/ 38 | /.nb-gradle/ 39 | 40 | # Arquivos de Pacote (opcional, descomentar se necessário) 41 | *.jar 42 | *.war 43 | *.nar 44 | *.ear 45 | *.zip 46 | *.tar.gz 47 | *.rar 48 | *.env 49 | -------------------------------------------------------------------------------- /API/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | wrapperVersion=3.3.1 18 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip 19 | -------------------------------------------------------------------------------- /API/README.md: -------------------------------------------------------------------------------- 1 | # Endpoints da API - Opengotchi (V1.0) 2 | 3 | ## Base URL 4 | - **GET** /api/v1 5 | - Retorna uma mensagem de boas-vindas. 6 | - **Response** 7 | - **200 OK** 8 | ```json 9 | { 10 | "msg": "Olá, eu sou o OpenGotchi! É um prazer te conhecer!" 11 | } 12 | ``` 13 | ## Ambiente 14 | - **GET** /api/v1/environment 15 | - Retorna uma mensagem indicando o ambiente atual (desenvolvimento ou produção). 16 | - **Response** 17 | - **200 OK** 18 | ```json 19 | { 20 | "msg": "Você está no ambiente de desenvolvimento!" 21 | } 22 | ``` 23 | ou 24 | ```json 25 | { 26 | "msg": "Você está no ambiente de produção!" 27 | } 28 | ``` 29 | ## Usuário 30 | - **GET** /api/v1/usuario 31 | - Retorna uma lista com informações básicas dos usuários da aplicação. 32 | - **Response** 33 | - **200 OK** 34 | ```json 35 | { 36 | "id": 1, 37 | "nome": "Bill Gates" 38 | }, 39 | { 40 | "id": 2, 41 | "nome": "Mark Zuckerberg" 42 | } 43 | ``` 44 | - **GET** /api/v1/usuario/{id} 45 | - Retorna uma lista com informações públicas de um usuário da aplicação. 46 | - **Response** 47 | - **200 OK** 48 | ```json 49 | { 50 | "id": 1, 51 | "nome": "Bill Gates", 52 | "email": "flYepUYI5dAFeXxvk12AZZAmVQNKNf2mT3qD8jeaD7w=", 53 | "ultima_entrada": "2024-09-27T14:57:46.562865Z", 54 | "ultima_atualizacao": "2024-09-27T14:57:46.562865Z", 55 | "criado_em": "2024-09-27T14:57:46.562865Z" 56 | } 57 | ``` 58 | - **404 NOT FOUND** 59 | ```json 60 | { 61 | "msg": "Usuário não encontrado com o id: {id}" 62 | } 63 | ``` 64 | - **GET** /api/v1/usuario/email/{email} 65 | - Retorna uma lista com informações públicas de um usuário da aplicação. 66 | - **Response** 67 | - **200 OK** 68 | ```json 69 | { 70 | "id": 1, 71 | "nome": "Bill Gates", 72 | "email": "flYepUYI5dAFeXxvk12AZZAmVQNKNf2mT3qD8jeaD7w=", 73 | "ultima_entrada": "2024-09-27T14:57:46.562865Z", 74 | "ultima_atualizacao": "2024-09-27T14:57:46.562865Z", 75 | "criado_em": "2024-09-27T14:57:46.562865Z" 76 | } 77 | ``` 78 | - **404 NOT FOUND** 79 | ```json 80 | { 81 | "msg": "Usuário não encontrado com o email: {email}" 82 | } 83 | ``` 84 | - **POST** /api/v1/usuario 85 | - Cria um novo usuário na aplicação. 86 | - **Request** 87 | ```json 88 | { 89 | "nome" : "Mark Zuckerberg", 90 | "email": "zuck@fb.com", 91 | "senha": "iLoveElonM!" 92 | } 93 | ``` 94 | - **Response** 95 | - **200 OK** 96 | ```json 97 | { 98 | "id": 1, 99 | "nome": "Mark Zuckerberg", 100 | "email": "uZS+VmYqZyGkUXYuhB3UEtUv60IV3SLQBvkWzhrqVVU=", 101 | "ultima_entrada": "2024-09-27T15:16:24.668005200Z", 102 | "ultima_atualizacao": "2024-09-27T15:16:24.668005200Z", 103 | "criado_em": "2024-09-27T15:16:24.668005200Z" 104 | } 105 | ``` 106 | - **409 CONFLICT** 107 | ```json 108 | { 109 | "msg": "Usuário já existente com o email fornecido" 110 | } 111 | ``` 112 | - **Request** 113 | ```json 114 | { 115 | "nome" : "Mark Zuckerberg", 116 | "email": "zuck@fb.com" 117 | } 118 | ``` 119 | - **Response** 120 | - **400 BAD REQUEST** 121 | ```json 122 | { 123 | "msg": "Usuário faltando atributos obrigatórios" 124 | } 125 | ``` 126 | - **GET** /api/v1/usuario/login/{email}/{senha} 127 | - Retorna um long com o id do usuário que fez login. 128 | - **Response** 129 | - **200 OK** 130 | ```json 131 | { 132 | "id": 1 133 | } 134 | ``` 135 | - **404 NOT FOUND** 136 | ```json 137 | { 138 | "msg": "E-mail ou senha incorretos" 139 | } 140 | ``` 141 | - **PUT** /api/v1/usuario/{id} 142 | - Atualiza as informações de um usuário existente com base no {id}. 143 | - **Request** 144 | ```json 145 | { 146 | "nome" : "Steve Jobs", 147 | "email": "steve@apple.com", 148 | "senha": "appleForever!" 149 | } 150 | ``` 151 | Ou, se apenas alguns campos forem atualizados: 152 | ```json 153 | { 154 | "nome" : "Steve Jobs" 155 | } 156 | ``` 157 | - **Response** 158 | - **200 OK** 159 | ```json 160 | { 161 | "id": 1, 162 | "nome": "Steve Jobs", 163 | "email": "bXhbjvbYgRkR1TloYUVBgtIn60NZh1Asf25wZpgh6lw=", 164 | "ultima_entrada": "2024-09-27T15:16:24.668005200Z", 165 | "ultima_atualizacao": "2024-09-27T15:45:35.668005200Z", 166 | "criado_em": "2024-09-27T15:16:24.668005200Z" 167 | } 168 | ``` 169 | - **404 NOT FOUND** 170 | ```json 171 | { 172 | "msg": "Usuário não encontrado com o id: {id}" 173 | } 174 | ``` 175 | - **409 CONFLICT** 176 | ```json 177 | { 178 | "msg": "Email já está em uso" 179 | } 180 | ``` 181 | - **400 BAD REQUEST** 182 | ```json 183 | { 184 | "msg": "Usuário faltando atributos obrigatórios" 185 | } 186 | ``` 187 | - **DELETE** /api/v1/usuario/{id} 188 | - Deleta um usuário existente com base no {id}. 189 | - **Response** 190 | - **200 OK** 191 | ```json 192 | { 193 | "msg": "Usuário deletado com sucesso" 194 | } 195 | ``` 196 | - **404 NOT FOUND** 197 | ```json 198 | { 199 | "msg": "Usuário não encontrado com o id: {id}" 200 | } 201 | ``` -------------------------------------------------------------------------------- /API/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Apache Maven Wrapper startup batch script, version 3.3.1 23 | # 24 | # Optional ENV vars 25 | # ----------------- 26 | # JAVA_HOME - location of a JDK home dir, required when download maven via java source 27 | # MVNW_REPOURL - repo url base for downloading maven distribution 28 | # MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven 29 | # MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output 30 | # ---------------------------------------------------------------------------- 31 | 32 | set -euf 33 | [ "${MVNW_VERBOSE-}" != debug ] || set -x 34 | 35 | # OS specific support. 36 | native_path() { printf %s\\n "$1"; } 37 | case "$(uname)" in 38 | CYGWIN* | MINGW*) 39 | [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" 40 | native_path() { cygpath --path --windows "$1"; } 41 | ;; 42 | esac 43 | 44 | # set JAVACMD and JAVACCMD 45 | set_java_home() { 46 | # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched 47 | if [ -n "${JAVA_HOME-}" ]; then 48 | if [ -x "$JAVA_HOME/jre/sh/java" ]; then 49 | # IBM's JDK on AIX uses strange locations for the executables 50 | JAVACMD="$JAVA_HOME/jre/sh/java" 51 | JAVACCMD="$JAVA_HOME/jre/sh/javac" 52 | else 53 | JAVACMD="$JAVA_HOME/bin/java" 54 | JAVACCMD="$JAVA_HOME/bin/javac" 55 | 56 | if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then 57 | echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 58 | echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 59 | return 1 60 | fi 61 | fi 62 | else 63 | JAVACMD="$( 64 | 'set' +e 65 | 'unset' -f command 2>/dev/null 66 | 'command' -v java 67 | )" || : 68 | JAVACCMD="$( 69 | 'set' +e 70 | 'unset' -f command 2>/dev/null 71 | 'command' -v javac 72 | )" || : 73 | 74 | if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then 75 | echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 76 | return 1 77 | fi 78 | fi 79 | } 80 | 81 | # hash string like Java String::hashCode 82 | hash_string() { 83 | str="${1:-}" h=0 84 | while [ -n "$str" ]; do 85 | char="${str%"${str#?}"}" 86 | h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) 87 | str="${str#?}" 88 | done 89 | printf %x\\n $h 90 | } 91 | 92 | verbose() { :; } 93 | [ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } 94 | 95 | die() { 96 | printf %s\\n "$1" >&2 97 | exit 1 98 | } 99 | 100 | # parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties 101 | while IFS="=" read -r key value; do 102 | case "${key-}" in 103 | distributionUrl) distributionUrl="${value-}" ;; 104 | distributionSha256Sum) distributionSha256Sum="${value-}" ;; 105 | esac 106 | done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" 107 | [ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" 108 | 109 | case "${distributionUrl##*/}" in 110 | maven-mvnd-*bin.*) 111 | MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ 112 | case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in 113 | *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; 114 | :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; 115 | :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; 116 | :Linux*x86_64*) distributionPlatform=linux-amd64 ;; 117 | *) 118 | echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 119 | distributionPlatform=linux-amd64 120 | ;; 121 | esac 122 | distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" 123 | ;; 124 | maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; 125 | *) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; 126 | esac 127 | 128 | # apply MVNW_REPOURL and calculate MAVEN_HOME 129 | # maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ 130 | [ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" 131 | distributionUrlName="${distributionUrl##*/}" 132 | distributionUrlNameMain="${distributionUrlName%.*}" 133 | distributionUrlNameMain="${distributionUrlNameMain%-bin}" 134 | MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" 135 | 136 | exec_maven() { 137 | unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : 138 | exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" 139 | } 140 | 141 | if [ -d "$MAVEN_HOME" ]; then 142 | verbose "found existing MAVEN_HOME at $MAVEN_HOME" 143 | exec_maven "$@" 144 | fi 145 | 146 | case "${distributionUrl-}" in 147 | *?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; 148 | *) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; 149 | esac 150 | 151 | # prepare tmp dir 152 | if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then 153 | clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } 154 | trap clean HUP INT TERM EXIT 155 | else 156 | die "cannot create temp dir" 157 | fi 158 | 159 | mkdir -p -- "${MAVEN_HOME%/*}" 160 | 161 | # Download and Install Apache Maven 162 | verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." 163 | verbose "Downloading from: $distributionUrl" 164 | verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" 165 | 166 | # select .zip or .tar.gz 167 | if ! command -v unzip >/dev/null; then 168 | distributionUrl="${distributionUrl%.zip}.tar.gz" 169 | distributionUrlName="${distributionUrl##*/}" 170 | fi 171 | 172 | # verbose opt 173 | __MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' 174 | [ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v 175 | 176 | # normalize http auth 177 | case "${MVNW_PASSWORD:+has-password}" in 178 | '') MVNW_USERNAME='' MVNW_PASSWORD='' ;; 179 | has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; 180 | esac 181 | 182 | if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then 183 | verbose "Found wget ... using wget" 184 | wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" 185 | elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then 186 | verbose "Found curl ... using curl" 187 | curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" 188 | elif set_java_home; then 189 | verbose "Falling back to use Java to download" 190 | javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" 191 | targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" 192 | cat >"$javaSource" <<-END 193 | public class Downloader extends java.net.Authenticator 194 | { 195 | protected java.net.PasswordAuthentication getPasswordAuthentication() 196 | { 197 | return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); 198 | } 199 | public static void main( String[] args ) throws Exception 200 | { 201 | setDefault( new Downloader() ); 202 | java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); 203 | } 204 | } 205 | END 206 | # For Cygwin/MinGW, switch paths to Windows format before running javac and java 207 | verbose " - Compiling Downloader.java ..." 208 | "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" 209 | verbose " - Running Downloader.java ..." 210 | "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" 211 | fi 212 | 213 | # If specified, validate the SHA-256 sum of the Maven distribution zip file 214 | if [ -n "${distributionSha256Sum-}" ]; then 215 | distributionSha256Result=false 216 | if [ "$MVN_CMD" = mvnd.sh ]; then 217 | echo "Checksum validation is not supported for maven-mvnd." >&2 218 | echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 219 | exit 1 220 | elif command -v sha256sum >/dev/null; then 221 | if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then 222 | distributionSha256Result=true 223 | fi 224 | elif command -v shasum >/dev/null; then 225 | if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then 226 | distributionSha256Result=true 227 | fi 228 | else 229 | echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 230 | echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 231 | exit 1 232 | fi 233 | if [ $distributionSha256Result = false ]; then 234 | echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 235 | echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 236 | exit 1 237 | fi 238 | fi 239 | 240 | # unzip and move 241 | if command -v unzip >/dev/null; then 242 | unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" 243 | else 244 | tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" 245 | fi 246 | printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" 247 | mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" 248 | 249 | clean || : 250 | exec_maven "$@" 251 | -------------------------------------------------------------------------------- /API/mvnw.cmd: -------------------------------------------------------------------------------- 1 | <# : batch portion 2 | @REM ---------------------------------------------------------------------------- 3 | @REM Licensed to the Apache Software Foundation (ASF) under one 4 | @REM or more contributor license agreements. See the NOTICE file 5 | @REM distributed with this work for additional information 6 | @REM regarding copyright ownership. The ASF licenses this file 7 | @REM to you under the Apache License, Version 2.0 (the 8 | @REM "License"); you may not use this file except in compliance 9 | @REM with the License. You may obtain a copy of the License at 10 | @REM 11 | @REM https://www.apache.org/licenses/LICENSE-2.0 12 | @REM 13 | @REM Unless required by applicable law or agreed to in writing, 14 | @REM software distributed under the License is distributed on an 15 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | @REM KIND, either express or implied. See the License for the 17 | @REM specific language governing permissions and limitations 18 | @REM under the License. 19 | @REM ---------------------------------------------------------------------------- 20 | 21 | @REM ---------------------------------------------------------------------------- 22 | @REM Apache Maven Wrapper startup batch script, version 3.3.1 23 | @REM 24 | @REM Optional ENV vars 25 | @REM MVNW_REPOURL - repo url base for downloading maven distribution 26 | @REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven 27 | @REM MVNW_VERBOSE - true: enable verbose log; others: silence the output 28 | @REM ---------------------------------------------------------------------------- 29 | 30 | @IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) 31 | @SET __MVNW_CMD__= 32 | @SET __MVNW_ERROR__= 33 | @SET __MVNW_PSMODULEP_SAVE=%PSModulePath% 34 | @SET PSModulePath= 35 | @FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( 36 | IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) 37 | ) 38 | @SET PSModulePath=%__MVNW_PSMODULEP_SAVE% 39 | @SET __MVNW_PSMODULEP_SAVE= 40 | @SET __MVNW_ARG0_NAME__= 41 | @SET MVNW_USERNAME= 42 | @SET MVNW_PASSWORD= 43 | @IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) 44 | @echo Cannot start maven from wrapper >&2 && exit /b 1 45 | @GOTO :EOF 46 | : end batch / begin powershell #> 47 | 48 | $ErrorActionPreference = "Stop" 49 | if ($env:MVNW_VERBOSE -eq "true") { 50 | $VerbosePreference = "Continue" 51 | } 52 | 53 | # calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties 54 | $distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl 55 | if (!$distributionUrl) { 56 | Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" 57 | } 58 | 59 | switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { 60 | "maven-mvnd-*" { 61 | $USE_MVND = $true 62 | $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" 63 | $MVN_CMD = "mvnd.cmd" 64 | break 65 | } 66 | default { 67 | $USE_MVND = $false 68 | $MVN_CMD = $script -replace '^mvnw','mvn' 69 | break 70 | } 71 | } 72 | 73 | # apply MVNW_REPOURL and calculate MAVEN_HOME 74 | # maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ 75 | if ($env:MVNW_REPOURL) { 76 | $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } 77 | $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" 78 | } 79 | $distributionUrlName = $distributionUrl -replace '^.*/','' 80 | $distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' 81 | $MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" 82 | $MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' 83 | $MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" 84 | 85 | if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { 86 | Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" 87 | Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" 88 | exit $? 89 | } 90 | 91 | if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { 92 | Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" 93 | } 94 | 95 | # prepare tmp dir 96 | $TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile 97 | $TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" 98 | $TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null 99 | trap { 100 | if ($TMP_DOWNLOAD_DIR.Exists) { 101 | try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } 102 | catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } 103 | } 104 | } 105 | 106 | New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null 107 | 108 | # Download and Install Apache Maven 109 | Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." 110 | Write-Verbose "Downloading from: $distributionUrl" 111 | Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" 112 | 113 | $webclient = New-Object System.Net.WebClient 114 | if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { 115 | $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) 116 | } 117 | [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 118 | $webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null 119 | 120 | # If specified, validate the SHA-256 sum of the Maven distribution zip file 121 | $distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum 122 | if ($distributionSha256Sum) { 123 | if ($USE_MVND) { 124 | Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." 125 | } 126 | Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash 127 | if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { 128 | Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." 129 | } 130 | } 131 | 132 | # unzip and move 133 | Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null 134 | Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null 135 | try { 136 | Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null 137 | } catch { 138 | if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { 139 | Write-Error "fail to move MAVEN_HOME" 140 | } 141 | } finally { 142 | try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } 143 | catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } 144 | } 145 | 146 | Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" 147 | -------------------------------------------------------------------------------- /API/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 3.4.2 9 | 10 | 11 | br.com.opengotchi 12 | API 13 | 0.1 14 | API 15 | API 16 | 17 | 21 18 | 19 | 20 | 21 | 22 | com.fasterxml.jackson.core 23 | jackson-databind 24 | 2.17.1 25 | 26 | 27 | com.fasterxml.jackson.core 28 | jackson-core 29 | 2.17.1 30 | 31 | 32 | com.fasterxml.jackson.core 33 | jackson-annotations 34 | 2.17.1 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-web 43 | 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | runtime 49 | true 50 | 51 | 52 | com.h2database 53 | h2 54 | runtime 55 | 56 | 57 | org.projectlombok 58 | lombok 59 | true 60 | 61 | 62 | org.springframework.boot 63 | spring-boot-starter-test 64 | test 65 | 66 | 67 | org.postgresql 68 | postgresql 69 | runtime 70 | 71 | 72 | org.flywaydb 73 | flyway-core 74 | 75 | 76 | com.mysql 77 | mysql-connector-j 78 | runtime 79 | 80 | 81 | org.flywaydb 82 | flyway-mysql 83 | 84 | 85 | org.springframework.boot 86 | spring-boot-starter-validation 87 | 88 | 89 | 90 | 91 | 92 | 93 | org.springframework.boot 94 | spring-boot-maven-plugin 95 | 96 | 97 | paketobuildpacks/builder-jammy-base:latest 98 | 99 | 100 | 101 | org.projectlombok 102 | lombok 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/ApiApplication.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api; 2 | 3 | import br.com.opengotchi.api.Util.DataLoader.ColorDataLoader; 4 | import br.com.opengotchi.api.Util.DataLoader.PersonalityDataLoader; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.CommandLineRunner; 7 | import org.springframework.boot.SpringApplication; 8 | import org.springframework.boot.autoconfigure.SpringBootApplication; 9 | import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 10 | import org.springframework.scheduling.annotation.EnableScheduling; 11 | 12 | @SpringBootApplication 13 | @EnableJpaAuditing 14 | @EnableScheduling 15 | public class ApiApplication implements CommandLineRunner { 16 | 17 | @Autowired 18 | private ColorDataLoader colorDataLoader; 19 | 20 | @Autowired 21 | private PersonalityDataLoader personalityDataLoader; 22 | 23 | public static void main(String[] args) { 24 | SpringApplication.run(ApiApplication.class, args); 25 | } 26 | 27 | 28 | @Override 29 | public void run(String... args) throws Exception { 30 | colorDataLoader.load(); 31 | personalityDataLoader.load(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Config/Exception/Gotchi/GotchiNaoEncontradoExeption.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Config.Exception.Gotchi; 2 | 3 | public class GotchiNaoEncontradoExeption extends RuntimeException { 4 | public GotchiNaoEncontradoExeption(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Config/Exception/SecureSave/SecureSaveException.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Config.Exception.SecureSave; 2 | 3 | public class SecureSaveException extends RuntimeException { 4 | public SecureSaveException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Model/Gotchi/Gotchi.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Model.Gotchi; 2 | 3 | import br.com.opengotchi.api.Util.List.GenderList; 4 | import br.com.opengotchi.api.Util.List.LifeStageList; 5 | import jakarta.persistence.*; 6 | import jakarta.validation.constraints.NotBlank; 7 | import jakarta.validation.constraints.NotNull; 8 | import lombok.*; 9 | import org.springframework.data.annotation.CreatedDate; 10 | import org.springframework.data.annotation.LastModifiedDate; 11 | import org.springframework.data.jpa.domain.support.AuditingEntityListener; 12 | 13 | import java.time.Instant; 14 | import java.util.UUID; 15 | 16 | @Entity 17 | @Table(name = "gotchis") 18 | @EntityListeners(AuditingEntityListener.class) 19 | @Data 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | @Builder 23 | public class Gotchi { 24 | 25 | @Id 26 | @GeneratedValue(strategy = GenerationType.UUID) 27 | private UUID id; 28 | 29 | @NotBlank(message = "Name is required") 30 | @Column(nullable = false) 31 | private String name; 32 | 33 | @NotNull(message = "Gender is required") 34 | @Enumerated(EnumType.STRING) 35 | @Column(nullable = false) 36 | private GenderList gender; 37 | 38 | @NotNull(message = "Life stage is required") 39 | @Enumerated(EnumType.STRING) 40 | @Column(nullable = false) 41 | private LifeStageList lifeStage = LifeStageList.EGG; 42 | 43 | @Embedded 44 | private Physical physical; 45 | 46 | @Embedded 47 | private Needs needs; 48 | 49 | @Embedded 50 | private Skills skills; 51 | 52 | @CreatedDate 53 | @Column(nullable = false, updatable = false) 54 | private Instant createdAt; 55 | 56 | @LastModifiedDate 57 | @Column(nullable = false) 58 | private Instant lastUpdate; 59 | 60 | @Column(nullable = false) 61 | private Boolean sleeping = false; 62 | } 63 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Model/Gotchi/Needs.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Model.Gotchi; 2 | 3 | import jakarta.persistence.Embeddable; 4 | import lombok.Data; 5 | 6 | @Data 7 | @Embeddable 8 | public class Needs { 9 | private int hunger; // Fome 10 | private int comfort; // Conforto 11 | private int hygiene; // Higiene 12 | private int bladder; // Bexiga 13 | private int energy; // Energia // Stamina 14 | private int fun; // Diversão 15 | private int social; // Social 16 | private int room; // Ambiente 17 | } 18 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Model/Gotchi/Physical.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Model.Gotchi; 2 | 3 | import jakarta.persistence.Embeddable; 4 | import jakarta.validation.constraints.Min; 5 | import lombok.Data; 6 | 7 | @Data 8 | @Embeddable 9 | public class Physical { 10 | 11 | // Songs of Syx - Inspired 12 | 13 | @Min(value = 0, message = "Weight cannot be negative") 14 | private int weight = 10; // Peso 15 | 16 | @Min(value = 0, message = "Stamina cannot be negative") 17 | private int stamina = 10; // Energia 18 | 19 | @Min(value = 0, message = "Speed cannot be negative") 20 | private int speed = 10; // Velocidade 21 | 22 | @Min(value = 0, message = "Acceleration cannot be negative") 23 | private int acceleration = 10; // Aceleração 24 | 25 | @Min(value = 0, message = "Health cannot be negative") 26 | private int maxHealth = 100; // Vida Máxima 27 | 28 | @Min(value = 0, message = "Health cannot be negative") 29 | private int currentHealth = 100; // Vida Atual 30 | 31 | @Min(value = 0, message = "Heat resistance cannot be negative") 32 | private int heatResistance = 10; // Resistência ao Calor 33 | 34 | @Min(value = 0, message = "Cold resistance cannot be negative") 35 | private int coldResistance = 10; // Resistência ao Frio 36 | 37 | @Min(value = 0, message = "Strength cannot be negative") 38 | private int strength = 10; // Força 39 | 40 | @Min(value = 0, message = "Agility cannot be negative") 41 | private int agility = 10; // Agilidade 42 | 43 | @Min(value = 0, message = "Endurance cannot be negative") 44 | private int endurance = 10; // Resistência 45 | 46 | @Override 47 | public String toString() { 48 | return String.format( 49 | "Physical{weight=%d, stamina=%d, speed=%d, acceleration=%d, maxHealth=%d, currentHealth=%d, heatResistance=%d, coldResistance=%d, strength=%d, agility=%d, endurance=%d}", 50 | weight, stamina, speed, acceleration, maxHealth, currentHealth, heatResistance, coldResistance, strength, agility, endurance 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Model/Gotchi/Skills.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Model.Gotchi; 2 | 3 | import jakarta.persistence.Embeddable; 4 | import lombok.Data; 5 | 6 | @Data 7 | @Embeddable 8 | public class Skills { 9 | private int charisma; // Carisma 10 | private int comedy; // Comédia 11 | private int cooking; // Culinária 12 | private int fishing; // Pesca 13 | private int fitness; // Boa Forma 14 | private int gardening; // Jardinagem 15 | private int gourmetCooking; // Culinária Gourmet 16 | private int guitar; // Violão 17 | private int handiness; // Conserto 18 | private int logic; // Lógica 19 | private int mischief; // Travessura 20 | private int mixology; // Mixologia 21 | private int painting; // Pintura 22 | private int piano; // Piano 23 | private int photography; // Fotografia 24 | private int programming; // Programação 25 | private int rocketScience; // Ciência Espacial 26 | private int videoGaming; // Jogos Eletrônicos 27 | private int violin; // Violino 28 | private int writing; // Escrita 29 | private int baking; // Confeitaria 30 | private int dancing; // Dança 31 | private int singing; // Canto 32 | private int acting; // Atuação 33 | private int djMixing; // DJ 34 | private int mediaProduction; // Produção de Mídia 35 | private int robotics; // Robótica 36 | private int wellness; // Bem-estar 37 | private int knitting; // Tricô 38 | private int romance; // Romance 39 | private int gemology; // Gemologia 40 | private int nectarMaking; // Produção de Néctar 41 | private int horseRiding; // Equitação 42 | private int archery; // Arco e Flecha 43 | private int researchDebate; // Pesquisa e Debate 44 | 45 | // Toddler Skills 46 | private int communication; // Comunicação 47 | private int imagination; // Imaginação 48 | private int movement; // Movimento 49 | private int potty; // Banheiro 50 | private int thinking; // Pensamento 51 | 52 | // Child Skills 53 | private int creativity; // Criatividade 54 | private int mental; // Mental 55 | private int motor; // Motor 56 | private int socialChild; // Social da Crianaça 57 | private int emotional; // Emocional 58 | } 59 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Repository/ColorRepository.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Repository; 2 | 3 | import br.com.opengotchi.api.Util.Model.Color; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.Query; 6 | import org.springframework.stereotype.Repository; 7 | 8 | @Repository 9 | public interface ColorRepository extends JpaRepository { 10 | 11 | @Query(value = "SELECT * FROM cores ORDER BY RAND() LIMIT 1", nativeQuery = true) 12 | Color getRandom(); 13 | } -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Repository/GotchiRepository.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Repository; 2 | 3 | import br.com.opengotchi.api.Model.Gotchi.Gotchi; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | 8 | @Repository 9 | public interface GotchiRepository extends JpaRepository { 10 | } 11 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Repository/PersonalityRepository.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Repository; 2 | 3 | import br.com.opengotchi.api.Util.Model.Personality; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.Query; 6 | import org.springframework.stereotype.Repository; 7 | 8 | @Repository 9 | public interface PersonalityRepository extends JpaRepository { 10 | 11 | @Query(value = "SELECT * FROM personalidades ORDER BY RAND() LIMIT 1", nativeQuery = true) 12 | Personality getRandom(); 13 | } 14 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/DataLoader/ColorDataLoader.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.DataLoader; 2 | 3 | import br.com.opengotchi.api.Repository.ColorRepository; 4 | import br.com.opengotchi.api.Util.Model.Color; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | @Service 9 | public class ColorDataLoader { 10 | 11 | @Autowired 12 | private ColorRepository colorRepository; 13 | 14 | public void load() { 15 | colorRepository.save(new Color(null, "Branco", "#FFFFFF")); 16 | colorRepository.save(new Color(null, "Preto", "#000000")); 17 | colorRepository.save(new Color(null, "Cinza", "#808080")); 18 | colorRepository.save(new Color(null, "Vermelho", "#FF0000")); 19 | colorRepository.save(new Color(null, "Azul", "#0000FF")); 20 | colorRepository.save(new Color(null, "Verde", "#008000")); 21 | colorRepository.save(new Color(null, "Amarelo", "#FFFF00")); 22 | colorRepository.save(new Color(null, "Rosa", "#FFC0CB")); 23 | colorRepository.save(new Color(null, "Roxo", "#800080")); 24 | colorRepository.save(new Color(null, "Marrom", "#A52A2A")); 25 | colorRepository.save(new Color(null, "Bege", "#F5F5DC")); 26 | colorRepository.save(new Color(null, "Laranja", "#FFA500")); 27 | colorRepository.save(new Color(null, "Vinho", "#8B0000")); 28 | colorRepository.save(new Color(null, "Dourado", "#FFD700")); 29 | colorRepository.save(new Color(null, "Prata", "#C0C0C0")); 30 | colorRepository.save(new Color(null, "Verde Limão", "#32CD32")); 31 | colorRepository.save(new Color(null, "Verde Escuro", "#006400")); 32 | colorRepository.save(new Color(null, "Azul Claro", "#ADD8E6")); 33 | colorRepository.save(new Color(null, "Azul Escuro", "#00008B")); 34 | colorRepository.save(new Color(null, "Lavanda", "#E6E6FA")); 35 | colorRepository.save(new Color(null, "Salmão", "#FA8072")); 36 | colorRepository.save(new Color(null, "Turquesa", "#40E0D0")); 37 | colorRepository.save(new Color(null, "Ciano", "#00FFFF")); 38 | colorRepository.save(new Color(null, "Magenta", "#FF00FF")); 39 | colorRepository.save(new Color(null, "Oliva", "#808000")); 40 | colorRepository.save(new Color(null, "Mostarda", "#FFDB58")); 41 | colorRepository.save(new Color(null, "Castanho", "#654321")); 42 | colorRepository.save(new Color(null, "Marfim", "#FFFFF0")); 43 | colorRepository.save(new Color(null, "Caqui", "#F0E68C")); 44 | colorRepository.save(new Color(null, "Camurça", "#C19A6B")); 45 | colorRepository.save(new Color(null, "Caramelo", "#D2691E")); 46 | colorRepository.save(new Color(null, "Amêndoa", "#EADDCA")); 47 | colorRepository.save(new Color(null, "Champanhe", "#F7E7CE")); 48 | colorRepository.save(new Color(null, "Pêssego", "#FFE5B4")); 49 | colorRepository.save(new Color(null, "Terracota", "#E2725B")); 50 | colorRepository.save(new Color(null, "Café", "#6F4E37")); 51 | colorRepository.save(new Color(null, "Chocolate", "#D2691E")); 52 | colorRepository.save(new Color(null, "Ameixa", "#DDA0DD")); 53 | colorRepository.save(new Color(null, "Cobre", "#B87333")); 54 | colorRepository.save(new Color(null, "Púrpura", "#9B30FF")); 55 | colorRepository.save(new Color(null, "Fúcsia", "#FF00FF")); 56 | colorRepository.save(new Color(null, "Areia", "#F4A460")); 57 | colorRepository.save(new Color(null, "Cenoura", "#ED9121")); 58 | colorRepository.save(new Color(null, "Azeitona", "#808000")); 59 | colorRepository.save(new Color(null, "Verde Musgo", "#8A9A5B")); 60 | colorRepository.save(new Color(null, "Coral", "#FF7F50")); 61 | colorRepository.save(new Color(null, "Cinza Claro", "#D3D3D3")); 62 | colorRepository.save(new Color(null, "Cinza Escuro", "#A9A9A9")); 63 | colorRepository.save(new Color(null, "Petróleo", "#006363")); 64 | colorRepository.save(new Color(null, "Esmeralda", "#50C878")); 65 | colorRepository.save(new Color(null, "Verde Água", "#00FF7F")); 66 | colorRepository.save(new Color(null, "Antracite", "#293133")); 67 | colorRepository.save(new Color(null, "Jade", "#00A86B")); 68 | colorRepository.save(new Color(null, "Verde Menta", "#98FF98")); 69 | colorRepository.save(new Color(null, "Azul Marinho", "#000080")); 70 | colorRepository.save(new Color(null, "Azul Céu", "#87CEEB")); 71 | colorRepository.save(new Color(null, "Azul Bebê", "#89CFF0")); 72 | colorRepository.save(new Color(null, "Cobalto", "#0047AB")); 73 | colorRepository.save(new Color(null, "Índigo", "#4B0082")); 74 | colorRepository.save(new Color(null, "Safira", "#0F52BA")); 75 | colorRepository.save(new Color(null, "Amora", "#8A2BE2")); 76 | colorRepository.save(new Color(null, "Azul Royal", "#4169E1")); 77 | colorRepository.save(new Color(null, "Pérola", "#F0EAD6")); 78 | colorRepository.save(new Color(null, "Cinza Azulado", "#7393B3")); 79 | colorRepository.save(new Color(null, "Verde Neve", "#E8F6EF")); 80 | colorRepository.save(new Color(null, "Verde Místico", "#317873")); 81 | colorRepository.save(new Color(null, "Rosa Choque", "#FF69B4")); 82 | colorRepository.save(new Color(null, "Rosa Pálido", "#F4C2C2")); 83 | colorRepository.save(new Color(null, "Magenta Escuro", "#8B008B")); 84 | colorRepository.save(new Color(null, "Cinza Chumbo", "#36454F")); 85 | colorRepository.save(new Color(null, "Amarelo Ouro", "#FFD700")); 86 | colorRepository.save(new Color(null, "Azul Esverdeado", "#4682B4")); 87 | colorRepository.save(new Color(null, "Rosa Quartzo", "#F7CAC9")); 88 | colorRepository.save(new Color(null, "Vermelho Rubi", "#9B111E")); 89 | colorRepository.save(new Color(null, "Laranja Fogo", "#FF4500")); 90 | colorRepository.save(new Color(null, "Verde Lima", "#BFFF00")); 91 | colorRepository.save(new Color(null, "Lilás", "#C8A2C8")); 92 | colorRepository.save(new Color(null, "Roxo Profundo", "#9400D3")); 93 | colorRepository.save(new Color(null, "Verde Pastel", "#77DD77")); 94 | colorRepository.save(new Color(null, "Verde Menta Suave", "#AAF0D1")); 95 | colorRepository.save(new Color(null, "Cinza Prata", "#C0C0C0")); 96 | colorRepository.save(new Color(null, "Verde Limão Claro", "#DFFF00")); 97 | colorRepository.save(new Color(null, "Vermelho Tomate", "#FF6347")); 98 | colorRepository.save(new Color(null, "Cinza Ardoise", "#708090")); 99 | colorRepository.save(new Color(null, "Azul Petróleo", "#013220")); 100 | colorRepository.save(new Color(null, "Amarelo Canário", "#FFFF99")); 101 | colorRepository.save(new Color(null, "Pardo", "#CD853F")); 102 | colorRepository.save(new Color(null, "Azul Gelo", "#DAF7F9")); 103 | colorRepository.save(new Color(null, "Laranja Escuro", "#FF8C00")); 104 | colorRepository.save(new Color(null, "Verde Abacate", "#568203")); 105 | colorRepository.save(new Color(null, "Rosa Antigo", "#DCAE96")); 106 | colorRepository.save(new Color(null, "Amarelo Bebê", "#FDFD96")); 107 | colorRepository.save(new Color(null, "Verde Fluorescente", "#39FF14")); 108 | colorRepository.save(new Color(null, "Turquesa Escuro", "#00CED1")); 109 | colorRepository.save(new Color(null, "Bronze", "#CD7F32")); 110 | colorRepository.save(new Color(null, "Rosa Fúcsia", "#FF77FF")); 111 | colorRepository.save(new Color(null, "Azul Elétrico", "#7DF9FF")); 112 | colorRepository.save(new Color(null, "Roxo Lavanda", "#E6E6FA")); 113 | } 114 | 115 | } 116 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/DataLoader/PersonalityDataLoader.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.DataLoader; 2 | 3 | import br.com.opengotchi.api.Repository.PersonalityRepository; 4 | import br.com.opengotchi.api.Util.List.GenderList; 5 | import br.com.opengotchi.api.Util.Model.Personality; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class PersonalityDataLoader { 11 | 12 | @Autowired 13 | private PersonalityRepository personalityRepository; 14 | 15 | public void load() { 16 | 17 | // MALE 18 | personalityRepository.save(new Personality(null, "Extrovertido", "Energético, sociável, gosta de interações sociais e ambientes dinâmicos.", GenderList.MALE)); 19 | personalityRepository.save(new Personality(null, "Introvertido", "Reservado, prefere ambientes tranquilos e interações mais profundas.", GenderList.MALE)); 20 | personalityRepository.save(new Personality(null, "Amigável", "Simpático, caloroso, prestativo e gentil com os outros.", GenderList.MALE)); 21 | personalityRepository.save(new Personality(null, "Analítico", "Lógico, gosta de resolver problemas e tomar decisões com base em fatos e dados.", GenderList.MALE)); 22 | personalityRepository.save(new Personality(null, "Criativo", "Imaginativo, inovador e expressivo, gosta de experimentar novas ideias.", GenderList.MALE)); 23 | personalityRepository.save(new Personality(null, "Pragmático", "Prático, focado em soluções simples e eficazes, realista sobre o que pode ser alcançado.", GenderList.MALE)); 24 | personalityRepository.save(new Personality(null, "Impulsivo", "Toma decisões rapidamente, às vezes sem considerar as consequências.", GenderList.MALE)); 25 | 26 | // FEMALE 27 | personalityRepository.save(new Personality(null, "Extrovertida", "Energética, sociável, gosta de interações sociais e ambientes dinâmicos.", GenderList.FEMALE)); 28 | personalityRepository.save(new Personality(null, "Introvertida", "Reservada, prefere ambientes tranquilos e interações mais profundas.", GenderList.FEMALE)); 29 | personalityRepository.save(new Personality(null, "Amigável", "Simpática, calorosa, prestativa e gentil com os outros.", GenderList.FEMALE)); 30 | personalityRepository.save(new Personality(null, "Analítica", "Lógica, gosta de resolver problemas e tomar decisões com base em fatos e dados.", GenderList.FEMALE)); 31 | personalityRepository.save(new Personality(null, "Criativa", "Imaginativa, inovadora e expressiva, gosta de experimentar novas ideias.", GenderList.FEMALE)); 32 | personalityRepository.save(new Personality(null, "Pragmática", "Prática, focada em soluções simples e eficazes, realista sobre o que pode ser alcançado.", GenderList.FEMALE)); 33 | personalityRepository.save(new Personality(null, "Impulsiva", "Toma decisões rapidamente, às vezes sem considerar as consequências.", GenderList.FEMALE)); 34 | 35 | // NEUTRAL 36 | personalityRepository.save(new Personality(null, "Extrovertide", "Energéticde, sociável, gosta de interações sociais e ambientes dinâmicos.", GenderList.NEUTRAL)); 37 | personalityRepository.save(new Personality(null, "Introvertide", "Reservade, prefere ambientes tranquilos e interações mais profundas.", GenderList.NEUTRAL)); 38 | personalityRepository.save(new Personality(null, "Amigável", "Simpáticde, calorosde, prestativde e gentil com os outros.", GenderList.NEUTRAL)); 39 | personalityRepository.save(new Personality(null, "Analíticde", "Lógicde, gosta de resolver problemas e tomar decisões com base em fatos e dados.", GenderList.NEUTRAL)); 40 | personalityRepository.save(new Personality(null, "Criativde", "Imaginativde, inovadorde e expressivde, gosta de experimentar novas ideias.", GenderList.NEUTRAL)); 41 | personalityRepository.save(new Personality(null, "Pragmáticde", "Práticde, focadde em soluções simples e eficazes, realista sobre o que pode ser alcançado.", GenderList.NEUTRAL)); 42 | personalityRepository.save(new Personality(null, "Impulsivde", "Toma decisões rapidamente, às vezes sem considerar as consequências.", GenderList.NEUTRAL)); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/List/GenderList.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.List; 2 | 3 | public enum GenderList { 4 | MALE, // Masculino 5 | FEMALE, // Feminino 6 | NEUTRAL // Neutro 7 | } 8 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/List/LifeStageList.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.List; 2 | 3 | public enum LifeStageList { 4 | EGG, // OVO 5 | BABY, // BEBE 6 | CHILD, // CRIANÇA 7 | TEENAGER, // ADOLESCENTE 8 | ADULT, // ADULTO 9 | ELDERLY, // IDOSO 10 | DEAD; // MORTO 11 | } -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/Model/Color.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.Model; 2 | 3 | import jakarta.persistence.*; 4 | import jakarta.validation.constraints.Pattern; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.UUID; 12 | @Entity 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Builder 17 | public class Color { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.UUID) 21 | private UUID id; 22 | 23 | @Size(min = 1, max = 255, message = "Color name must be between 1 and 255 characters") 24 | @Column(nullable = false, updatable = false) 25 | private String name; 26 | 27 | @Pattern(regexp = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", message = "Hex color code must be valid (e.g., #RRGGBB or #RGB)") 28 | @Column(nullable = false, updatable = false) 29 | private String hex; 30 | 31 | @Override 32 | public String toString() { 33 | return String.format("Color{name='%s', hex='%s'}", name, hex); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/Model/Personality.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.Model; 2 | 3 | import br.com.opengotchi.api.Util.List.GenderList; 4 | import jakarta.persistence.*; 5 | import jakarta.validation.constraints.NotBlank; 6 | import jakarta.validation.constraints.NotNull; 7 | import jakarta.validation.constraints.Size; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Builder; 10 | import lombok.Data; 11 | import lombok.NoArgsConstructor; 12 | 13 | import java.util.UUID; 14 | 15 | @Entity 16 | @Data 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | @Builder 20 | public class Personality { 21 | 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.UUID) 24 | private UUID id; 25 | 26 | @NotBlank(message = "Name is required") 27 | @Size(min = 1, max = 255, message = "Name must be between 1 and 255 characters") 28 | @Column(nullable = false, updatable = false) 29 | private String name; 30 | 31 | @NotBlank(message = "Description is required") 32 | @Size(min = 1, max = 255, message = "Description must be between 1 and 255 characters") 33 | @Column(nullable = false, updatable = false) 34 | private String description; 35 | 36 | @NotNull(message = "Gender is required") 37 | @Enumerated(EnumType.STRING) 38 | @Column(nullable = false) 39 | private GenderList gender; 40 | 41 | @Override 42 | public String toString() { 43 | return String.format("Personality{name='%s', description='%s', gender='%s'}", name, description, gender); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /API/src/main/java/br/com/opengotchi/api/Util/Model/Response.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api.Util.Model; 2 | 3 | import lombok.*; 4 | 5 | @Data 6 | @NoArgsConstructor 7 | @AllArgsConstructor 8 | public class Response { 9 | private String msg; 10 | } 11 | -------------------------------------------------------------------------------- /API/src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | environment.name=DEV 2 | 3 | # DataSource 4 | spring.datasource.driverClassName=org.h2.Driver 5 | spring.datasource.url=jdbc:h2:mem:testdb 6 | spring.datasource.username=${SPRING_DATASOURCE_USERNAME} 7 | spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} 8 | 9 | 10 | # JPA 11 | spring.jpa.hibernate.ddl-auto=update 12 | spring.jpa.open-in-view=false 13 | spring.jpa.defer-datasource-initialization=true 14 | 15 | # H2 16 | spring.h2.console.enabled=true 17 | spring.h2.console.path=/h2-console 18 | 19 | # Desativando o Flyway 20 | spring.flyway.enabled=false -------------------------------------------------------------------------------- /API/src/main/resources/application-prod.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Navelogic/Opengotchi/5d6db3a58b30c27feb050d6f3716910432e94fea/API/src/main/resources/application-prod.properties -------------------------------------------------------------------------------- /API/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=API 2 | spring.profiles.active=dev -------------------------------------------------------------------------------- /API/src/test/java/br/com/opengotchi/api/ApiApplicationTests.java: -------------------------------------------------------------------------------- 1 | package br.com.opengotchi.api; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApiApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Código de Conduta do Contributor 2 | 3 | ## Nosso Compromisso 4 | 5 | Nós, como membros, contribuidores e líderes, comprometemo-nos a tornar a participação em nossa comunidade uma experiência livre de assédio para todos, independentemente de idade, tamanho corporal, deficiência visível ou invisível, etnia, características sexuais, identidade e expressão de gênero, nível de experiência, educação, status socioeconômico, nacionalidade, aparência pessoal, raça, religião ou identidade e orientação sexual. 6 | 7 | Comprometemo-nos a agir e interagir de maneiras que contribuam para uma comunidade aberta, acolhedora, diversa, inclusiva e saudável. 8 | 9 | ## Nossos Padrões 10 | 11 | Exemplos de comportamentos que contribuem para um ambiente positivo para nossa comunidade incluem: 12 | 13 | * Demonstrar empatia e bondade em relação a outras pessoas 14 | * Ser respeitoso com opiniões, pontos de vista e experiências diferentes 15 | * Dar e aceitar feedback construtivo de maneira graciosa 16 | * Assumir responsabilidade e pedir desculpas àqueles afetados por nossos erros, e aprender com a experiência 17 | * Focar no que é melhor não apenas para nós como indivíduos, mas para a comunidade em geral 18 | 19 | Exemplos de comportamentos inaceitáveis incluem: 20 | 21 | * Uso de linguagem ou imagens sexualizadas, e atenção ou avanços sexuais de qualquer tipo 22 | * Trolling, comentários insultuosos ou depreciativos, e ataques pessoais ou políticos 23 | * Assédio público ou privado 24 | * Publicação de informações privadas de outras pessoas, como um endereço físico ou de e-mail, sem sua permissão explícita 25 | * Outras condutas que poderiam ser razoavelmente consideradas inadequadas em um ambiente profissional 26 | 27 | ## Responsabilidades de Aplicação 28 | 29 | Os líderes da comunidade são responsáveis por esclarecer e fazer cumprir nossos padrões de comportamento aceitável e tomarão ações corretivas apropriadas e justas em resposta a qualquer comportamento que considerem inadequado, ameaçador, ofensivo ou prejudicial. 30 | 31 | Os líderes da comunidade têm o direito e a responsabilidade de remover, editar ou rejeitar comentários, commits, código, edições na wiki, issues e outras contribuições que não estejam alinhadas a este Código de Conduta, e comunicarão as razões para as decisões de moderação quando apropriado. 32 | 33 | ## Escopo 34 | 35 | Este Código de Conduta se aplica a todos os espaços da comunidade, e também se aplica quando um indivíduo está representando oficialmente a comunidade em espaços públicos. Exemplos de representação de nossa comunidade incluem o uso de um endereço de e-mail oficial, postagens em contas de mídia social oficiais ou a atuação como um representante designado em um evento online ou offline. 36 | 37 | ## Aplicação 38 | 39 | Casos de comportamento abusivo, assediador ou de outra forma inaceitável podem ser relatados aos líderes da comunidade responsáveis pela aplicação em . Todas as reclamações serão revisadas e investigadas de maneira rápida e justa. 40 | 41 | Todos os líderes da comunidade são obrigados a respeitar a privacidade e a segurança do denunciante de qualquer incidente. 42 | 43 | ## Diretrizes de Aplicação 44 | 45 | Os líderes da comunidade seguirão estas Diretrizes de Impacto na Comunidade para determinar as consequências de qualquer ação que considerem em violação deste Código de Conduta: 46 | 47 | ### 1. Correção 48 | 49 | **Impacto na Comunidade**: Uso de linguagem inadequada ou outro comportamento considerado não profissional ou indesejado na comunidade. 50 | 51 | **Consequência**: Um aviso escrito e privado dos líderes da comunidade, proporcionando clareza sobre a natureza da violação e uma explicação de porque o comportamento era inapropriado. Pode ser solicitada uma desculpa pública. 52 | 53 | ### 2. Advertência 54 | 55 | **Impacto na Comunidade**: Violação através de um único incidente ou série de ações. 56 | 57 | **Consequência**: Uma advertência com consequências para comportamentos continuados. Nenhuma interação com as pessoas envolvidas, incluindo interações não solicitadas com aqueles que aplicam o Código de Conduta, por um período especificado de tempo. Isso inclui evitar interações em espaços comunitários, bem como canais externos como mídias sociais. A violação destes termos pode levar a um banimento temporário ou permanente. 58 | 59 | ### 3. Banimento Temporário 60 | 61 | **Impacto na Comunidade**: Violação séria dos padrões da comunidade, incluindo comportamento inadequado sustentado. 62 | 63 | **Consequência**: Banimento temporário de qualquer tipo de interação ou comunicação pública com a comunidade por um período de tempo especificado. Nenhuma interação pública ou privada com as pessoas envolvidas, incluindo interações não solicitadas com aqueles que aplicam o Código de Conduta, é permitida durante este período. A violação destes termos pode levar a um banimento permanente. 64 | 65 | ### 4. Banimento Permanente 66 | 67 | **Impacto na Comunidade**: Demonstração de um padrão de violação dos padrões da comunidade, incluindo comportamento inadequado sustentado, assédio de um indivíduo, ou agressão ou menosprezo de classes de indivíduos. 68 | 69 | **Consequência**: Banimento permanente de qualquer tipo de interação pública dentro da comunidade. 70 | 71 | ## Atribuição 72 | 73 | Este Código de Conduta é adaptado do [Contributor Covenant][homepage], versão 2.0, disponível em https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 74 | 75 | As Diretrizes de Impacto na Comunidade foram inspiradas pela [escada de aplicação do código de conduta da Mozilla](https://github.com/mozilla/diversity). 76 | 77 | [homepage]: https://www.contributor-covenant.org 78 | 79 | Para respostas a perguntas comuns sobre este código de conduta, veja as FAQ em https://www.contributor-covenant.org/faq. Traduções estão disponíveis em https://www.contributor-covenant.org/translations. 80 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contribuindo 2 | 3 | Agradecemos seu interesse em melhorar o Opengotchi. Existem várias maneiras de contribuir, incluindo relatórios de bugs, sugestões de novos recursos, correção de erros e melhorias na documentação. Siga as diretrizes abaixo para garantir que o processo de contribuição seja claro e eficiente para todos. 4 | 5 | ### Como Contribuir 6 | 7 | 1. **Faça um Fork do Repositório** 8 | 9 | Crie uma cópia do repositório no seu próprio GitHub para que você possa fazer alterações livremente sem afetar o projeto principal. 10 | 11 | 2. **Clone o Repositório** 12 | 13 | Clone o repositório do fork para o seu ambiente de desenvolvimento local. 14 | 15 | ```bash 16 | git clone https://github.com/seu-usuario/opengotchi.git 17 | cd opengotchi 18 | ``` 19 | 20 | 3. **Crie uma Branch para sua Alteração** 21 | 22 | Crie uma nova branch para a sua contribuição. Nomeie a branch de forma descritiva para facilitar o entendimento do que está sendo alterado. 23 | 24 | ```bash 25 | git checkout -b feature/nome-da-sua-feature 26 | ``` 27 | 28 | 4. **Faça as Alterações Necessárias** 29 | 30 | Faça as alterações ou adições necessárias em sua branch. 31 | 32 | 5. **Commit suas Mudanças** 33 | 34 | Escreva uma mensagem de commit clara e descritiva. 35 | 36 | ```bash 37 | git add . 38 | git commit -m "Descrição clara das mudanças feitas" 39 | ``` 40 | 41 | 6. **Sincronize com o Repositório Original** 42 | 43 | Mantenha seu fork sincronizado com o repositório original para evitar conflitos. 44 | 45 | ```bash 46 | git fetch upstream 47 | git merge upstream/main 48 | ``` 49 | 50 | 7. **Push para o seu Fork** 51 | 52 | Envie suas alterações para o repositório do fork no GitHub. 53 | 54 | ```bash 55 | git push origin feature/nome-da-sua-feature 56 | ``` 57 | 58 | 8. **Abra um Pull Request** 59 | 60 | No GitHub (site), navegue até o repositório original e abra um Pull Request a partir da sua branch. Descreva detalhadamente as mudanças que você fez e o motivo delas. 61 | 62 | 9. **Aguarde a Revisão** 63 | 64 | Aguarde que outros membros da comunidade revisem suas alterações. 65 | 66 | ### Diretrizes de Contribuição 67 | 68 | - **Respeite o Código de Conduta:** Siga as diretrizes descritas no Código de Conduta ao interagir com outros contribuidores. 69 | - **Mantenha a Documentação Atualizada:** Se sua contribuição inclui novas funcionalidades ou mudanças significativas, atualize a documentação correspondente. 70 | - **Seja Claro e Conciso:** Ao relatar problemas ou sugerir melhorias, forneça o máximo de informações possível para ajudar na resolução ou implementação. 71 | 72 | ### Reportando Bugs 73 | 74 | - **Verifique Problemas Existentes:** Antes de abrir um novo issue, verifique se o problema já foi relatado por outra pessoa. 75 | - **Forneça Detalhes:** Inclua informações detalhadas sobre o ambiente em que o bug ocorreu, passos para reproduzir o problema, e qualquer log ou mensagem de erro relevante. 76 | 77 | ### Sugestões de Funcionalidades 78 | 79 | - **Descreva a Funcionalidade:** Explique claramente a funcionalidade sugerida, seu propósito e como ela beneficiará o projeto. 80 | - **Discuta com a Comunidade:** Use o sistema de issues para discutir a funcionalidade antes de começar a implementação. 81 | 82 | ## Agradecimentos 83 | 84 | Agradecemos a todos os contribuidores por ajudarem a tornar o Opengotchi melhor para todos! 85 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Licença MIT 2 | 3 | Copyright (c) 2024 Arian Weslley 4 | 5 | A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia 6 | deste software e dos arquivos de documentação associados (o "Software"), para lidar 7 | com o Software sem restrições, incluindo, sem limitação, os direitos de usar, 8 | copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender 9 | cópias do Software, e para permitir que as pessoas a quem o Software é 10 | fornecido façam isso, sujeito às seguintes condições: 11 | 12 | O aviso de copyright acima e esta permissão devem ser incluídos em todas 13 | as cópias ou partes substanciais do Software. 14 | 15 | O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU 16 | IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, 17 | ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUM CASO OS 18 | AUTORES OU TITULARES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, 19 | DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, 20 | DECORRENTE DE, FORA OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Opengotchi 👾 2 | Uma versão de código aberto e baseada em API do clássico bichinho virtual: [Tamagotchi](https://pt.wikipedia.org/wiki/Tamagotchi). 3 | 4 | ![Opengotchi Logo](https://github.com/Navelogic/Opengotchi/assets/93350805/bcc11acf-9a49-4b90-ab16-edd86819bc8f) 5 | 6 | ## Visão Geral 7 | **Opengotchi** permite que desenvolvedores integrem um bichinho virtual em qualquer sistema conectado à internet, como Telegram, Discord, WhatsApp, CLI, sites e projetos pessoais. 8 | 9 | ## Princípios 10 | - **Código Aberto:** Licenciado sob a Licença MIT, permitindo uso, modificação e distribuição livre. 11 | - **API:** Interaja com o bichinho virtual através de endpoints RESTful. 12 | - **WEB:** Em breve! 13 | - **WORA:** Escreva uma vez, rode em qualquer lugar. 14 | 15 | ## Contribuindo 16 | Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests no repositório. 17 | 18 | ### Como Contribuir 19 | 1. Crie uma branch para sua alteração. 20 | 2. Commit suas mudanças. 21 | 3. Push para a branch `main`. 22 | 4. Abra um Pull Request. 23 | 5. Aguarde feedback. 24 | 25 | [Guia de Contribuição Detalhado](https://github.com/Navelogic/Opengotchi/blob/main/CONTRIBUTING.md) 26 | 27 | ### Bugs ou Novatos em Programação? 28 | Não se preocupe! Você pode contribuir reportando bugs ou sugerindo melhorias: [Clique aqui](https://github.com/Navelogic/Opengotchi/issues/new/choose). 29 | 30 | ## Rodando Localmente 31 | Para rodar o Opengotchi localmente, você precisará do Java 17 e do Spring Boot 3. Siga os passos abaixo: 32 | 33 | 1. Clone o repositório: `git clone https://github.com/Navelogic/Opengotchi.git`. 34 | 2. Navegue até o diretório: `cd Opengotchi`. 35 | 3. Inicie a aplicação: 36 | - Para macOS/Linux: `./mvnw spring-boot:run` 37 | - Para Windows: `mvnw spring-boot:run`. 38 | 4. Acesse o servidor local em `http://localhost:8080`. 39 | 40 | Verifique o arquivo `application-dev.properties` para configurar o acesso ao banco de dados MySQL e consulte a documentação da API no diretório `API` do repositório para mais detalhes sobre como interagir com o Opengotchi. 41 | 42 | ## Licença 43 | Este projeto é licenciado sob a Licença MIT. Veja o arquivo [LICENSE](https://github.com/Navelogic/Opengotchi/blob/main/LICENSE) para mais detalhes. 44 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Política de Segurança 2 | 3 | ## Relatando Vulnerabilidades de Segurança 4 | 5 | Na Opengotchi, levamos a segurança muito a sério. Se você descobrir alguma vulnerabilidade de segurança, solicitamos que nos informe o mais rápido possível para que possamos tomar as medidas necessárias para resolver o problema. Siga as diretrizes abaixo para relatar vulnerabilidades de segurança: 6 | 7 | ### Como Relatar uma Vulnerabilidade 8 | 9 | 1. **Seção de Issue** 10 | - Descreva a natureza da vulnerabilidade. 11 | - Forneça detalhes completos sobre como reproduzir a vulnerabilidade. 12 | - Inclua qualquer informação adicional que possa nos ajudar a entender a extensão e o impacto da vulnerabilidade. 13 | 14 | 2. **Confidencialidade** 15 | - Por favor, trate o relatório com confidencialidade. Não divulgue informações sobre a vulnerabilidade publicamente até que tenhamos tido a chance de investigá-la e lançar uma correção. 16 | 17 | 3. **Agradecimentos** 18 | - Agradecemos sua contribuição para a segurança do nosso projeto. Nos comprometemos a reconhecer publicamente os esforços dos pesquisadores que relataram vulnerabilidades de forma responsável, uma vez que o problema tenha sido resolvido. 19 | 20 | ### Dependências e Segurança 21 | 22 | Nosso projeto utiliza diversas bibliotecas e frameworks, conforme especificado no arquivo `pom.xml`. Garantir a segurança dessas dependências é crucial. Veja a seguir algumas práticas de segurança relacionadas às dependências: 23 | 24 | - **Spring Boot**: 25 | - Versão: 3.1.11 26 | - Dependências: `spring-boot-starter-data-jpa`, `spring-boot-starter-web`, `spring-boot-devtools`, `spring-boot-starter-test`, `postgresql` 27 | 28 | - **Banco de Dados**: 29 | - Dependência: `com.h2database:h2` 30 | - Uso: Runtime, principalmente para desenvolvimento e testes. 31 | 32 | - **Lombok**: 33 | - Dependência: `org.projectlombok:lombok` 34 | - Uso: Opcional, excluída do build final para evitar qualquer impacto em runtime. 35 | 36 | ### Boas Práticas de Segurança 37 | 38 | 1. **Mantenha as Dependências Atualizadas** 39 | - Monitore regularmente as dependências para novas versões e patches de segurança. 40 | - Use ferramentas como `Dependabot` ou `Snyk` para ajudar a gerenciar atualizações de dependências e identificar vulnerabilidades conhecidas. 41 | 42 | 2. **Desabilitar DevTools em Produção** 43 | - A dependência `spring-boot-devtools` deve ser usada apenas em ambientes de desenvolvimento. Assegure-se de que está excluída de builds de produção. 44 | 45 | 3. **Banco de Dados Seguro** 46 | - A dependência `H2` deve ser usada principalmente para desenvolvimento. Para produção, use um banco de dados robusto e seguro com práticas recomendadas de segurança de dados. 47 | 48 | 4. **Testes de Segurança** 49 | - Inclua testes de segurança como parte do pipeline de CI/CD para detectar vulnerabilidades antecipadamente. 50 | - Utilize ferramentas de análise estática de código para identificar possíveis falhas de segurança. 51 | 52 | ### Responsabilidade de Aplicação 53 | 54 | Os líderes da comunidade são responsáveis por revisar e resolver relatórios de segurança. Comprometemo-nos a responder aos relatórios de vulnerabilidades no prazo de uma semana e a lançar correções necessárias o mais rápido possível. 55 | --------------------------------------------------------------------------------