Index: .gitignore =================================================================== diff -u --- .gitignore (revision 0) +++ .gitignore (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,17 @@ +Thumbs.db +.DS_Store +.gradle +build/ + +### Intellij +.idea +*.iml +*.ipr +*.iws +out + +### Eclipse +.project +.settings +.classpath +bin Index: build.gradle =================================================================== diff -u --- build.gradle (revision 0) +++ build.gradle (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,125 @@ +buildscript { + repositories { + mavenLocal() + maven { url "http://workhorse.lemanscorp.com/nexus/content/groups/public/" } + } + dependencies { + classpath "org.grails:grails-gradle-plugin:$grailsVersion" + classpath "org.grails.plugins:hibernate5:6.0.5" + classpath "org.grails.plugins:views-gradle:1.1.2" + } +} + +group "com.lemans.services" + +defaultTasks 'clean', 'check' + +apply plugin:"eclipse" +apply plugin:"idea" +apply plugin:"war" +apply plugin:"org.grails.grails-web" +apply plugin:"org.grails.plugins.views-json" + +// Lemans +apply plugin: 'codenarc' + +repositories { + mavenLocal() + maven { url "http://workhorse.lemanscorp.com/nexus/content/groups/public/" } +} + +dependencyManagement { + imports { + mavenBom "org.grails:grails-bom:$grailsVersion" + } + applyMavenExclusions false +} + +//Lemans +configurations { + compile.exclude module: 'commons-logging' +} + +dependencies { + testCompile "org.springframework.boot:spring-boot-starter-logging" + compile "org.springframework.boot:spring-boot-autoconfigure" + compile "org.grails:grails-core" + compile "org.springframework.boot:spring-boot-starter-actuator" + provided "org.springframework.boot:spring-boot-starter-tomcat" + compile "org.grails:grails-plugin-url-mappings" + compile "org.grails:grails-plugin-rest" + compile "org.grails:grails-plugin-codecs" + compile "org.grails:grails-plugin-interceptors" + compile "org.grails:grails-plugin-services" + compile "org.grails:grails-plugin-datasource" + compile "org.grails:grails-plugin-databinding" + compile "org.grails:grails-plugin-async" + compile "org.grails:grails-web-boot" + compile "org.grails:grails-logging" + compile "org.grails.plugins:cache" + compile "org.grails.plugins:hibernate5" + compile "org.hibernate:hibernate-core:5.1.2.Final" + compile "org.hibernate:hibernate-ehcache:5.1.2.Final" + compile "org.grails.plugins:views-json" + compile "org.grails.plugins:views-json-templates" + console "org.grails:grails-console" + profile "org.grails.profiles:rest-api" + + provided "org.slf4j:slf4j-api:1.7.21" + provided "org.slf4j:jcl-over-slf4j:1.7.21" + provided "org.slf4j:jul-to-slf4j:1.7.21" + provided "org.slf4j:log4j-over-slf4j:1.7.21" + provided "ch.qos.logback:logback-core" + provided "ch.qos.logback:logback-classic" + + testCompile "org.grails:grails-plugin-testing" + + compile 'org.apache.httpcomponents:httpclient:4.2.1' + compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.7.2' + + provided 'net.sourceforge.jtds:jtds:1.3.1' + + compile 'com.lemans.grails.plugins:lemans-core:0.1.3' + compile 'com.lemans.grails.plugins:lemans-security:0.1.2c' + compile 'com.lemans.grails.plugins:lemans-rest:0.1.0c' + + testCompile 'com.lemans.grails.plugins:lemans-testing:0.1.0a' + + // TODO: inline the 1 template as a GString +// compile 'org.springframework.boot:spring-boot-starter-freemarker' +// compile 'org.freemarker:freemarker:2.3.14' + + compile 'javax.mail:mail:1.4' + compile 'dumbster:dumbster:1.6' +} + +bootRun { + jvmArgs('-Dspring.output.ansi.enabled=always') +} + +war { + archiveName = 'contact-newsletter-service.war' +} + +//Extra Lemans Config Section: + +grails { + // deals with 'command line too long' issue when running Grails commands in Idea + pathingJar = true +} + +tasks.withType(Test) { + testLogging { + showStandardStreams = true + } + systemProperties System.properties +} + +tasks.withType(JavaExec) { + systemProperties System.properties +} + +codenarc { + toolVersion = '0.26.0' + configFile = file("${project.projectDir}/codenarc/rules.groovy") +} Index: codenarc/rules.groovy =================================================================== diff -u --- codenarc/rules.groovy (revision 0) +++ codenarc/rules.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,75 @@ +ruleset { + ruleset('rulesets/basic.xml') + ruleset('rulesets/braces.xml') + ruleset('rulesets/concurrency.xml') + ruleset('rulesets/convention.xml') { + exclude 'NoDef' + exclude 'NoTabCharacter' + exclude 'TrailingComma' + } + ruleset('rulesets/design.xml') { + exclude 'AbstractClassWithoutAbstractMethod' + exclude 'EmptyMethodInAbstractClass' + } + ruleset('rulesets/dry.xml') { + exclude 'DuplicateListLiteral' + exclude 'DuplicateNumberLiteral' + exclude 'DuplicateMapLiteral' + exclude 'DuplicateStringLiteral' + } + ruleset('rulesets/enhanced.xml') + ruleset('rulesets/exceptions.xml') + ruleset('rulesets/formatting.xml') { + exclude 'ClassJavadoc' + exclude 'ConsecutiveBlankLines' + LineLength { + length = 140 // should fit in a tweet - kkrebs ;=} + } + SpaceAroundMapEntryColon { + characterAfterColonRegex = /\s/ + } + exclude 'TrailingWhitespace' + } + ruleset('rulesets/generic.xml') + ruleset('rulesets/grails.xml') { + exclude 'GrailsDomainHasEquals' + exclude 'GrailsDomainHasToString' + } + ruleset('rulesets/groovyism.xml') + ruleset('rulesets/imports.xml') + ruleset('rulesets/jdbc.xml') + ruleset('rulesets/junit.xml') + ruleset('rulesets/logging.xml') + ruleset('rulesets/naming.xml') { + exclude 'FactoryMethodName' + MethodName { // helps Spock + regex = /[a-zA-Z#][_#\w\s'"\(\)]*/ + } + PropertyName { + regex = /[a-z][_a-zA-Z0-9]*/ + } + } + ruleset('rulesets/security.xml') { + exclude 'JavaIoPackageAccess' + } + ruleset('rulesets/serialization.xml') + ruleset('rulesets/size.xml') { + CyclomaticComplexity { // Requires the GMetrics jar + maxMethodComplexity = 10 + } + MethodSize { + maxLines = 26 + doNotApplyToClassNames = '*Spec' + } + MethodSize { + maxLines = 41 + applyToClassNames = '*Spec' + } + } + ruleset('rulesets/unnecessary.xml') { + UnnecessaryBooleanExpression { + doNotApplyToClassNames = '*Spec*' + } + } + ruleset('rulesets/unused.xml') +} \ No newline at end of file Index: gradle.properties =================================================================== diff -u --- gradle.properties (revision 0) +++ gradle.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,2 @@ +grailsVersion=3.2.4 +gradleWrapperVersion=3.1 Index: gradle/wrapper/gradle-wrapper.jar =================================================================== diff -u Binary files differ Index: gradle/wrapper/gradle-wrapper.properties =================================================================== diff -u --- gradle/wrapper/gradle-wrapper.properties (revision 0) +++ gradle/wrapper/gradle-wrapper.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,6 @@ +#Thu Mar 23 14:09:57 CDT 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip Index: gradlew =================================================================== diff -u --- gradlew (revision 0) +++ gradlew (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,169 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" Index: gradlew.bat =================================================================== diff -u --- gradlew.bat (revision 0) +++ gradlew.bat (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega Index: grails-app/conf/application.yml =================================================================== diff -u --- grails-app/conf/application.yml (revision 0) +++ grails-app/conf/application.yml (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,132 @@ +--- +grails: + profile: rest-api + codegen: + defaultPackage: com.lemans.cnl + spring: + transactionManagement: + proxies: false +info: + app: + name: '@info.app.name@' + version: '@info.app.version@' + grailsVersion: '@info.app.grailsVersion@' +spring: + main: + banner-mode: "off" + groovy: + template: + check-template-location: false + jmx: + default-domain: contact-newsletter-service + +# Spring Actuator Endpoints are Disabled by Default +endpoints: + enabled: false + jmx: + enabled: true + +--- +grails: + mime: + disable: + accept: + header: + userAgents: + - Gecko + - WebKit + - Presto + - Trident + types: + json: + - application/json + - text/json + hal: + - application/hal+json + - application/hal+xml + xml: + - text/xml + - application/xml + atom: application/atom+xml + css: text/css + csv: text/csv + js: text/javascript + rss: application/rss+xml + text: text/plain + all: '*/*' + urlmapping: + cache: + maxsize: 1000 + controllers: + defaultScope: singleton + converters: + encoding: UTF-8 + databinding: + dateFormats: + - yyyy-MM-dd'T'hh:mm:ss + - yyyy-MM-dd + +--- +hibernate: + cache: + queries: false + use_second_level_cache: false + use_query_cache: false + region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory + format_sql: true + dialect: org.hibernate.dialect.SQLServer2008Dialect + +dataSources: + dataSource: + dbCreate: none + pooled: true + jmxExport: true + driverClassName: net.sourceforge.jtds.jdbc.Driver + catalogRequest: + dbCreate: none + pooled: true + jmxExport: true + driverClassName: net.sourceforge.jtds.jdbc.Driver + +environments: + development: + dataSources: + dataSource: + url: jdbc:jtds:sqlserver://dev-dbprod02vm/brandsite_contact + username: brandsite_contact_user + password: DevPassword1 + logSql: true + catalogRequest: + url: jdbc:jtds:sqlserver://dev-dbprod02vm/CatalogRequest + username: catalog_request_user + password: DevPassword1 + logSql: true + test: + dataSources: + dataSource: + url: jdbc:jtds:sqlserver://dev-dbprod02vm/brandsite_contact + username: brandsite_contact_user + password: DevPassword1 + logSql: true + catalogRequest: + url: jdbc:jtds:sqlserver://dev-dbprod02vm/CatalogRequest + username: catalog_request_user + password: DevPassword1 + logSql: true + production: + dataSources: + dataSource: + jndiName: java:comp/env/jdbc/brandSiteContact + logSql: false + catalogRequest: + jndiName: java:comp/env/jdbc/catalogRequest + logSql: false + + +--- +--- +server: + contextPath: /contact-newsletter-service + +management: + context_path: /admin Index: grails-app/conf/logback.groovy =================================================================== diff -u --- grails-app/conf/logback.groovy (revision 0) +++ grails-app/conf/logback.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,39 @@ +import grails.util.BuildSettings +import grails.util.Environment +import org.springframework.boot.logging.logback.ColorConverter +import org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter + +import java.nio.charset.Charset + +conversionRule 'clr', ColorConverter +conversionRule 'wex', WhitespaceThrowableProxyConverter + +// See http://logback.qos.ch/manual/groovy.html for details on configuration +appender('STDOUT', ConsoleAppender) { + encoder(PatternLayoutEncoder) { + charset = Charset.forName('UTF-8') + + pattern = + '%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} ' + // Date + '%clr(%5p) ' + // Log level + '%clr(---){faint} %clr([%15.15t]){faint} ' + // Thread + '%clr(%-40.40logger{39}){cyan} %clr(:){faint} ' + // Logger + '%m%n%wex' // Message + } +} + +def targetDir = BuildSettings.TARGET_DIR +if (Environment.isDevelopmentMode() && targetDir != null) { + appender("FULL_STACKTRACE", FileAppender) { + file = "${targetDir}/stacktrace.log" + append = true + encoder(PatternLayoutEncoder) { + pattern = "%level %logger - %msg%n" + } + } + logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false) + root(ERROR, ['STDOUT', 'FULL_STACKTRACE']) +} +else { + root(ERROR, ['STDOUT']) +} Index: grails-app/conf/spring/resources.groovy =================================================================== diff -u --- grails-app/conf/spring/resources.groovy (revision 0) +++ grails-app/conf/spring/resources.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,32 @@ +import com.lemans.cnl.TemplateEngine +import grails.plugin.dumbster.Dumbster +import grails.util.Environment +import org.springframework.mail.javamail.JavaMailSenderImpl + +beans = { + + Environment current = Environment.current + if (current != Environment.PRODUCTION) { + authServiceContext(String, 'http://services3.dev.lemanscorp.com/auth-service/verifyRequest') + } + else { + authServiceContext(org.springframework.jndi.JndiObjectFactoryBean) { + jndiName = 'java:comp/env/authServiceContext' + } + } + + mailSender(JavaMailSenderImpl) { + if (Environment.TEST == Environment.current) { host = 'localhost' } + else { host = 'smtp.lemanscorp.com' } + } + + templateEngine(TemplateEngine) + + if (current != Environment.PRODUCTION) { + dumbster(Dumbster) { bean -> + grailsApplication = application + bean.initMethod = 'start' + bean.destroyMethod = 'stop' + } + } +} Index: grails-app/controllers/com/lemans/cnl/CatalogRequestController.groovy =================================================================== diff -u --- grails-app/controllers/com/lemans/cnl/CatalogRequestController.groovy (revision 0) +++ grails-app/controllers/com/lemans/cnl/CatalogRequestController.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,23 @@ +package com.lemans.cnl + +import com.lemans.LemansApiController + +class CatalogRequestController extends LemansApiController implements LemansLegacyPackager { + + def catalogRequestService + + def add() { + Map values = request.JSON.CatalogRequest + CatalogRequest catalogRequest = new CatalogRequest(values) + catalogRequest.domainId = params.int('dm') + catalogRequest.validate() + + if (catalogRequest.hasErrors()) { + render toJson(header: [status: 'error'], errors: collectLegacyErrors(catalogRequest)) + } + else { + int results = catalogRequestService.requestCatalog(catalogRequest) + render toJson(message: results == 0 ? 'Success' : 'Error') + } + } +} Index: grails-app/controllers/com/lemans/cnl/ContactEmailController.groovy =================================================================== diff -u --- grails-app/controllers/com/lemans/cnl/ContactEmailController.groovy (revision 0) +++ grails-app/controllers/com/lemans/cnl/ContactEmailController.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,15 @@ +package com.lemans.cnl + +import com.lemans.LemansApiController + +class ContactEmailController extends LemansApiController implements LemansLegacyPackager { + + def contactManagerService + + def add() { + Map values = request.JSON.Contact_Email + ContactEmail contactEmail = contactManagerService.saveContactEmail(values) + if (contactEmail.hasErrors()) { render toJson(header: [status: 'error'], errors: collectLegacyErrors(contactEmail)) } + else { render toJson([message: 'Success']) } + } +} Index: grails-app/controllers/com/lemans/cnl/NewsLetterController.groovy =================================================================== diff -u --- grails-app/controllers/com/lemans/cnl/NewsLetterController.groovy (revision 0) +++ grails-app/controllers/com/lemans/cnl/NewsLetterController.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,15 @@ +package com.lemans.cnl + +import com.lemans.LemansApiController + + +class NewsLetterController extends LemansApiController { + + def contactManagerService + + def add() { + Map values = request.JSON.News_Letter + contactManagerService.saveNewsLetter(values) + render toJson([message: 'Success']) + } +} Index: grails-app/controllers/contact/newsletter/service/ApplicationController.groovy =================================================================== diff -u --- grails-app/controllers/contact/newsletter/service/ApplicationController.groovy (revision 0) +++ grails-app/controllers/contact/newsletter/service/ApplicationController.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,15 @@ +package contact.newsletter.service + +import grails.core.GrailsApplication +import grails.plugins.GrailsPluginManager +import grails.plugins.PluginManagerAware + +class ApplicationController implements PluginManagerAware { + + GrailsApplication grailsApplication + GrailsPluginManager pluginManager + + def index() { + [grailsApplication: grailsApplication, pluginManager: pluginManager] + } +} Index: grails-app/controllers/contact/newsletter/service/DumbsterController.groovy =================================================================== diff -u --- grails-app/controllers/contact/newsletter/service/DumbsterController.groovy (revision 0) +++ grails-app/controllers/contact/newsletter/service/DumbsterController.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,23 @@ +package contact.newsletter.service + +import com.lemans.LemansApiController + + +class DumbsterController extends LemansApiController { + + def dumbster + + def index() { + if (dumbster) { + render toJson(dumbster.messages) + } + else { notFound() } + } + + def reset() { + if (dumbster) { + dumbster.reset() + } + else { notFound() } + } +} Index: grails-app/controllers/contact/newsletter/service/UrlMappings.groovy =================================================================== diff -u --- grails-app/controllers/contact/newsletter/service/UrlMappings.groovy (revision 0) +++ grails-app/controllers/contact/newsletter/service/UrlMappings.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,19 @@ +package contact.newsletter.service + +class UrlMappings { + + static mappings = { + + "/dm/$dm/newsLetter"(controller: 'newsLetter') { + action = [POST: 'add'] + } + + "/dm/$dm/contactEmail"(controller: 'contactEmail') { + action = [POST: 'add'] + } + + "/dm/$dm/catalogRequest"(controller: 'catalogRequest') { + action = [POST: 'add'] + } + } +} Index: grails-app/domain/com/lemans/cnl/BrandSite.groovy =================================================================== diff -u --- grails-app/domain/com/lemans/cnl/BrandSite.groovy (revision 0) +++ grails-app/domain/com/lemans/cnl/BrandSite.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,24 @@ +package com.lemans.cnl + +class BrandSite { + + int id + + String name + String website + + static constraints = { + name maxSize: 100 + website maxSize: 100 + } + + static mapping = { + table 'brand_sites' + id column: 'brand_Site_Id' + contactEmail column: 'brand_Site_Id' + recipients column: 'brand_Site_Id' + version false + } + + static hasMany =[contactEmail: ContactEmail, recipients: Recipient] +} Index: grails-app/domain/com/lemans/cnl/CatalogRequest.groovy =================================================================== diff -u --- grails-app/domain/com/lemans/cnl/CatalogRequest.groovy (revision 0) +++ grails-app/domain/com/lemans/cnl/CatalogRequest.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,30 @@ +package com.lemans.cnl + +@SuppressWarnings(['GrailsDomainReservedSqlKeywordName']) +class CatalogRequest { + + Integer domainId + String firstName + String lastName + String mailingAddress1 + String mailingAddress2 + String city + String state + String postalCode + String countryCode + String region + String emailAddress + + static constraints = { + firstName blank: false, maxSize: 50 + lastName blank: false, maxSize: 50 + mailingAddress1 blank: false, maxSize: 150 + mailingAddress2 nullable: true, maxSize: 50 + city blank: false, maxSize: 50 + state blank: false, maxSize: 2 + postalCode nullable: true, maxSize: 20 + countryCode nullable: true, maxSize: 2 + region nullable: true, maxSize: 20 + emailAddress nullable: true, email: true, maxSize: 50 + } +} Index: grails-app/domain/com/lemans/cnl/ContactEmail.groovy =================================================================== diff -u --- grails-app/domain/com/lemans/cnl/ContactEmail.groovy (revision 0) +++ grails-app/domain/com/lemans/cnl/ContactEmail.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,30 @@ +package com.lemans.cnl + +class ContactEmail { + + Integer id + + String fromName + String fromAddress + String subject + String message + Date sentTime + String spam + BrandSite brandSite + + static constraints = { + fromName blank: false, maxSize: 100 + fromAddress blank: false, email: true, maxSize: 100 + subject blank: false, maxSize: 100 + spam nullable: true + brandSite blank: false + } + + static mapping = { + table 'contact_emails' + id column: 'contact_email_id' + brandSite column: 'brand_site_id' + message type: 'text' + version false + } +} Index: grails-app/domain/com/lemans/cnl/Recipient.groovy =================================================================== diff -u --- grails-app/domain/com/lemans/cnl/Recipient.groovy (revision 0) +++ grails-app/domain/com/lemans/cnl/Recipient.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,22 @@ +package com.lemans.cnl + +class Recipient { + Integer id + String recipientName + String recipientAddress + Integer recipientAddressStatus + + BrandSite brandSite + + static constraints = { + recipientName maxSize: 100 + recipientAddress maxSize: 100 + } + + static mapping = { + table 'recipients' + id column: 'recipient_id' + brandSite column: 'brand_site_id' + version false + } +} Index: grails-app/i18n/messages.properties =================================================================== diff -u --- grails-app/i18n/messages.properties (revision 0) +++ grails-app/i18n/messages.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,56 @@ +default.doesnt.match.message=Property {0} with value {2} does not match the required pattern {3} +default.invalid.url.message=Property {0} with value {2} is not a valid URL +default.invalid.creditCard.message=Property {0} with value {2} is not a valid credit card number +default.invalid.email.message=Property {0} with value {2} is not a valid e-mail address +default.invalid.range.message=Property {0} with value {2} does not fall within the valid range from {3} to {4} +default.invalid.size.message=Property {0} with value {2} does not fall within the valid size range from {3} to {4} +default.invalid.max.message=Property {0} with value {2} exceeds maximum value {3} +default.invalid.min.message=Property {0} with value {2} is less than minimum value {3} +default.invalid.max.size.message=Property {0} with value {2} exceeds the maximum size of {3} +default.invalid.min.size.message=Property {0} with value {2} is less than the minimum size of {3} +default.invalid.validator.message=Property {0} with value {2} does not pass custom validation +default.not.inlist.message=Property {0} with value {2} is not contained within the list {3} +default.blank.message=Property {0} cannot be blank +default.not.equal.message=Property {0} with value {2} cannot equal {3} +default.null.message=Property {0} cannot be null +default.not.unique.message=Property {0} with value {2} must be unique + +default.paginate.prev=Previous +default.paginate.next=Next +default.boolean.true=True +default.boolean.false=False +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} created +default.updated.message={0} {1} updated +default.deleted.message={0} {1} deleted +default.not.deleted.message={0} {1} could not be deleted +default.not.found.message={0} not found with id {1} +default.optimistic.locking.failure=Another user has updated this {0} while you were editing + +default.home.label=Home +default.list.label={0} List +default.add.label=Add {0} +default.new.label=New {0} +default.create.label=Create {0} +default.show.label=Show {0} +default.edit.label=Edit {0} + +default.button.create.label=Create +default.button.edit.label=Edit +default.button.update.label=Update +default.button.delete.label=Delete +default.button.delete.confirm.message=Are you sure? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Property {0} must be a valid URL +typeMismatch.java.net.URI=Property {0} must be a valid URI +typeMismatch.java.util.Date=Property {0} must be a valid Date +typeMismatch.java.lang.Double=Property {0} must be a valid number +typeMismatch.java.lang.Integer=Property {0} must be a valid number +typeMismatch.java.lang.Long=Property {0} must be a valid number +typeMismatch.java.lang.Short=Property {0} must be a valid number +typeMismatch.java.math.BigDecimal=Property {0} must be a valid number +typeMismatch.java.math.BigInteger=Property {0} must be a valid number +typeMismatch=Property {0} is type-mismatched Index: grails-app/i18n/messages_cs_CZ.properties =================================================================== diff -u --- grails-app/i18n/messages_cs_CZ.properties (revision 0) +++ grails-app/i18n/messages_cs_CZ.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neodpovídá požadovanému vzoru [{3}] +default.invalid.url.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní URL +default.invalid.creditCard.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní číslo kreditní karty +default.invalid.email.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní emailová adresa +default.invalid.range.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] +default.invalid.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] +default.invalid.max.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální povolenou hodnotu [{3}] +default.invalid.min.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální povolená hodnota [{3}] +default.invalid.max.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální velikost [{3}] +default.invalid.min.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální velikost [{3}] +default.invalid.validator.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neprošla validací +default.not.inlist.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není obsažena v seznamu [{3}] +default.blank.message=Položka [{0}] třídy [{1}] nemůže být prázdná +default.not.equal.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] nemůže být stejná jako [{3}] +default.null.message=Položka [{0}] třídy [{1}] nemůže být prázdná +default.not.unique.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] musí být unikátní + +default.paginate.prev=Předcházející +default.paginate.next=Následující +default.boolean.true=Pravda +default.boolean.false=Nepravda +default.date.format=dd. MM. yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} vytvořeno +default.updated.message={0} {1} aktualizováno +default.deleted.message={0} {1} smazáno +default.not.deleted.message={0} {1} nelze smazat +default.not.found.message={0} nenalezen s id {1} +default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právě když byl vámi editován + +default.home.label=Domů +default.list.label={0} Seznam +default.add.label=Přidat {0} +default.new.label=Nový {0} +default.create.label=Vytvořit {0} +default.show.label=Ukázat {0} +default.edit.label=Editovat {0} + +default.button.create.label=Vytvoř +default.button.edit.label=Edituj +default.button.update.label=Aktualizuj +default.button.delete.label=Smaž +default.button.delete.confirm.message=Jste si jistý? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Položka {0} musí být validní URL +typeMismatch.java.net.URI=Položka {0} musí být validní URI +typeMismatch.java.util.Date=Položka {0} musí být validní datum +typeMismatch.java.lang.Double=Položka {0} musí být validní desetinné číslo +typeMismatch.java.lang.Integer=Položka {0} musí být validní číslo +typeMismatch.java.lang.Long=Položka {0} musí být validní číslo +typeMismatch.java.lang.Short=Položka {0} musí být validní číslo +typeMismatch.java.math.BigDecimal=Položka {0} musí být validní číslo +typeMismatch.java.math.BigInteger=Položka {0} musí být validní číslo Index: grails-app/i18n/messages_da.properties =================================================================== diff -u --- grails-app/i18n/messages_da.properties (revision 0) +++ grails-app/i18n/messages_da.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,56 @@ +default.doesnt.match.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke mønsteret [{3}] +default.invalid.url.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig URL +default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke et gyldigt kreditkortnummer +default.invalid.email.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig e-mail adresse +default.invalid.range.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for intervallet fra [{3}] til [{4}] +default.invalid.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for størrelsen fra [{3}] til [{4}] +default.invalid.max.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale værdi [{3}] +default.invalid.min.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale værdi [{3}] +default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale størrelse på [{3}] +default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale størrelse på [{3}] +default.invalid.validator.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke den brugerdefinerede validering +default.not.inlist.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] findes ikke i listen [{3}] +default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom +default.not.equal.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] må ikke være [{3}] +default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null +default.not.unique.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] skal være unik + +default.paginate.prev=Forrige +default.paginate.next=Næste +default.boolean.true=Sand +default.boolean.false=Falsk +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} oprettet +default.updated.message={0} {1} opdateret +default.deleted.message={0} {1} slettet +default.not.deleted.message={0} {1} kunne ikke slettes +default.not.found.message={0} med id {1} er ikke fundet +default.optimistic.locking.failure=En anden bruger har opdateret denne {0} imens du har lavet rettelser + +default.home.label=Hjem +default.list.label={0} Liste +default.add.label=Tilføj {0} +default.new.label=Ny {0} +default.create.label=Opret {0} +default.show.label=Vis {0} +default.edit.label=Ret {0} + +default.button.create.label=Opret +default.button.edit.label=Ret +default.button.update.label=Opdater +default.button.delete.label=Slet +default.button.delete.confirm.message=Er du sikker? + +# Databindingsfejl. Brug "typeMismatch.$className.$propertyName for at passe til en given klasse (f.eks typeMismatch.Book.author) +typeMismatch.java.net.URL=Feltet {0} skal være en valid URL +typeMismatch.java.net.URI=Feltet {0} skal være en valid URI +typeMismatch.java.util.Date=Feltet {0} skal være en valid Dato +typeMismatch.java.lang.Double=Feltet {0} skal være et valid tal +typeMismatch.java.lang.Integer=Feltet {0} skal være et valid tal +typeMismatch.java.lang.Long=Feltet {0} skal være et valid tal +typeMismatch.java.lang.Short=Feltet {0} skal være et valid tal +typeMismatch.java.math.BigDecimal=Feltet {0} skal være et valid tal +typeMismatch.java.math.BigInteger=Feltet {0} skal være et valid tal + Index: grails-app/i18n/messages_de.properties =================================================================== diff -u --- grails-app/i18n/messages_de.properties (revision 0) +++ grails-app/i18n/messages_de.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}] +default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL +default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer +default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse +default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] +default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] +default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}] +default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}] +default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}] +default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}] +default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig +default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten. +default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein +default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein +default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein +default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen + +default.paginate.prev=Vorherige +default.paginate.next=Nächste +default.boolean.true=Wahr +default.boolean.false=Falsch +default.date.format=dd.MM.yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} wurde angelegt +default.updated.message={0} {1} wurde geändert +default.deleted.message={0} {1} wurde gelöscht +default.not.deleted.message={0} {1} konnte nicht gelöscht werden +default.not.found.message={0} mit der id {1} wurde nicht gefunden +default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben + +default.home.label=Home +default.list.label={0} Liste +default.add.label={0} hinzufügen +default.new.label={0} anlegen +default.create.label={0} anlegen +default.show.label={0} anzeigen +default.edit.label={0} bearbeiten + +default.button.create.label=Anlegen +default.button.edit.label=Bearbeiten +default.button.update.label=Aktualisieren +default.button.delete.label=Löschen +default.button.delete.confirm.message=Sind Sie sicher? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein +typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein +typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein +typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein Index: grails-app/i18n/messages_es.properties =================================================================== diff -u --- grails-app/i18n/messages_es.properties (revision 0) +++ grails-app/i18n/messages_es.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] +default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida +default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida +default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida +default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] +default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] +default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] +default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] +default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] +default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] +default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido +default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] +default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía +default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] +default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo +default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única + +default.paginate.prev=Anterior +default.paginate.next=Siguiente +default.boolean.true=Verdadero +default.boolean.false=Falso +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} creado +default.updated.message={0} {1} actualizado +default.deleted.message={0} {1} eliminado +default.not.deleted.message={0} {1} no puede eliminarse +default.not.found.message=No se encuentra {0} con id {1} +default.optimistic.locking.failure=Mientras usted editaba, otro usuario ha actualizado su {0} + +default.home.label=Principal +default.list.label={0} Lista +default.add.label=Agregar {0} +default.new.label=Nuevo {0} +default.create.label=Crear {0} +default.show.label=Mostrar {0} +default.edit.label=Editar {0} + +default.button.create.label=Crear +default.button.edit.label=Editar +default.button.update.label=Actualizar +default.button.delete.label=Eliminar +default.button.delete.confirm.message=¿Está usted seguro? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida +typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida +typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida +typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido +typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido +typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido +typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido +typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido +typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido \ No newline at end of file Index: grails-app/i18n/messages_fr.properties =================================================================== diff -u --- grails-app/i18n/messages_fr.properties (revision 0) +++ grails-app/i18n/messages_fr.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,19 @@ +default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] +default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide +default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide +default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide +default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] +default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] +default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] +default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] +default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] +default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] +default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide +default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] +default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide +default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] +default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle +default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique + +default.paginate.prev=Précédent +default.paginate.next=Suivant Index: grails-app/i18n/messages_it.properties =================================================================== diff -u --- grails-app/i18n/messages_it.properties (revision 0) +++ grails-app/i18n/messages_it.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] +default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido +default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido +default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido +default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] +default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] +default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] +default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] +default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] +default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] +default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida +default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] +default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota +default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] +default.null.message=La proprietà [{0}] della classe [{1}] non può essere null +default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica + +default.paginate.prev=Precedente +default.paginate.next=Successivo +default.boolean.true=Vero +default.boolean.false=Falso +default.date.format=dd/MM/yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} creato +default.updated.message={0} {1} aggiornato +default.deleted.message={0} {1} eliminato +default.not.deleted.message={0} {1} non può essere eliminato +default.not.found.message={0} non trovato con id {1} +default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica + +default.home.label=Home +default.list.label={0} Elenco +default.add.label=Aggiungi {0} +default.new.label=Nuovo {0} +default.create.label=Crea {0} +default.show.label=Mostra {0} +default.edit.label=Modifica {0} + +default.button.create.label=Crea +default.button.edit.label=Modifica +default.button.update.label=Aggiorna +default.button.delete.label=Elimina +default.button.delete.confirm.message=Si è sicuri? + +# Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) +typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido +typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido +typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida +typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido +typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido +typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido Index: grails-app/i18n/messages_ja.properties =================================================================== diff -u --- grails-app/i18n/messages_ja.properties (revision 0) +++ grails-app/i18n/messages_ja.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 +default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なURLではありません。 +default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なクレジットカード番号ではありません。 +default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なメールアドレスではありません。 +default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 +default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 +default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 +default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 +default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 +default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 +default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 +default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 +default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 +default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]に[{3}]は許可されません。 +default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 +default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 + +default.paginate.prev=戻る +default.paginate.next=次へ +default.boolean.true=はい +default.boolean.false=いいえ +default.date.format=yyyy/MM/dd HH:mm:ss z +default.number.format=0 + +default.created.message={0}(id:{1})を作成しました。 +default.updated.message={0}(id:{1})を更新しました。 +default.deleted.message={0}(id:{1})を削除しました。 +default.not.deleted.message={0}(id:{1})は削除できませんでした。 +default.not.found.message={0}(id:{1})は見つかりませんでした。 +default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。 + +default.home.label=ホーム +default.list.label={0}リスト +default.add.label={0}を追加 +default.new.label={0}を新規作成 +default.create.label={0}を作成 +default.show.label={0}詳細 +default.edit.label={0}を編集 + +default.button.create.label=作成 +default.button.edit.label=編集 +default.button.update.label=更新 +default.button.delete.label=削除 +default.button.delete.confirm.message=本当に削除してよろしいですか? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL={0}は有効なURLでなければなりません。 +typeMismatch.java.net.URI={0}は有効なURIでなければなりません。 +typeMismatch.java.util.Date={0}は有効な日付でなければなりません。 +typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。 +typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。 +typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。 +typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。 +typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。 +typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。 Index: grails-app/i18n/messages_nb.properties =================================================================== diff -u --- grails-app/i18n/messages_nb.properties (revision 0) +++ grails-app/i18n/messages_nb.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,56 @@ +default.doesnt.match.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke mønsteret [{3}] +default.invalid.url.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig URL +default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke et gyldig kredittkortnummer +default.invalid.email.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig epostadresse +default.invalid.range.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] +default.invalid.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] +default.invalid.max.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumsverdien på [{3}] +default.invalid.min.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er under minimumsverdien på [{3}] +default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumslengden på [{3}] +default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er kortere enn minimumslengden på [{3}] +default.invalid.validator.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke den brukerdefinerte valideringen +default.not.inlist.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] finnes ikke i listen [{3}] +default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom +default.not.equal.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] kan ikke være [{3}] +default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null +default.not.unique.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] må være unik + +default.paginate.prev=Forrige +default.paginate.next=Neste +default.boolean.true=Ja +default.boolean.false=Nei +default.date.format=dd.MM.yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} opprettet +default.updated.message={0} {1} oppdatert +default.deleted.message={0} {1} slettet +default.not.deleted.message={0} {1} kunne ikke slettes +default.not.found.message={0} med id {1} ble ikke funnet +default.optimistic.locking.failure=En annen bruker har oppdatert denne {0} mens du redigerte + +default.home.label=Hjem +default.list.label={0}liste +default.add.label=Legg til {0} +default.new.label=Ny {0} +default.create.label=Opprett {0} +default.show.label=Vis {0} +default.edit.label=Endre {0} + +default.button.create.label=Opprett +default.button.edit.label=Endre +default.button.update.label=Oppdater +default.button.delete.label=Slett +default.button.delete.confirm.message=Er du sikker? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Feltet {0} må være en gyldig URL +typeMismatch.java.net.URI=Feltet {0} må være en gyldig URI +typeMismatch.java.util.Date=Feltet {0} må være en gyldig dato +typeMismatch.java.lang.Double=Feltet {0} må være et gyldig tall +typeMismatch.java.lang.Integer=Feltet {0} må være et gyldig heltall +typeMismatch.java.lang.Long=Feltet {0} må være et gyldig heltall +typeMismatch.java.lang.Short=Feltet {0} må være et gyldig heltall +typeMismatch.java.math.BigDecimal=Feltet {0} må være et gyldig tall +typeMismatch.java.math.BigInteger=Feltet {0} må være et gyldig heltall + Index: grails-app/i18n/messages_nl.properties =================================================================== diff -u --- grails-app/i18n/messages_nl.properties (revision 0) +++ grails-app/i18n/messages_nl.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet overeen met het vereiste patroon [{3}] +default.invalid.url.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldige URL +default.invalid.creditCard.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig credit card nummer +default.invalid.email.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig e-mailadres +default.invalid.range.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige waardenreeks van [{3}] tot [{4}] +default.invalid.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige grootte van [{3}] tot [{4}] +default.invalid.max.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumwaarde [{3}] +default.invalid.min.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan de minimumwaarde [{3}] +default.invalid.max.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumgrootte van [{3}] +default.invalid.min.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan minimumgrootte van [{3}] +default.invalid.validator.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is niet geldig +default.not.inlist.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet voor in de lijst [{3}] +default.blank.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn +default.not.equal.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] mag niet gelijk zijn aan [{3}] +default.null.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn +default.not.unique.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] moet uniek zijn + +default.paginate.prev=Vorige +default.paginate.next=Volgende +default.boolean.true=Ja +default.boolean.false=Nee +default.date.format=dd-MM-yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} ingevoerd +default.updated.message={0} {1} gewijzigd +default.deleted.message={0} {1} verwijderd +default.not.deleted.message={0} {1} kon niet worden verwijderd +default.not.found.message={0} met id {1} kon niet worden gevonden +default.optimistic.locking.failure=Een andere gebruiker heeft deze {0} al gewijzigd + +default.home.label=Home +default.list.label={0} Overzicht +default.add.label=Toevoegen {0} +default.new.label=Invoeren {0} +default.create.label=Invoeren {0} +default.show.label=Details {0} +default.edit.label=Wijzigen {0} + +default.button.create.label=Invoeren +default.button.edit.label=Wijzigen +default.button.update.label=Opslaan +default.button.delete.label=Verwijderen +default.button.delete.confirm.message=Weet je het zeker? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Attribuut {0} is geen geldige URL +typeMismatch.java.net.URI=Attribuut {0} is geen geldige URI +typeMismatch.java.util.Date=Attribuut {0} is geen geldige datum +typeMismatch.java.lang.Double=Attribuut {0} is geen geldig nummer +typeMismatch.java.lang.Integer=Attribuut {0} is geen geldig nummer +typeMismatch.java.lang.Long=Attribuut {0} is geen geldig nummer +typeMismatch.java.lang.Short=Attribuut {0} is geen geldig nummer +typeMismatch.java.math.BigDecimal=Attribuut {0} is geen geldig nummer +typeMismatch.java.math.BigInteger=Attribuut {0} is geen geldig nummer Index: grails-app/i18n/messages_pl.properties =================================================================== diff -u --- grails-app/i18n/messages_pl.properties (revision 0) +++ grails-app/i18n/messages_pl.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,59 @@ +# +# Translated by Matthias Hryniszak - padcom@gmail.com +# + +default.doesnt.match.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie pasuje do wymaganego wzorca [{3}] +default.invalid.url.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest niepoprawnym adresem URL +default.invalid.creditCard.message=Właściwość [{0}] klasy [{1}] with value [{2}] nie jest poprawnym numerem karty kredytowej +default.invalid.email.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie jest poprawnym adresem e-mail +default.invalid.range.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się zakładanym zakresie od [{3}] do [{4}] +default.invalid.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się w zakładanym zakresie rozmiarów od [{3}] do [{4}] +default.invalid.max.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] przekracza maksymalną wartość [{3}] +default.invalid.min.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest mniejsza niż minimalna wartość [{3}] +default.invalid.max.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] przekracza maksymalny rozmiar [{3}] +default.invalid.min.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest mniejsza niż minimalny rozmiar [{3}] +default.invalid.validator.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie spełnia założonych niestandardowych warunków +default.not.inlist.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się w liście [{3}] +default.blank.message=Właściwość [{0}] klasy [{1}] nie może być pusta +default.not.equal.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie może równać się [{3}] +default.null.message=Właściwość [{0}] klasy [{1}] nie może być null +default.not.unique.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] musi być unikalna + +default.paginate.prev=Poprzedni +default.paginate.next=Następny +default.boolean.true=Prawda +default.boolean.false=Fałsz +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message=Utworzono {0} {1} +default.updated.message=Zaktualizowano {0} {1} +default.deleted.message=Usunięto {0} {1} +default.not.deleted.message={0} {1} nie mógł zostać usunięty +default.not.found.message=Nie znaleziono {0} o id {1} +default.optimistic.locking.failure=Inny użytkownik zaktualizował ten obiekt {0} w trakcie twoich zmian + +default.home.label=Strona domowa +default.list.label=Lista {0} +default.add.label=Dodaj {0} +default.new.label=Utwórz {0} +default.create.label=Utwórz {0} +default.show.label=Pokaż {0} +default.edit.label=Edytuj {0} + +default.button.create.label=Utwórz +default.button.edit.label=Edytuj +default.button.update.label=Zaktualizuj +default.button.delete.label=Usuń +default.button.delete.confirm.message=Czy jesteś pewien? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Właściwość {0} musi być poprawnym adresem URL +typeMismatch.java.net.URI=Właściwość {0} musi być poprawnym adresem URI +typeMismatch.java.util.Date=Właściwość {0} musi być poprawną datą +typeMismatch.java.lang.Double=Właściwość {0} musi być poprawnyą liczbą +typeMismatch.java.lang.Integer=Właściwość {0} musi być poprawnyą liczbą +typeMismatch.java.lang.Long=Właściwość {0} musi być poprawnyą liczbą +typeMismatch.java.lang.Short=Właściwość {0} musi być poprawnyą liczbą +typeMismatch.java.math.BigDecimal=Właściwość {0} musi być poprawnyą liczbą +typeMismatch.java.math.BigInteger=Właściwość {0} musi być poprawnyą liczbą Index: grails-app/i18n/messages_pt_BR.properties =================================================================== diff -u --- grails-app/i18n/messages_pt_BR.properties (revision 0) +++ grails-app/i18n/messages_pt_BR.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,59 @@ +# +# Translated by Lucas Teixeira - lucastex@gmail.com +# + +default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] +default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida +default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito +default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. +default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] +default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] +default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] +default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] +default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] +default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] +default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação +default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] +default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco +default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] +default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único + +default.paginate.prev=Anterior +default.paginate.next=Próximo +default.boolean.true=Sim +default.boolean.false=Não +default.date.format=dd/MM/yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} criado +default.updated.message={0} {1} atualizado +default.deleted.message={0} {1} removido +default.not.deleted.message={0} {1} não pode ser removido +default.not.found.message={0} não foi encontrado com o id {1} +default.optimistic.locking.failure=Outro usuário atualizou este [{0}] enquanto você tentou salvá-lo + +default.home.label=Principal +default.list.label={0} Listagem +default.add.label=Adicionar {0} +default.new.label=Novo {0} +default.create.label=Criar {0} +default.show.label=Ver {0} +default.edit.label=Editar {0} + +default.button.create.label=Criar +default.button.edit.label=Editar +default.button.update.label=Alterar +default.button.delete.label=Remover +default.button.delete.confirm.message=Tem certeza? + +# Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. +typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. +typeMismatch.java.util.Date=O campo {0} deve ser uma data válida +typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. Index: grails-app/i18n/messages_pt_PT.properties =================================================================== diff -u --- grails-app/i18n/messages_pt_PT.properties (revision 0) +++ grails-app/i18n/messages_pt_PT.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,34 @@ +# +# translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com +# + +default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] +default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido +default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito +default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. +default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] +default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] +default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] +default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] +default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] +default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] +default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação +default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] +default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] +default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único + +default.paginate.prev=Anterior +default.paginate.next=Próximo + +# Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) +typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. +typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. +typeMismatch.java.util.Date=O campo {0} deve ser uma data válida +typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. +typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. Index: grails-app/i18n/messages_ru.properties =================================================================== diff -u --- grails-app/i18n/messages_ru.properties (revision 0) +++ grails-app/i18n/messages_ru.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,31 @@ +default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] +default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом +default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты +default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом +default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] +default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] +default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] +default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] +default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] +default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] +default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо +default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] +default.blank.message=Поле [{0}] класса [{1}] не может быть пустым +default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] +default.null.message=Поле [{0}] класса [{1}] не может иметь значение null +default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным + +default.paginate.prev=Предыдушая страница +default.paginate.next=Следующая страница + +# Ошибки при присвоении данных. Для точной настройки для полей классов используйте +# формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) +typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL +typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI +typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой +typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом +typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом +typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом +typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом +typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом +typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом Index: grails-app/i18n/messages_sv.properties =================================================================== diff -u --- grails-app/i18n/messages_sv.properties (revision 0) +++ grails-app/i18n/messages_sv.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=Attributet [{0}] för klassen [{1}] med värde [{2}] matchar inte mot uttrycket [{3}] +default.invalid.url.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig URL +default.invalid.creditCard.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte ett giltigt kreditkortsnummer +default.invalid.email.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig e-postadress +default.invalid.range.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte inom intervallet [{3}] till [{4}] +default.invalid.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] har en storlek som inte är inom [{3}] till [{4}] +default.invalid.max.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxvärdet [{3}] +default.invalid.min.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimivärdet [{3}] +default.invalid.max.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxstorleken [{3}] +default.invalid.min.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimistorleken [{3}] +default.invalid.validator.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt enligt anpassad regel +default.not.inlist.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt, måste vara ett av [{3}] +default.blank.message=Attributet [{0}] för klassen [{1}] får inte vara tomt +default.not.equal.message=Attributet [{0}] för klassen [{1}] med värde [{2}] får inte vara lika med [{3}] +default.null.message=Attributet [{0}] för klassen [{1}] får inte vara tomt +default.not.unique.message=Attributet [{0}] för klassen [{1}] med värde [{2}] måste vara unikt + +default.paginate.prev=Föregående +default.paginate.next=Nästa +default.boolean.true=Sant +default.boolean.false=Falskt +default.date.format=yyyy-MM-dd HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} skapades +default.updated.message={0} {1} uppdaterades +default.deleted.message={0} {1} borttagen +default.not.deleted.message={0} {1} kunde inte tas bort +default.not.found.message={0} med id {1} kunde inte hittas +default.optimistic.locking.failure=En annan användare har uppdaterat det här {0} objektet medan du redigerade det + +default.home.label=Hem +default.list.label= {0} - Lista +default.add.label=Lägg till {0} +default.new.label=Skapa {0} +default.create.label=Skapa {0} +default.show.label=Visa {0} +default.edit.label=Ändra {0} + +default.button.create.label=Skapa +default.button.edit.label=Ändra +default.button.update.label=Uppdatera +default.button.delete.label=Ta bort +default.button.delete.confirm.message=Är du säker? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Värdet för {0} måste vara en giltig URL +typeMismatch.java.net.URI=Värdet för {0} måste vara en giltig URI +typeMismatch.java.util.Date=Värdet {0} måste vara ett giltigt datum +typeMismatch.java.lang.Double=Värdet {0} måste vara ett giltigt nummer +typeMismatch.java.lang.Integer=Värdet {0} måste vara ett giltigt heltal +typeMismatch.java.lang.Long=Värdet {0} måste vara ett giltigt heltal +typeMismatch.java.lang.Short=Värdet {0} måste vara ett giltigt heltal +typeMismatch.java.math.BigDecimal=Värdet {0} måste vara ett giltigt nummer +typeMismatch.java.math.BigInteger=Värdet {0} måste vara ett giltigt heltal \ No newline at end of file Index: grails-app/i18n/messages_th.properties =================================================================== diff -u --- grails-app/i18n/messages_th.properties (revision 0) +++ grails-app/i18n/messages_th.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,55 @@ +default.doesnt.match.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบที่กำหนดไว้ใน [{3}] +default.invalid.url.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบ URL +default.invalid.creditCard.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบหมายเลขบัตรเครดิต +default.invalid.email.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบอีเมล์ +default.invalid.range.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] +default.invalid.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] +default.invalid.max.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}] +default.invalid.min.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้อยกว่าค่าต่ำสุด [{3}] +default.invalid.max.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเกินกว่าขนาดมากสุดของ [{3}] +default.invalid.min.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำกว่าขนาดต่ำสุดของ [{3}] +default.invalid.validator.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านการทวนสอบค่าที่ตั้งขึ้น +default.not.inlist.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้อยู่ในรายการต่อไปนี้ [{3}] +default.blank.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็นค่าว่างได้ +default.not.equal.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่ากับ [{3}] ได้ +default.null.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็น null ได้ +default.not.unique.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้องไม่ซ้ำ (unique) + +default.paginate.prev=ก่อนหน้า +default.paginate.next=ถัดไป +default.boolean.true=จริง +default.boolean.false=เท็จ +default.date.format=dd-MM-yyyy HH:mm:ss z +default.number.format=0 + +default.created.message=สร้าง {0} {1} เรียบร้อยแล้ว +default.updated.message=ปรับปรุง {0} {1} เรียบร้อยแล้ว +default.deleted.message=ลบ {0} {1} เรียบร้อยแล้ว +default.not.deleted.message=ไม่สามารถลบ {0} {1} +default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ +default.optimistic.locking.failure=มีผู้ใช้ท่านอื่นปรับปรุง {0} ขณะที่คุณกำลังแก้ไขข้อมูลอยู่ + +default.home.label=หน้าแรก +default.list.label=รายการ {0} +default.add.label=เพิ่ม {0} +default.new.label=สร้าง {0} ใหม่ +default.create.label=สร้าง {0} +default.show.label=แสดง {0} +default.edit.label=แก้ไข {0} + +default.button.create.label=สร้าง +default.button.edit.label=แก้ไข +default.button.update.label=ปรับปรุง +default.button.delete.label=ลบ +default.button.delete.confirm.message=คุณแน่ใจหรือไม่ ? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้องเป็นค่า URL ที่ถูกต้อง +typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้องเป็นค่า URI ที่ถูกต้อง +typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้องมีค่าเป็นวันที่ +typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Double +typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Integer +typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Long +typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Short +typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigDecimal +typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigInteger Index: grails-app/i18n/messages_zh_CN.properties =================================================================== diff -u --- grails-app/i18n/messages_zh_CN.properties (revision 0) +++ grails-app/i18n/messages_zh_CN.properties (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,18 @@ +default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A +default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D +default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 +default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 +default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 +default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F +default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F +default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) +default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) +default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL +default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 +default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 +default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 +default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 +default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull +default.paginate.next=\u4E0B\u9875 +default.paginate.prev=\u4E0A\u9875 Index: grails-app/init/contact/newsletter/service/Application.groovy =================================================================== diff -u --- grails-app/init/contact/newsletter/service/Application.groovy (revision 0) +++ grails-app/init/contact/newsletter/service/Application.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,10 @@ +package contact.newsletter.service + +import grails.boot.GrailsApp +import grails.boot.config.GrailsAutoConfiguration + +class Application extends GrailsAutoConfiguration { + static void main(String[] args) { + GrailsApp.run(Application, args) + } +} Index: grails-app/init/contact/newsletter/service/BootStrap.groovy =================================================================== diff -u --- grails-app/init/contact/newsletter/service/BootStrap.groovy (revision 0) +++ grails-app/init/contact/newsletter/service/BootStrap.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,30 @@ +package contact.newsletter.service + +import com.dumbster.smtp.SmtpMessage + +class BootStrap { + + def init = { servletContext -> + enhanceSmtpMessageClass() + } + + def destroy = { + } + + private void enhanceSmtpMessageClass() { + MetaClass mc = SmtpMessage.metaClass + Closure split = { it.split(',')*.trim() } + mc.with { + getSubject = { -> delegate.getHeaderValue('Subject') } + getDate = { -> delegate.getHeaderValue('Date') } + getTo = { -> delegate.tos[0] } + getTos = { -> split(delegate.getHeaderValue('To')) } + getFrom = { -> delegate.froms[0] } + getFroms = { -> split(delegate.getHeaderValue('From')) } + getCc = { -> delegate.ccs[0] } + getCcs = { -> split(delegate.getHeaderValue('Cc')) } + getBcc = { -> delegate.bccs[0] } + getBccs = { -> split(delegate.getHeaderValue('Bcc')) } + } + } +} Index: grails-app/services/com/lemans/cnl/CatalogRequestService.groovy =================================================================== diff -u --- grails-app/services/com/lemans/cnl/CatalogRequestService.groovy (revision 0) +++ grails-app/services/com/lemans/cnl/CatalogRequestService.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,38 @@ +package com.lemans.cnl + +import com.lemans.services.LemansManager +import grails.transaction.Transactional + +@Transactional +class CatalogRequestService extends LemansManager { + + private static final String CATALOG_REQUEST_SQL = ''' +EXEC dbo.spInsertCatalogRequest( + @domainId=?, @firstName=?, @lastName=?, + @mailingAddress1=?, @mailingAddress2=?, @city=?, @state=?, @postalCode=?, + @countryCode=?, @region=?, @emailAddress=? +) +''' + + def dataSource_catalogRequest + + /** + * Requests the catalog for a brand site. + * + * @param CatalogRequest + * + * @return 0 for success and 1 for error + */ + int requestCatalog(CatalogRequest catalogRequest) { + sql(dataSource_catalogRequest).call(CATALOG_REQUEST_SQL, + [ + catalogRequest.domainId, catalogRequest.firstName, + catalogRequest.lastName, catalogRequest.mailingAddress1, + catalogRequest.mailingAddress2, catalogRequest.city, + catalogRequest.state, catalogRequest.postalCode, + catalogRequest.countryCode, catalogRequest.region, + catalogRequest.emailAddress + ] + ) + } +} Index: grails-app/services/com/lemans/cnl/ContactManagerService.groovy =================================================================== diff -u --- grails-app/services/com/lemans/cnl/ContactManagerService.groovy (revision 0) +++ grails-app/services/com/lemans/cnl/ContactManagerService.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,88 @@ +package com.lemans.cnl + +import grails.transaction.Transactional + +@Transactional +class ContactManagerService { + + def templateEngine + + def emailService + + /** + * Adds to the news letter list if not registered. + * + * @param values Map of property values + */ + void saveNewsLetter(Map values) { + String brandSiteId = values.brandSiteId + def brandSiteIds = brandSiteId.isNumber() ? brandSiteId : brandSiteId.split(',') + + brandSiteIds.each { + def bSite = BrandSite.get(it) + def fromAdd = values.fromAddress + def alreadyRegistered = ContactEmail.findByFromAddressAndBrandSite(fromAdd, bSite) + if (!alreadyRegistered) { + ContactEmail contactEmail = new ContactEmail().with { + brandSite = bSite + fromAddress = fromAdd + subject = 'NewsLetter Subscription Request' + message = 'NewsLetter Subscription Request' + fromName = 'NewsLetter Subscriber' + sentTime = new Date() + it + } + saveOrDiscardDomain(contactEmail) + if (!contactEmail.hasErrors()) { + sendEmail(contactEmail) + } + } + } + } + + /** + * Creates a new ContactEmail. + * + * @param values Map of property values + * + * @return a ContactEmail which may have errors + */ + ContactEmail saveContactEmail(Map values) { + ContactEmail contactEmail = new ContactEmail() + contactEmail.brandSite = BrandSite.get(values.brandSiteId) + contactEmail.sentTime = new Date() + contactEmail.properties = values + contactEmail.validate() + saveOrDiscardDomain(contactEmail) + if (!contactEmail.hasErrors()) { + sendEmail(contactEmail) + } + contactEmail + } + + void sendEmail(ContactEmail contactEmail) { + BrandSite brandSite = contactEmail.brandSite + List recipients = Recipient.findAllByBrandSiteAndRecipientAddressStatus(brandSite, 1) + Map model = [fromName: contactEmail.fromName, message: contactEmail.message, + brandSiteName: contactEmail.brandSite.name] + String content = templateEngine.contactEmailContent(model) + emailService.sendEmail(recipients, contactEmail.subject, contactEmail.fromAddress, content) + } + + /** + * Saves or discards (if invalid) domain instance. + * NOTE: The LemansManager version of this method can NOT be used due to the lack of Auditable fields + * + * + * @param domain instance + * + * @return the domain instance which may have errors, clients SHOULD always check for errors + */ + private saveOrDiscardDomain(domain) { + if (domain.hasErrors()) { domain.discard() } + else { + domain.save() + } + domain + } +} Index: grails-app/services/com/lemans/cnl/EmailService.groovy =================================================================== diff -u --- grails-app/services/com/lemans/cnl/EmailService.groovy (revision 0) +++ grails-app/services/com/lemans/cnl/EmailService.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,24 @@ +package com.lemans.cnl + +import org.springframework.mail.javamail.MimeMessageHelper + +import javax.mail.internet.MimeMessage + +class EmailService { + + def mailSender + + void sendEmail(List recipients, String subject, String fromAddress, String content) { + MimeMessage message = mailSender.createMimeMessage() + MimeMessageHelper helper = new MimeMessageHelper(message, true) + helper.setText(content, content) + helper.setSubject(subject) + List recipientAddresses = [] + recipients.each { recipient -> + recipientAddresses.add(recipient.recipientAddress) + } + helper.setTo(recipientAddresses.toArray(new String[recipientAddresses.size()])) + helper.setFrom(fromAddress) + mailSender.send(message) + } +} Index: grails-app/views/index.gson =================================================================== diff -u --- grails-app/views/index.gson (revision 0) +++ grails-app/views/index.gson (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,3 @@ +json { + results 'contact-newsletter-service' +} \ No newline at end of file Index: grails-app/views/notFound.gson =================================================================== diff -u --- grails-app/views/notFound.gson (revision 0) +++ grails-app/views/notFound.gson (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,6 @@ +response.status 404 + +json { + message "Not Found" + error 404 +} \ No newline at end of file Index: grails-wrapper.jar =================================================================== diff -u Binary files differ Index: grailsw =================================================================== diff -u --- grailsw (revision 0) +++ grailsw (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,151 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Grails start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRAILS_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +JAR_PATH=$APP_HOME/grails-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRAILS_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRAILS_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRAILS_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRAILS_OPTS + +exec "$JAVACMD" -jar "$JAR_PATH" "${JVM_OPTS[@]}" "$@" Index: grailsw.bat =================================================================== diff -u --- grailsw.bat (revision 0) +++ grailsw.bat (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,89 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Grails startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRAILS_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line +set JAR_PATH=%APP_HOME%/grails-wrapper.jar + +@rem Execute Grails +"%JAVA_EXE%" -jar %JAR_PATH% %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRAILS_OPTS% %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRAILS_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRAILS_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega Index: src/integration-test/groovy/com/lemans/cnl/CatalogRequestFuncSpec.groovy =================================================================== diff -u --- src/integration-test/groovy/com/lemans/cnl/CatalogRequestFuncSpec.groovy (revision 0) +++ src/integration-test/groovy/com/lemans/cnl/CatalogRequestFuncSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,58 @@ +package com.lemans.cnl + +import com.lemans.testing.ContactNewsletterServiceApiFuncSpec + +class CatalogRequestFuncSpec extends ContactNewsletterServiceApiFuncSpec { + + String resourceName() { 'catalogRequest' } + + def setup() { domain = 8 } + + def 'can make a catalog request'() { + given: + String json = '''{"CatalogRequest": { +"firstName":"Functional", +"lastName":"Test", +"mailingAddress1":"Test", +"mailingAddress2":null, +"city":"Janesville", +"state":"WI", +"postalCode":"53545", +"countryCode":"US", +"region":"null", +"emailAddress":"thisisTest@test.com"}}''' + path() + ok() + + when: + post(json) + + then: + payload.message == 'Success' + } + + def 'can NOT make a catalog request with domain errors'() { + given: + String json = '''{"CatalogRequest": { +"firstName":"Functional", +"lastName":"Test", +"mailingAddress1":"Test", +"mailingAddress2":"Test2", +"city":"Janesville", +"state":"WIS", +"postalCode":"53545", +"countryCode":"USA", +"region":"America", +"emailAddress":"thisisTest"}}''' + path() + ok() + + when: + post(json) + + then: + with(payload) { + header.status == 'error' + } + } +} Index: src/integration-test/groovy/com/lemans/cnl/ContactEmailFuncSpec.groovy =================================================================== diff -u --- src/integration-test/groovy/com/lemans/cnl/ContactEmailFuncSpec.groovy (revision 0) +++ src/integration-test/groovy/com/lemans/cnl/ContactEmailFuncSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,53 @@ +package com.lemans.cnl + +import com.lemans.testing.ContactNewsletterServiceApiFuncSpec + +class ContactEmailFuncSpec extends ContactNewsletterServiceApiFuncSpec { + + String resourceName() { 'contactEmail' } + + String randomEmail = UUID.randomUUID().toString()[1..4] + '@gmail.com' + + def setup() { domain = 8 } + + def 'can create a contact email' () { + given: + String json = """{"Contact_Email": { +"fromAddress": "$randomEmail", +"fromName": "xyz", +"subject": "subject", +"message": "msg", +"brandSiteId": 6 +}}""" + path() + ok() + + when: + post(json) + + then: + payload.message == 'Success' + } + + def 'can NOT create a contact email with domain errors'() { + given: + String json = '''{"Contact_Email": { +"fromAddress": "test", +"fromName": "xyz", +"subject": "subject", +"message": "msg", +"brandSiteId": 6 +}}''' + path() + ok() + + when: + post(json) + + then: + with(payload) { + header.status == 'error' + errors[0].message == 'Property fromAddress with value test is not a valid e-mail address' + } + } +} Index: src/integration-test/groovy/com/lemans/cnl/EmailServiceIntegrationSpec.groovy =================================================================== diff -u --- src/integration-test/groovy/com/lemans/cnl/EmailServiceIntegrationSpec.groovy (revision 0) +++ src/integration-test/groovy/com/lemans/cnl/EmailServiceIntegrationSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,43 @@ +package com.lemans.cnl + +import com.dumbster.smtp.SmtpMessage +import contact.newsletter.service.Application +import grails.plugin.dumbster.Dumbster +import grails.test.mixin.integration.Integration +import spock.lang.Shared +import spock.lang.Specification + +@Integration(applicationClass = Application) +class EmailServiceIntegrationSpec extends Specification { + + @Shared + EmailService emailService + + @Shared + Dumbster dumbster + + def setup() { dumbster.reset() } + + def 'can send an email to recipients'() { + given: + Recipient tyrion = new Recipient(recipientName: 'tyrion', recipientAddress: 'tyrion@got.com') + Recipient danaerus = new Recipient(recipientName: 'danaerus', recipientAddress: 'danaerus@westeros.com') + List recipients = [tyrion, danaerus] + String subject = 'Winter is coming' + String fromAddress = 'whitewalkers@beyondthewall.com' + String message = 'We are coming for you' + + when: + emailService.sendEmail(recipients, subject, fromAddress, message) + SmtpMessage msg = dumbster.messages[0] + + then: + dumbster.messageCount == 1 + msg.subject == subject + msg.tos == [tyrion.recipientAddress, danaerus.recipientAddress] + split(msg.getHeaderValue('From')) == [fromAddress] + msg.body.contains message + } + + private split(String s) { s.split(',')*.trim() } +} Index: src/integration-test/groovy/com/lemans/cnl/NewsLetterFuncSpec.groovy =================================================================== diff -u --- src/integration-test/groovy/com/lemans/cnl/NewsLetterFuncSpec.groovy (revision 0) +++ src/integration-test/groovy/com/lemans/cnl/NewsLetterFuncSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,61 @@ +package com.lemans.cnl + +import com.lemans.testing.ContactNewsletterServiceApiFuncSpec + +class NewsLetterFuncSpec extends ContactNewsletterServiceApiFuncSpec { + + String resourceName() { 'newsLetter' } + + String randomEmail = UUID.randomUUID().toString()[1..4] + '@gmail.com' + + def 'can sign up for news letter'() { + given: + domain = 8 + String json = """{"News_Letter": { +"fromAddress": "$randomEmail", +"brandSiteId": 6 +}} """ + path() + ok() + + when: + post(json) + + then: + payload.message == 'Success' + } + + def 'can sign up for news letter for multiple brandsites'() { + given: + domain = 8 + String json = """{"News_Letter": { +"fromAddress": "$randomEmail", +"brandSiteId": "4,6" +}} """ + path() + ok() + + when: + post(json) + + then: + payload.message == 'Success' + } + + def 'can sign up for newsletter for brandsite'() { + given: + domain = 8 + String json = """{"News_Letter": { +"fromAddress": "$randomEmail", +"brandSiteId": "4" +}} """ + path() + ok() + + when: + post(json) + + then: + payload.message == 'Success' + } +} Index: src/integration-test/groovy/com/lemans/security/TokenVerificationFuncSpec.groovy =================================================================== diff -u --- src/integration-test/groovy/com/lemans/security/TokenVerificationFuncSpec.groovy (revision 0) +++ src/integration-test/groovy/com/lemans/security/TokenVerificationFuncSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,34 @@ +package com.lemans.security + +import com.lemans.testing.ContactNewsletterServiceApiFuncSpec + + +class TokenVerificationFuncSpec extends ContactNewsletterServiceApiFuncSpec { + + def 'can NOT act without a valid security token'() { + given: + System.clearProperty('ignoreToken') + domain = null + path() + unAuthenticated() + + when: + get() + + then: + payload.messages[0].text == 'no credentials' + } + + def 'can bypass the token check and get the app name'() { + given: + domain = null + path() + ok() + + when: + get() + + then: + payload.results == 'contact-newsletter-service' + } +} Index: src/integration-test/groovy/com/lemans/testing/ContactNewsletterServiceApiFuncSpec.groovy =================================================================== diff -u --- src/integration-test/groovy/com/lemans/testing/ContactNewsletterServiceApiFuncSpec.groovy (revision 0) +++ src/integration-test/groovy/com/lemans/testing/ContactNewsletterServiceApiFuncSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,17 @@ +package com.lemans.testing + +import contact.newsletter.service.Application +import grails.test.mixin.integration.Integration +import groovyx.net.http.HTTPBuilder + +@Integration(applicationClass = Application) +abstract class ContactNewsletterServiceApiFuncSpec extends LemansApiFunctionalSpec { + + @Override + final String serviceName() { 'contact-newsletter-service' } + + def setup() { + port = serverPort + http = new HTTPBuilder(url()) + } +} Index: src/main/groovy/com/lemans/cnl/LemansLegacyPackager.groovy =================================================================== diff -u --- src/main/groovy/com/lemans/cnl/LemansLegacyPackager.groovy (revision 0) +++ src/main/groovy/com/lemans/cnl/LemansLegacyPackager.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,32 @@ +package com.lemans.cnl + +// NOTE: this should only be used until the legacy endpoints have been removed. +@Deprecated +trait LemansLegacyPackager { + + /** + * Package some data/errors in the Lemans legacy JSON response envelope. + * + * @param data Map containing some of results, errors and totalRecords + * + * @return legacy packaged Map + */ + Closure legacyPackage = { Map data -> + [ + header: [ + status: data.errors ? 'error' : 'success', + totalRecords: data.totalRecords ?: 0, + pageSize: params.pageSize ?: data.results?.size() ?: 0, + offset: params.offset ?: 0 + ], + errors: data.errors ?: [], + results: data.results ?: [] + ] + } + + List collectLegacyErrors(subject) { + collectErrors(subject).collect { Map error -> + [field: error.field, message: error.text] + } + } +} Index: src/main/groovy/com/lemans/cnl/TemplateEngine.groovy =================================================================== diff -u --- src/main/groovy/com/lemans/cnl/TemplateEngine.groovy (revision 0) +++ src/main/groovy/com/lemans/cnl/TemplateEngine.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,19 @@ +package com.lemans.cnl + +class TemplateEngine { + + String contactEmailContent(Map model) { +""" + + +

+ Name: $model.fromName

+ Brand: $model.brandSiteName
+
+ $model.message +

+ + +""" + } +} Index: src/main/groovy/grails/plugin/dumbster/Dumbster.groovy =================================================================== diff -u --- src/main/groovy/grails/plugin/dumbster/Dumbster.groovy (revision 0) +++ src/main/groovy/grails/plugin/dumbster/Dumbster.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,91 @@ +package grails.plugin.dumbster + +import com.dumbster.smtp.SimpleSmtpServer +import com.dumbster.smtp.SmtpMessage +import org.springframework.mail.javamail.JavaMailSenderImpl + +/** + * @author Burt Beckwith + */ +class Dumbster { + + def grailsApplication + + Integer port + + protected SimpleSmtpServer server + + /** + * Starts the server; called by Spring, so shouldn't be called directly. + */ + @SuppressWarnings('Println') + void start() { + + def conf = grailsApplication.config.dumbster + + if (conf.port) { + port = conf.port + } + else { + port = 1025 + while (true) { + try { + new ServerSocket(port).close() + + // update the mail plugin's JavaMailSender if available + if (grailsApplication.mainContext.containsBean('mailSender')) { + JavaMailSenderImpl mailSender = grailsApplication.mainContext.mailSender + mailSender.port = port + } + + break + } + catch (IOException e) { + port++ + if (port > 10000) { + throw new BindException('Cannot find open port for Dumbster SMTP server') + } + } + } + } + println "Dumbster is using port $port" + server = SimpleSmtpServer.start(port) + } + + /** + * Stops the server; called by Spring, so shouldn't be called directly. + */ + void stop() { + server?.stop() + } + + /** + * Remove all sent emails. Call this in the setUp() method in your integration tests. + */ + void reset() { + if (!server) { return } + + for (Iterator iter = server.receivedEmail; iter.hasNext(); ) { + iter.next() + iter.remove() + } + } + + /** + * Check if stopped. + * @return true if the server was stopped (or never started) + */ + boolean isStopped() { server ? server.stopped : true } + + /** + * Get all current messages. + * @return the messages + */ + List getMessages() { server ? server.receivedEmail.collect { it } : [] } + + /** + * Get the number of sent messages. + * @return the number + */ + int getMessageCount() { server ? server.receivedEmailSize : 0 } +} Index: src/test/groovy/com/lemans/cnl/BrandSiteSpec.groovy =================================================================== diff -u --- src/test/groovy/com/lemans/cnl/BrandSiteSpec.groovy (revision 0) +++ src/test/groovy/com/lemans/cnl/BrandSiteSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,61 @@ +package com.lemans.cnl + +import grails.test.mixin.TestFor +import spock.lang.Specification +import spock.lang.Unroll + +@TestFor(BrandSite) +class BrandSiteSpec extends Specification { + + static final MAX_SIZE = 'maxSize.exceeded' + + BrandSite brandSite = new BrandSite(name: 'a', website: 'b') + + def 'a valid BrandSite has no errors'() { + when: + brandSite.validate() + + then: + !brandSite.hasErrors() + } + + @Unroll + def 'name with value #value validation error is #error'() { + given: + brandSite.name = value + + when: + brandSite.validate() + + then: + brandSite.errors['name']?.code == error + + where: + value || error + null || 'nullable' + '' || null + 'a' || null + '100chars'.padRight(100, '_') || null + '101chars'.padRight(101, '_') || MAX_SIZE + } + + @Unroll + def 'website with value #value validation error is #error'() { + given: + brandSite.website = value + + when: + brandSite.validate() + + then: + brandSite.errors['website']?.code == error + + where: + value || error + null || 'nullable' + '' || null + 'a' || null + '100chars'.padRight(100, '_') || null + '101chars'.padRight(101, '_') || MAX_SIZE + } +} Index: src/test/groovy/com/lemans/cnl/ContactEmailSpec.groovy =================================================================== diff -u --- src/test/groovy/com/lemans/cnl/ContactEmailSpec.groovy (revision 0) +++ src/test/groovy/com/lemans/cnl/ContactEmailSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,87 @@ +package com.lemans.cnl + +import grails.test.mixin.TestFor +import spock.lang.Specification +import spock.lang.Unroll + +@TestFor(ContactEmail) +class ContactEmailSpec extends Specification { + + static final MAX_SIZE = 'maxSize.exceeded' + + ContactEmail contactEmail = new ContactEmail( + fromName: 'Tyrion', + fromAddress: 'tyrion@lannisters.com', + subject: 'news', + brandSite: new BrandSite(name: 'GOT', website: 'GOT.com'), + sentTime: new Date(), + message: 'welcome' + ) + + def 'a valid ContactEmail has no errors'() { + when: + contactEmail.validate() + + then: + !contactEmail.hasErrors() + } + + @Unroll + def 'fromName with value #value validation error is #error'() { + given: + contactEmail.fromName = value + + when: + contactEmail.validate() + + then: + contactEmail.errors['fromName']?.code == error + + where: + value || error + null || 'nullable' + '' || 'blank' + 'a' || null + '100chars'.padRight(100, '_') || null + '101chars'.padRight(101, '_') || MAX_SIZE + } + + @Unroll + def 'fromAddress with value #value validation error is #error'() { + given: + contactEmail.fromAddress = value + + when: + contactEmail.validate() + + then: + contactEmail.errors['fromAddress']?.code == error + + where: + value || error + null || 'nullable' + '' || 'blank' + 'a' || 'email.invalid' + 'a@b.co' || null + } + + @Unroll + def 'subject with value #value validation error is #error'() { + given: + contactEmail.subject = value + + when: + contactEmail.validate() + + then: + contactEmail.errors['subject']?.code == error + + where: + value || error + null || 'nullable' + '' || 'blank' + 'a' || null + '100chars'.padRight(100, '_') || null + '101chars'.padRight(101, '_') || MAX_SIZE + } +} Index: src/test/groovy/com/lemans/cnl/TemplateEngineSpec.groovy =================================================================== diff -u --- src/test/groovy/com/lemans/cnl/TemplateEngineSpec.groovy (revision 0) +++ src/test/groovy/com/lemans/cnl/TemplateEngineSpec.groovy (revision 3743278c4d882ec005de7707fcd2d4c2b4bd5f1b) @@ -0,0 +1,28 @@ +package com.lemans.cnl + +import spock.lang.Specification + +class TemplateEngineSpec extends Specification { + + TemplateEngine engine = new TemplateEngine() + + def 'can generate contactEmail content'() { + given: + Map model = [fromName: 'bernie', brandSiteName: 'the real deal', message: 'in 2020'] + + expect: + engine.contactEmailContent(model) == +''' + + +

+ Name: bernie

+ Brand: the real deal
+
+ in 2020 +

+ + +''' + } +}