diff --git a/README.md b/README.md index 6d1c6b1..00cca0c 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,68 @@ https://github.com/basejump/grails-vue-todomvc/tree/Phase2-todomvc-example-copy Copy setup from https://vuejs.org/v2/examples/todomvc.html ## Phase 3 - Stock Grails Rest Application +https://github.com/basejump/grails-vue-todomvc/tree/Phase3-Stock-Grails-Rest-App ``` bash $ grails create-app -profile rest-api -features hibernate5 grails-server | Grails Version: 3.2.9 ``` + +## Phase 4 - Grails Todo Rest Setup + +create the Todo domain + +``` bash +$ grails create-domain-class Todo +``` + +``` groovy +import grails.rest.Resource + +@Resource(uri = '/todo', formats = ["json"]) +class Todo { + + String title + Boolean completed = false + Boolean archived = false + + static constraints = { + title nullable: false + completed nullable: false + archived nullable: false + } +} +``` + +turn on cors in the application.yml + +``` +grails: + cors: + enabled: true +``` + +add some rows for sanity check +``` groovy +class BootStrap { + def init = { servletContext -> + new Todo(title:"Buy beer",completed:true).save(failOnError:true,flush: true) + new Todo(title:"Drink beer").save(failOnError:true,flush: true) + new Todo(title:"Create Vue/Grails TodoMVC example").save(failOnError:true,flush: true) + } +... +``` + +run-app and sanity check it with curl + +``` bash +$ curl -i -X GET -H "Content-Type: application/json" localhost:8080/todo +HTTP/1.1 200 +X-Application-Context: application:development +Content-Type: application/json;charset=UTF-8 +Transfer-Encoding: chunked +Date: Sun, 07 May 2017 06:01:57 GMT + +[{"id":1,"archived":false,"completed":false,"title":"Buy beer"},{"id":2,"archived":false,"completed":false,"title":"Drink beer"}] +``` \ No newline at end of file diff --git a/grails-server/grails-app/conf/application.yml b/grails-server/grails-app/conf/application.yml index 71cf7be..8c622ab 100644 --- a/grails-server/grails-app/conf/application.yml +++ b/grails-server/grails-app/conf/application.yml @@ -14,6 +14,8 @@ grails: # Whether to translate GORM events into Reactor events # Disabled by default for performance reasons events: false + cors: + enabled: true info: app: name: '@info.app.name@' diff --git a/grails-server/grails-app/controllers/grails/server/UrlMappings.groovy b/grails-server/grails-app/controllers/grails/server/UrlMappings.groovy index 0df1f9a..0407b07 100644 --- a/grails-server/grails-app/controllers/grails/server/UrlMappings.groovy +++ b/grails-server/grails-app/controllers/grails/server/UrlMappings.groovy @@ -3,12 +3,17 @@ package grails.server class UrlMappings { static mappings = { + + group("/api") { + delete "/$controller/$id(.$format)?"(action:"delete") get "/$controller(.$format)?"(action:"index") get "/$controller/$id(.$format)?"(action:"show") post "/$controller(.$format)?"(action:"save") put "/$controller/$id(.$format)?"(action:"update") patch "/$controller/$id(.$format)?"(action:"patch") + + } "/"(controller: 'application', action:'index') "500"(view: '/error') diff --git a/grails-server/grails-app/domain/grails/server/Todo.groovy b/grails-server/grails-app/domain/grails/server/Todo.groovy new file mode 100644 index 0000000..0f68e26 --- /dev/null +++ b/grails-server/grails-app/domain/grails/server/Todo.groovy @@ -0,0 +1,17 @@ +package grails.server + +import grails.rest.Resource + +@Resource(uri = '/todo', namespace = '/api', formats = ["json"]) +class Todo { + + String title + Boolean completed = false + Boolean archived = false + + static constraints = { + title nullable: false + completed nullable: false + archived nullable: false + } +} \ No newline at end of file diff --git a/grails-server/grails-app/init/grails/server/BootStrap.groovy b/grails-server/grails-app/init/grails/server/BootStrap.groovy index 08d4283..4fb7721 100644 --- a/grails-server/grails-app/init/grails/server/BootStrap.groovy +++ b/grails-server/grails-app/init/grails/server/BootStrap.groovy @@ -1,8 +1,10 @@ package grails.server class BootStrap { - def init = { servletContext -> + new Todo(title:"Buy beer",completed:true).save(failOnError:true,flush: true) + new Todo(title:"Drink beer").save(failOnError:true,flush: true) + new Todo(title:"Create Vue/Grails TodoMVC example").save(failOnError:true,flush: true) } def destroy = { }