feat: remove lib and format manually
docs: add javadoc
This commit is contained in:
@@ -0,0 +1,371 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module PUBLIC
|
||||
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
|
||||
"https://checkstyle.org/dtds/configuration_1_3.dtd">
|
||||
|
||||
<!--
|
||||
Checkstyle configuration that checks the Google coding conventions from Google Java Style
|
||||
that can be found at https://google.github.io/styleguide/javaguide.html.
|
||||
|
||||
Checkstyle is very configurable. Be sure to read the documentation at
|
||||
http://checkstyle.sf.net (or in your downloaded distribution).
|
||||
|
||||
To completely disable a check, just comment it out or delete it from the file.
|
||||
|
||||
Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
|
||||
-->
|
||||
|
||||
<module name = "Checker">
|
||||
<property name="charset" value="UTF-8"/>
|
||||
|
||||
<property name="severity" value="error"/>
|
||||
|
||||
<property name="fileExtensions" value="java, properties, xml"/>
|
||||
<!-- Excludes all 'module-info.java' files -->
|
||||
<!-- See https://checkstyle.org/config_filefilters.html -->
|
||||
<module name="BeforeExecutionExclusionFileFilter">
|
||||
<property name="fileNamePattern" value="module\-info\.java$"/>
|
||||
</module>
|
||||
<!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
|
||||
<module name="SuppressionFilter">
|
||||
<property name="file" value="${org.checkstyle.google.suppressionfilter.config}"
|
||||
default="checkstyle-suppressions.xml" />
|
||||
<property name="optional" value="true"/>
|
||||
</module>
|
||||
<!-- Checks for whitespace -->
|
||||
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
|
||||
<module name="FileTabCharacter">
|
||||
<property name="eachLine" value="true"/>
|
||||
</module>
|
||||
|
||||
<module name="LineLength">
|
||||
<property name="fileExtensions" value="java"/>
|
||||
<property name="max" value="100"/>
|
||||
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
|
||||
</module>
|
||||
|
||||
<module name="TreeWalker">
|
||||
<module name="OuterTypeFilename"/>
|
||||
<module name="IllegalTokenText">
|
||||
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
|
||||
<property name="format"
|
||||
value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
|
||||
<property name="message"
|
||||
value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
|
||||
</module>
|
||||
<module name="AvoidEscapedUnicodeCharacters">
|
||||
<property name="allowEscapesForControlCharacters" value="true"/>
|
||||
<property name="allowByTailComment" value="true"/>
|
||||
<property name="allowNonPrintableEscapes" value="true"/>
|
||||
</module>
|
||||
<module name="AvoidStarImport"/>
|
||||
<module name="OneTopLevelClass"/>
|
||||
<module name="NoLineWrap">
|
||||
<property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
|
||||
</module>
|
||||
<module name="EmptyBlock">
|
||||
<property name="option" value="TEXT"/>
|
||||
<property name="tokens"
|
||||
value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
|
||||
</module>
|
||||
<module name="NeedBraces">
|
||||
<property name="tokens"
|
||||
value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
|
||||
</module>
|
||||
<module name="LeftCurly">
|
||||
<property name="tokens"
|
||||
value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
|
||||
INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
|
||||
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
|
||||
LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
|
||||
OBJBLOCK, STATIC_INIT, RECORD_DEF, COMPACT_CTOR_DEF"/>
|
||||
</module>
|
||||
<module name="RightCurly">
|
||||
<property name="id" value="RightCurlySame"/>
|
||||
<property name="tokens"
|
||||
value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
|
||||
LITERAL_DO"/>
|
||||
</module>
|
||||
<module name="SuppressionXpathSingleFilter">
|
||||
<!-- suppresion is required till https://github.com/checkstyle/checkstyle/issues/7541 -->
|
||||
<property name="id" value="RightCurlyAlone"/>
|
||||
<property name="query" value="//RCURLY[parent::SLIST[count(./*)=1]
|
||||
or preceding-sibling::*[last()][self::LCURLY]]"/>
|
||||
</module>
|
||||
<module name="WhitespaceAfter">
|
||||
<property name="tokens"
|
||||
value="COMMA, SEMI, TYPECAST, LITERAL_IF, LITERAL_ELSE, LITERAL_RETURN,
|
||||
LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, LITERAL_FINALLY, DO_WHILE, ELLIPSIS,
|
||||
LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_CATCH, LAMBDA,
|
||||
LITERAL_YIELD, LITERAL_CASE"/>
|
||||
</module>
|
||||
<module name="WhitespaceAround">
|
||||
<property name="allowEmptyConstructors" value="true"/>
|
||||
<property name="allowEmptyLambdas" value="true"/>
|
||||
<property name="allowEmptyMethods" value="true"/>
|
||||
<property name="allowEmptyTypes" value="true"/>
|
||||
<property name="allowEmptyLoops" value="true"/>
|
||||
<property name="ignoreEnhancedForColon" value="false"/>
|
||||
<property name="tokens"
|
||||
value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
|
||||
BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
|
||||
LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
|
||||
LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
|
||||
LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
|
||||
NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
|
||||
SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
|
||||
<message key="ws.notFollowed"
|
||||
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks
|
||||
may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
|
||||
<message key="ws.notPreceded"
|
||||
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
|
||||
</module>
|
||||
<module name="OneStatementPerLine"/>
|
||||
<module name="MultipleVariableDeclarations"/>
|
||||
<module name="ArrayTypeStyle"/>
|
||||
<module name="MissingSwitchDefault"/>
|
||||
<module name="FallThrough"/>
|
||||
<module name="UpperEll"/>
|
||||
<module name="ModifierOrder"/>
|
||||
<module name="EmptyLineSeparator">
|
||||
<property name="tokens"
|
||||
value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
|
||||
STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF, RECORD_DEF,
|
||||
COMPACT_CTOR_DEF"/>
|
||||
<property name="allowNoEmptyLineBetweenFields" value="true"/>
|
||||
</module>
|
||||
<module name="SeparatorWrap">
|
||||
<property name="id" value="SeparatorWrapDot"/>
|
||||
<property name="tokens" value="DOT"/>
|
||||
<property name="option" value="nl"/>
|
||||
</module>
|
||||
<module name="SeparatorWrap">
|
||||
<property name="id" value="SeparatorWrapComma"/>
|
||||
<property name="tokens" value="COMMA"/>
|
||||
<property name="option" value="EOL"/>
|
||||
</module>
|
||||
<module name="SeparatorWrap">
|
||||
<!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
|
||||
<property name="id" value="SeparatorWrapEllipsis"/>
|
||||
<property name="tokens" value="ELLIPSIS"/>
|
||||
<property name="option" value="EOL"/>
|
||||
</module>
|
||||
<module name="SeparatorWrap">
|
||||
<!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
|
||||
<property name="id" value="SeparatorWrapArrayDeclarator"/>
|
||||
<property name="tokens" value="ARRAY_DECLARATOR"/>
|
||||
<property name="option" value="EOL"/>
|
||||
</module>
|
||||
<module name="SeparatorWrap">
|
||||
<property name="id" value="SeparatorWrapMethodRef"/>
|
||||
<property name="tokens" value="METHOD_REF"/>
|
||||
<property name="option" value="nl"/>
|
||||
</module>
|
||||
<module name="PackageName">
|
||||
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Package name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="TypeName">
|
||||
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
|
||||
ANNOTATION_DEF, RECORD_DEF"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="MemberName">
|
||||
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Member name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="ParameterName">
|
||||
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="LambdaParameterName">
|
||||
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="CatchParameterName">
|
||||
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="LocalVariableName">
|
||||
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="PatternVariableName">
|
||||
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Pattern variable name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="ClassTypeParameterName">
|
||||
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Class type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="RecordComponentName">
|
||||
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Record component name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="RecordTypeParameterName">
|
||||
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Record type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="MethodTypeParameterName">
|
||||
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Method type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="InterfaceTypeParameterName">
|
||||
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Interface type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="NoFinalizer"/>
|
||||
<module name="GenericWhitespace">
|
||||
<message key="ws.followed"
|
||||
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
|
||||
<message key="ws.preceded"
|
||||
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
|
||||
<message key="ws.illegalFollow"
|
||||
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
|
||||
<message key="ws.notPreceded"
|
||||
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
|
||||
</module>
|
||||
<module name="Indentation">
|
||||
<property name="basicOffset" value="2"/>
|
||||
<property name="braceAdjustment" value="2"/>
|
||||
<property name="caseIndent" value="2"/>
|
||||
<property name="throwsIndent" value="4"/>
|
||||
<property name="lineWrappingIndentation" value="4"/>
|
||||
<property name="arrayInitIndent" value="2"/>
|
||||
</module>
|
||||
<module name="AbbreviationAsWordInName">
|
||||
<property name="ignoreFinal" value="false"/>
|
||||
<property name="allowedAbbreviationLength" value="0"/>
|
||||
<property name="tokens"
|
||||
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, ANNOTATION_FIELD_DEF,
|
||||
PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF, PATTERN_VARIABLE_DEF, RECORD_DEF,
|
||||
RECORD_COMPONENT_DEF"/>
|
||||
</module>
|
||||
<module name="NoWhitespaceBeforeCaseDefaultColon"/>
|
||||
<module name="OverloadMethodsDeclarationOrder"/>
|
||||
<module name="VariableDeclarationUsageDistance"/>
|
||||
<module name="CustomImportOrder">
|
||||
<property name="sortImportsInGroupAlphabetically" value="true"/>
|
||||
<property name="separateLineBetweenGroups" value="true"/>
|
||||
<property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
|
||||
<property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
|
||||
</module>
|
||||
<module name="MethodParamPad">
|
||||
<property name="tokens"
|
||||
value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
|
||||
SUPER_CTOR_CALL, ENUM_CONSTANT_DEF, RECORD_DEF"/>
|
||||
</module>
|
||||
<module name="NoWhitespaceBefore">
|
||||
<property name="tokens"
|
||||
value="COMMA, SEMI, POST_INC, POST_DEC, DOT,
|
||||
LABELED_STAT, METHOD_REF"/>
|
||||
<property name="allowLineBreaks" value="true"/>
|
||||
</module>
|
||||
<module name="ParenPad">
|
||||
<property name="tokens"
|
||||
value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF,
|
||||
EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW,
|
||||
LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL,
|
||||
METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA,
|
||||
RECORD_DEF"/>
|
||||
</module>
|
||||
<module name="OperatorWrap">
|
||||
<property name="option" value="NL"/>
|
||||
<property name="tokens"
|
||||
value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
|
||||
LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF,
|
||||
TYPE_EXTENSION_AND "/>
|
||||
</module>
|
||||
<module name="AnnotationLocation">
|
||||
<property name="id" value="AnnotationLocationMostCases"/>
|
||||
<property name="tokens"
|
||||
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF,
|
||||
RECORD_DEF, COMPACT_CTOR_DEF"/>
|
||||
</module>
|
||||
<module name="AnnotationLocation">
|
||||
<property name="id" value="AnnotationLocationVariables"/>
|
||||
<property name="tokens" value="VARIABLE_DEF"/>
|
||||
<property name="allowSamelineMultipleAnnotations" value="true"/>
|
||||
</module>
|
||||
<module name="NonEmptyAtclauseDescription"/>
|
||||
<module name="InvalidJavadocPosition"/>
|
||||
<module name="JavadocTagContinuationIndentation"/>
|
||||
<module name="SummaryJavadoc">
|
||||
<property name="forbiddenSummaryFragments"
|
||||
value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
|
||||
</module>
|
||||
<module name="JavadocParagraph"/>
|
||||
<module name="RequireEmptyLineBeforeBlockTagGroup"/>
|
||||
<module name="AtclauseOrder">
|
||||
<property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
|
||||
<property name="target"
|
||||
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
|
||||
</module>
|
||||
<module name="JavadocMethod">
|
||||
<property name="accessModifiers" value="public"/>
|
||||
<property name="allowMissingParamTags" value="true"/>
|
||||
<property name="allowMissingReturnTag" value="true"/>
|
||||
<property name="allowedAnnotations" value="Override, Test"/>
|
||||
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF"/>
|
||||
</module>
|
||||
<module name="MissingJavadocMethod">
|
||||
<property name="scope" value="public"/>
|
||||
<property name="minLineCount" value="2"/>
|
||||
<property name="allowedAnnotations" value="Override, Test"/>
|
||||
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF,
|
||||
COMPACT_CTOR_DEF"/>
|
||||
</module>
|
||||
<module name="MissingJavadocType">
|
||||
<property name="scope" value="protected"/>
|
||||
<property name="tokens"
|
||||
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
|
||||
RECORD_DEF, ANNOTATION_DEF"/>
|
||||
<property name="excludeScope" value="nothing"/>
|
||||
</module>
|
||||
<module name="MethodName">
|
||||
<property name="format" value="^[a-z][a-z0-9]\w*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Method name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="SingleLineJavadoc"/>
|
||||
<module name="EmptyCatchBlock">
|
||||
<property name="exceptionVariableName" value="expected"/>
|
||||
</module>
|
||||
<module name="CommentsIndentation">
|
||||
<property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
|
||||
</module>
|
||||
<!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
|
||||
<module name="SuppressionXpathFilter">
|
||||
<property name="file" value="${org.checkstyle.google.suppressionxpathfilter.config}"
|
||||
default="checkstyle-xpath-suppressions.xml" />
|
||||
<property name="optional" value="true"/>
|
||||
</module>
|
||||
<module name="SuppressWarningsHolder" />
|
||||
<module name="SuppressionCommentFilter">
|
||||
<property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)" />
|
||||
<property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)" />
|
||||
<property name="checkFormat" value="$1" />
|
||||
</module>
|
||||
<module name="SuppressWithNearbyCommentFilter">
|
||||
<property name="commentFormat" value="CHECKSTYLE.SUPPRESS\: ([\w\|]+)"/>
|
||||
<!-- $1 refers to the first match group in the regex defined in commentFormat -->
|
||||
<property name="checkFormat" value="$1"/>
|
||||
<!-- The check is suppressed in the next line of code after the comment -->
|
||||
<property name="influenceFormat" value="1"/>
|
||||
</module>
|
||||
<module name="UnusedImports"/>
|
||||
</module>
|
||||
</module>
|
||||
@@ -183,12 +183,6 @@
|
||||
<version>0.12.6</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Pretty time - Time ago format -->
|
||||
<dependency>
|
||||
<groupId>org.ocpsoft.prettytime</groupId>
|
||||
<artifactId>prettytime</artifactId>
|
||||
<version>5.0.9.Final</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.ImportRuntimeHints;
|
||||
|
||||
/** This class contains configurations for the GraalVM Cloud Native image. */
|
||||
@Configuration
|
||||
@RegisterReflectionForBinding({
|
||||
LoginRequest.class,
|
||||
@@ -48,9 +49,6 @@ import org.springframework.context.annotation.ImportRuntimeHints;
|
||||
io.jsonwebtoken.impl.io.StandardCompressionAlgorithms.class,
|
||||
io.jsonwebtoken.impl.DefaultClaimsBuilder.class,
|
||||
io.jsonwebtoken.impl.DefaultJwtParserBuilder.class,
|
||||
org.ocpsoft.prettytime.PrettyTime.class,
|
||||
org.ocpsoft.prettytime.i18n.Resources.class,
|
||||
org.ocpsoft.prettytime.i18n.Resources_en.class,
|
||||
})
|
||||
@ImportRuntimeHints(value = {HttpServletRequestRuntimeHint.class})
|
||||
public class CloudNativeConfig {}
|
||||
|
||||
@@ -65,6 +65,11 @@ public class SecurityConfig {
|
||||
return new BCryptPasswordEncoder();
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides an AuthenticationProvider with user and password.
|
||||
*
|
||||
* @return AuthenticationProvider instance
|
||||
*/
|
||||
@Bean
|
||||
public AuthenticationProvider authenticationProvider() {
|
||||
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
|
||||
@@ -73,6 +78,13 @@ public class SecurityConfig {
|
||||
return authProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides an AuthenticationManager to manage authentication.
|
||||
*
|
||||
* @param config AuthenticationConfiguration instance
|
||||
* @return AuthenticationManager instance
|
||||
* @throws Exception if issues occur.
|
||||
*/
|
||||
@Bean
|
||||
public AuthenticationManager authenticationManager(AuthenticationConfiguration config)
|
||||
throws Exception {
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ public class AuthenticationController {
|
||||
*
|
||||
* @param loginRequest User data with email and password.
|
||||
* @return JwtAuthenticationResponse containing user token
|
||||
* @throws UserAlreadyExistsException
|
||||
* @throws UserAlreadyExistsException when user already exists.
|
||||
*/
|
||||
@PutMapping(path = "/sign-up", consumes = "application/json", produces = "application/json")
|
||||
@Operation(
|
||||
|
||||
@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/** This class provides resources to handle home requests by the client. */
|
||||
@RestController
|
||||
@RequestMapping("/rest/home")
|
||||
@AllArgsConstructor
|
||||
@@ -51,7 +52,7 @@ public class HomeController {
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for tasks and notes
|
||||
* Search for tasks and notes.
|
||||
*
|
||||
* @returns List of SearchResponse with found records.
|
||||
*/
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/** This class provides resources to handle notes requests by the client. */
|
||||
@RestController
|
||||
@RequestMapping("/rest/notes")
|
||||
@AllArgsConstructor
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
|
||||
/** This class provides exceptions handling for requests. */
|
||||
@RestControllerAdvice
|
||||
public class RestExceptionController {
|
||||
|
||||
|
||||
@@ -145,8 +145,7 @@ public class TaskController {
|
||||
@Valid
|
||||
TaskRequest taskRequest) {
|
||||
TaskEntity createdTask = taskService.createTask(taskRequest);
|
||||
return ResponseEntity.status(HttpStatus.CREATED)
|
||||
.body(TaskResponse.fromEntity(createdTask, null));
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(TaskResponse.fromEntity(createdTask));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@@ -9,18 +9,19 @@ import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import jakarta.persistence.Table;
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import java.util.List;
|
||||
|
||||
/** This class represents a note in the database. */
|
||||
@Data
|
||||
@Entity
|
||||
@Table(name = "notes")
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class NoteEntity {
|
||||
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@@ -12,6 +12,7 @@ import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/** This class represents a note url in the database. */
|
||||
@Data
|
||||
@Entity
|
||||
@ToString
|
||||
|
||||
@@ -10,13 +10,13 @@ import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/** This class represents a task in the database. */
|
||||
@Data
|
||||
@Entity
|
||||
@Table(name = "tasks")
|
||||
|
||||
@@ -12,6 +12,7 @@ import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/** This class represents a task url in the database. */
|
||||
@Data
|
||||
@Entity
|
||||
@ToString
|
||||
|
||||
@@ -4,6 +4,7 @@ import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
/** This class represents a Bad Password exception. */
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public class BadPasswordException extends ResponseStatusException {
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsS
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
|
||||
/** This class represents an authentication filter do authenticate requests. */
|
||||
@Slf4j
|
||||
@Component
|
||||
public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.List;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
|
||||
/** This interface represents a note repository, for database access. */
|
||||
public interface NoteRepository extends JpaRepository<NoteEntity, Long> {
|
||||
|
||||
List<NoteEntity> findAllByUser_id(Long userId);
|
||||
|
||||
@@ -4,6 +4,7 @@ import br.com.tasknoteapp.server.entity.NoteUrlEntity;
|
||||
import java.util.List;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
/** This interface represents a note url repository, for database access. */
|
||||
public interface NoteUrlRepository extends JpaRepository<NoteUrlEntity, Long> {
|
||||
|
||||
void deleteAllByIdIn(List<Long> ids);
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package br.com.tasknoteapp.server.repository;
|
||||
|
||||
import br.com.tasknoteapp.server.entity.TaskEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
|
||||
/** This interface represents a task repository, for database access. */
|
||||
public interface TaskRepository extends JpaRepository<TaskEntity, Long> {
|
||||
|
||||
List<TaskEntity> findAllByUser_id(Long userId);
|
||||
|
||||
@@ -4,6 +4,7 @@ import br.com.tasknoteapp.server.entity.TaskUrlEntity;
|
||||
import java.util.List;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
/** This interface represents a task url repository, for database access. */
|
||||
public interface TaskUrlRepository extends JpaRepository<TaskUrlEntity, Long> {
|
||||
|
||||
void deleteAllByIdIn(List<Long> ids);
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
package br.com.tasknoteapp.server.request;
|
||||
|
||||
public record NoteUrlPatchRequest(Long id, String url) {}
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
/** This record represents a Note Url payload to be patched. */
|
||||
@Schema(description = "Represents a Note Url payload to be patched.")
|
||||
public record NoteUrlPatchRequest(
|
||||
@Schema(description = "The identification of the note url in the database") Long id,
|
||||
@Schema(description = "The note URL address, if any.") String url) {}
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
package br.com.tasknoteapp.server.request;
|
||||
|
||||
public record TaskUrlPatchRequest(Long id, String url) {}
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
/** This record represents a Task Url payload to be patched. */
|
||||
@Schema(description = "Represents a Task Url payload to be patched.")
|
||||
public record TaskUrlPatchRequest(
|
||||
@Schema(description = "The identification of the task url in the database") Long id,
|
||||
@Schema(description = "The task URL address, if any.") String url) {}
|
||||
|
||||
+5
-1
@@ -1,3 +1,7 @@
|
||||
package br.com.tasknoteapp.server.response;
|
||||
|
||||
public record JwtAuthenticationResponse(String token) {}
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
/** This record represents a JWT Token response to be returned to the client. */
|
||||
@Schema(description = "Represents a JWT Token response to be returned to the client.")
|
||||
public record JwtAuthenticationResponse(@Schema(description = "The JWT token") String token) {}
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
package br.com.tasknoteapp.server.response;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import java.util.List;
|
||||
|
||||
public record SearchResponse(List<TaskResponse> tasks, List<NoteResponse> notes) {}
|
||||
/** This record represents a Search response with found results. */
|
||||
@Schema(description = "Represents a Search response with found results")
|
||||
public record SearchResponse(
|
||||
@Schema(description = "List of found tasks.") List<TaskResponse> tasks,
|
||||
@Schema(description = "List of found notes.") List<NoteResponse> notes) {}
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
package br.com.tasknoteapp.server.response;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
/** This record represents a summary response payload object. */
|
||||
@Schema(description = "Represents a summary response payload object.")
|
||||
public record SummaryResponse(
|
||||
Integer pendingTaskCount, Integer doneTaskCount, Integer notesCount) {}
|
||||
@Schema(description = "The amount of pending tasks") Integer pendingTaskCount,
|
||||
@Schema(description = "The amount of done tasks") Integer doneTaskCount,
|
||||
@Schema(description = "The amount of notes") Integer notesCount) {}
|
||||
|
||||
@@ -2,13 +2,12 @@ package br.com.tasknoteapp.server.response;
|
||||
|
||||
import br.com.tasknoteapp.server.entity.TaskEntity;
|
||||
import br.com.tasknoteapp.server.entity.TaskUrlEntity;
|
||||
import br.com.tasknoteapp.server.util.TimeAgoUtil;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.ocpsoft.prettytime.PrettyTime;
|
||||
|
||||
/** This record represents a task and its urls object to be returned. */
|
||||
@Schema(description = "This record represents a task and its urls object to be returned.")
|
||||
public record TaskResponse(
|
||||
@@ -25,7 +24,7 @@ public record TaskResponse(
|
||||
* @param entity The TaskEntity source data.
|
||||
* @return TaskResponse instance with all task data and urls, if any.
|
||||
*/
|
||||
public static TaskResponse fromEntity(TaskEntity entity, PrettyTime prettyTime) {
|
||||
public static TaskResponse fromEntity(TaskEntity entity) {
|
||||
List<TaskUrlEntity> urls = entity.getUrls();
|
||||
List<TaskUrlResponse> urlsResponse = new ArrayList<>();
|
||||
if (Objects.isNull(urls)) {
|
||||
@@ -37,11 +36,7 @@ public record TaskResponse(
|
||||
}
|
||||
}
|
||||
|
||||
if (Objects.isNull(prettyTime)) {
|
||||
prettyTime = new PrettyTime();
|
||||
}
|
||||
|
||||
String timeAgoFmt = prettyTime.format(entity.getLastUpdate());
|
||||
String timeAgoFmt = TimeAgoUtil.format(entity.getLastUpdate());
|
||||
|
||||
return new TaskResponse(
|
||||
entity.getId(),
|
||||
|
||||
+4
-5
@@ -1,16 +1,15 @@
|
||||
package br.com.tasknoteapp.server.response;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.springframework.validation.FieldError;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Getter;
|
||||
|
||||
/** This class represents a validation error exception to be returned in the JSON format. */
|
||||
@Getter
|
||||
@Schema(description = "An object containing the error message and the invalid fields")
|
||||
public class ValidationExceptionResponse {
|
||||
|
||||
|
||||
private static final String MESSAGE_TEMPLATE = "%d field(s) with validation problems!";
|
||||
|
||||
@Schema(description = "The error message")
|
||||
|
||||
@@ -6,6 +6,7 @@ import br.com.tasknoteapp.server.request.NoteRequest;
|
||||
import br.com.tasknoteapp.server.response.NoteResponse;
|
||||
import java.util.List;
|
||||
|
||||
/** This interface contains methods to handle notes. */
|
||||
public interface NoteService {
|
||||
|
||||
public List<NoteResponse> getAllNotes();
|
||||
|
||||
@@ -126,7 +126,7 @@ class AuthServiceImpl implements AuthService {
|
||||
* Get all registered users.
|
||||
*
|
||||
* @return List of UserEntity.
|
||||
* @throws UserForbiddenException
|
||||
* @throws UserForbiddenException when the user has no permission.
|
||||
*/
|
||||
@Override
|
||||
public List<UserResponse> getAllUsers() {
|
||||
@@ -136,7 +136,7 @@ class AuthServiceImpl implements AuthService {
|
||||
|
||||
log.info("Getting all users to user {}", currentUser.getId());
|
||||
|
||||
if (!currentUser.getAdmin()) {
|
||||
if (!currentUser.getAdmin() || !currentUser.getEmail().equals("ricardompcampos@gmail.com")) {
|
||||
log.info("User not allowed!");
|
||||
throw new UserForbiddenException();
|
||||
}
|
||||
|
||||
@@ -19,10 +19,10 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
class JwtServiceImpl implements JwtService {
|
||||
|
||||
private final long SECOND = 1000;
|
||||
private final long MINUTE = SECOND * 60;
|
||||
private final long EXPIRATION_TIME = MINUTE * 30;
|
||||
private final SecretKey KEY = Jwts.SIG.HS256.key().build();
|
||||
private static final long SECOND = 1000;
|
||||
private static final long MINUTE = SECOND * 60;
|
||||
private static final long EXPIRATION_TIME = MINUTE * 30;
|
||||
private static final SecretKey KEY = Jwts.SIG.HS256.key().build();
|
||||
|
||||
@Override
|
||||
public String getEmailFromToken(String token) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/** This class implements the NoteService interface methods. */
|
||||
@Slf4j
|
||||
@Service
|
||||
@AllArgsConstructor
|
||||
|
||||
@@ -17,13 +17,10 @@ import jakarta.transaction.Transactional;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.ocpsoft.prettytime.PrettyTime;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/** This class contains the implementation for the Task Service class. */
|
||||
@@ -49,30 +46,7 @@ class TaskServiceImpl implements TaskService {
|
||||
List<TaskEntity> tasks = taskRepository.findAllByUser_id(user.getId());
|
||||
log.info("{} tasks found!", tasks.size());
|
||||
|
||||
try {
|
||||
log.info("Trying PrettyTime with 'en-US'");
|
||||
new PrettyTime(Locale.forLanguageTag("en-US"));
|
||||
} catch (MissingResourceException e) {
|
||||
log.error("Not found PrettyTime with 'en-US'");
|
||||
}
|
||||
|
||||
try {
|
||||
log.info("Trying PrettyTime with 'en_US'");
|
||||
new PrettyTime(Locale.forLanguageTag("en_US"));
|
||||
} catch (MissingResourceException e) {
|
||||
log.error("Not found PrettyTime with 'en_US'");
|
||||
}
|
||||
|
||||
try {
|
||||
log.info("Trying PrettyTime with 'en'");
|
||||
new PrettyTime(Locale.forLanguageTag("en"));
|
||||
} catch (MissingResourceException e) {
|
||||
log.error("Not found PrettyTime with 'en'");
|
||||
}
|
||||
|
||||
Locale localeForLangEnUs = Locale.forLanguageTag("en");
|
||||
PrettyTime time = new PrettyTime(localeForLangEnUs);
|
||||
return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr, time)).toList();
|
||||
return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr)).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -140,7 +114,7 @@ class TaskServiceImpl implements TaskService {
|
||||
|
||||
log.info("Task patched! Id {}", patchedTask.getId());
|
||||
|
||||
return TaskResponse.fromEntity(patchedTask, null);
|
||||
return TaskResponse.fromEntity(patchedTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -178,8 +152,7 @@ class TaskServiceImpl implements TaskService {
|
||||
taskRepository.findAllBySearchTerm(searchTerm.toUpperCase(), user.getId());
|
||||
log.info("{} tasks found!", tasks.size());
|
||||
|
||||
PrettyTime time = new PrettyTime();
|
||||
return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr, time)).toList();
|
||||
return tasks.stream().map((TaskEntity tr) -> TaskResponse.fromEntity(tr)).toList();
|
||||
}
|
||||
|
||||
private UserEntity getCurrentUser() {
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package br.com.tasknoteapp.server.util;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.Period;
|
||||
|
||||
/** This class contains util methods to format local date time. */
|
||||
public class TimeAgoUtil {
|
||||
|
||||
/**
|
||||
* Format a time in the time ago format.
|
||||
*
|
||||
* @param pastTime The past time to be formatted.
|
||||
* @return String with formatted time.
|
||||
*/
|
||||
public static String format(LocalDateTime pastTime) {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
Period period = Period.between(pastTime.toLocalDate(), now.toLocalDate());
|
||||
Duration duration = Duration.between(pastTime, now);
|
||||
if (period.getYears() > 1) {
|
||||
return String.format("%d years ago", period.getYears());
|
||||
} else if (period.getYears() > 0) {
|
||||
return String.format("%d year ago", period.getYears());
|
||||
} else if (period.getMonths() > 1) {
|
||||
return String.format("%d months ago", period.getMonths());
|
||||
} else if (period.getMonths() > 0) {
|
||||
return String.format("%d month ago", period.getMonths());
|
||||
} else if (period.getDays() > 1) {
|
||||
return String.format("%d days ago", period.getDays());
|
||||
} else if (period.getDays() > 0) {
|
||||
return String.format("%d day ago", period.getDays());
|
||||
} else if (duration.toHours() > 1L) {
|
||||
return String.format("%d hours ago", duration.toHours());
|
||||
} else if (duration.toHours() > 0L) {
|
||||
return String.format("%d hour ago", duration.toHours());
|
||||
} else if (duration.toMinutes() > 1L) {
|
||||
return String.format("%d minutes ago", duration.toMinutes());
|
||||
} else if (duration.toMinutes() > 0L) {
|
||||
return String.format("%d minute ago", duration.toMinutes());
|
||||
} else if (duration.toSeconds() > 1L) {
|
||||
return String.format("%d seconds ago", duration.toSeconds());
|
||||
} else {
|
||||
return "moments ago";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
resources = org.ocpsoft.prettytime.i18n.*
|
||||
@@ -6,8 +6,6 @@ import org.springframework.boot.test.context.SpringBootTest;
|
||||
@SpringBootTest
|
||||
class JavaApiApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
@Test
|
||||
void contextLoads() {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user