sexta-feira, 22 de março de 2013

Grails dbconsole - Console SQL para o Banco de Dados Nativo do Grails 2


Pode ser muito útil acessar o console sql do h2 durante o desenvolvimento de uma aplicação Grails. Eu não sabia, mas, sim é possível através do dbconsole.


Rodando a aplicação em localhost:8080/nomeAplicativo 
Basta digitar no browser localhost:8080/nomeAplicativo/dbconsole 

Preencha JDBC URL utilizando a configuração presente no arquivo do projeto DataSource.groovy

Neste caso: jdbc:h2:mem:devDb e você vai ver todos os objetos de domínio. E poderá não somente fazer consultas sql, como também os comandos drop table, create table, insert, update, delete.
dbconsole


quarta-feira, 20 de março de 2013

Dica Grails - GGTS

Para mudar a porta do servidor web do Grails basta passar o parâmetro -Dserver.port=XXXX

Por exemplo: grails -Dserver.port=8090 run-app

quarta-feira, 16 de janeiro de 2013

Micro Projeto Grails: MangueJobs, mural de empregos

Atualização 10/02/2015
O site esta no momento fora do ar. O CoudBees.com aonde ficava hospedado tirou do ar pois a conta era gratuita somente para projetos em desenvolvimento e como eu parei de atualizar o código eles tiraram do ar.

Olá. Nos últimos dias trabalhei neste pequeno projeto Grails que chamo de MangueJobs. É um mural de empregos das cidades de Macaé, Campos e Região. Inicialmente faço uma busca nos feeds públicos de algumas páginas e grupos do Facebook. Depois, faço uma validação da mensagem antes de exibi-la no mural.

O endereço para visitar é empregos.mangue2.com

Ambiente Utilizado


  • IDE Groovy/Grails Tool Suite 3.0.0
  • Grails 2.0.4
  • JDK 1.7.0
  • Hospedado no CloudBees.com


Plugins


  • facebook-sdk version 0.4.6


Características


  • O Projeto não utilizada banco de dados.


Arquivos Criados


  • MuralController.groovy
  • mural/index.gsp
  • src/groovy/Anuncio.groovy
  • webapp/css/custom.css


Arquivos Modificados


  • layouts/main.gsp
  • conf/Config.groovy
  • conf/UrlMapping.groovy
  • webapp/css/main.css


Andamento

Depois de criado o projeto, instalei, configurei e testei o plugin facebook-sdk. Para o teste é necessário ter um Id e um Secret fornecidos pelo Facebook. Bastou incluir o código abaixo no arquivo: Config.groovy

//Facebook SDK Plugin grails.plugin.facebooksdk.app.id = IDDOAPP grails.plugin.facebooksdk.app.permissions = [] // Ex. ['email','user_photos'] grails.plugin.facebooksdk.app.secret = SECRETDOAPP ...

O passo seguinte foi criar o MuralController.groovy. Adicionei o FacebookContext do plugin e declarei um mapa com os grupos e outro com as páginas.

FacebookContext facebookContext def grupos = ["RECRUTA CAMPOS RJ":"332054513537019","RECRUTA EMPREGOS MACAÉ RJ":"299476493497382","EMPREGOS CARATINGA MG - MACAÉ RJ":"181172948674195"]  def paginas = ["EMPREGOS CAMPOS MACAÉ OFFSHORE":"352431094785650","EMPREGOS TI RJ":"EmpregosTiRj", "EMPREGA MACAÉ":"EmpregaMacae"]

A busca dos anúncios é feita através de um método que retorna um Set<Anuncio> a partir do retorno do método facebookCliente.fetchConnection().

def appAccessToken = facebookContext.app.getToken(true)def facebookClient = new FacebookGraphClient(appAccessToken) Set<Anuncio> lista = new TreeSet<Anuncio>(); def myFeed = facebookClient.fetchConnection(idObjeto+"/feed")

Como os anúncios são exibidos fora do Facebook, sem o contato de quem escreveu, somente os anúncios que contém ao menos um email no corpo do texto são considerados válidos. E como as vezes as pessoas publicam o mesmo anúncio em dois ou mais grupos, implementei o método compareTo(Object o) na classe Anuncio.groovy.

@Override public int compareTo(Object o) { if(this.is(o)) return 0 if(this.mensagem.equals(o.mensagem)){ return 0 }else{ if(this.mensagem.compareTo(o.mensagem)>0){ return 1; }else{ return -1; } } return 0; }

Outro passo foi criar um método para ordenar a lista e no def index() um tratamento para paginação e ordenação. Ajustei o main.gsp e o main.css e criei a mural/index.gsp e custom.css.

No index.gsp incluí a Tag de comentários do Facebook.

Por último ajustei o UrlMappings.groovy para apontar direto para o MuralController

 static mappings = {
  "/$controller/$action?/$id?"{
   constraints {
    // apply constraints here
   }
  }

  "/"(controller:"mural",action:"index")
  "500"(view:'/error')
 }


Fico muito contente em poder compartilhar. Caso queiram mais detalhes sobre a implementação é só deixar um comentário com a dúvida.