Brainstorm arquitetura
gabriel-laet opened this issue · comments
O que seria um plug-in de admin para o dl-api? Algumas premissas, do que eu acho:
- Não deve fazer parte do core do dl-api;
- Não deve fazer parte do dl-api-javascript;
- Deve ser um módulo 100% estático, com o mínimo de dependências;
- Pode fazer uso de observers, seeds e routes;
- Separar em módulos (decoupled)
- JavaScript API
- GUI toolkit (baseado em Bootstrap ou similar)
- Talvez uma mescla angular + angular-ui + bootstrap deixe super simples a implementação
Como funcionamento, o que eu esperaria é:
- Collection-based: toda a UI e funcionalidades são baseadas em collections (duh)
- CRUD + geração dos fields e validação baseado nos types definidos
- Os types e os campos devem ser definidos de maneira declarativa, em JavaScript mesmo (sem JSON ou YAML)
- Se comportar como o admin do Django: uma Collection só é listada no admin apenas se eu explicitamente fizer
admin.register('Categories')
Como API, algo assim:
var admin = new DL.Admin(client);
admin.addCollection("Users", options);
ou
var Users = {
name:String,
email:{type:String, validator:"email"}
}
var admin = new DL.Admin(client);
admin.addCollection(Users);
A GUI deveria ser montada baseada nessa API, que teria métodos tipo listCollections
, Collection.getFields()
, collection.validate()
e coisas do tipo.
@doubleleft/devs + @barrabinfc
braindump aqui de idéias depois 👍
Vamos considerar disparo de emails / push notification para usuários através deste admin?
Talvez seria bacana ter uma área "advanced" para modificar as configurações (que hoje usamos dl-api config:set ...
)
No mais concordo com o que o @gabriel-laet falou :)
Bem lembrado! Isso é uma boa feature. Inclusive, seria legal se esse disparo tivesse um modo de query, pra você segmentar quem você manda. Tipo, filtros mesmo.
Como o Dev vai declarar o app_id e a key ? Será por um .dl-config ? Vai ter uma key especifica para o admin, que consederá as permissões para listar collections e etc ?
Ou o getCollections(), validate() ... vai ser baseado no que foi registrado na inicialização do admin ?
Acho que deixamos isso livre para cada projeto. A key e o appid serão o mesmo, o que podemos fazer é obrigar que o usuário que se rola no admin, tenha um role
de admin, e aí fica por conta da aplicação criar esses caras.
Mais pra frente, isso vai ter alguma relação com essa issue doubleleft/hook#7, mas agora não é um problema para o admin.
Mr. @fefranca já começou isso aqui: https://github.com/doubleleft/hellmanns-whatscook/tree/dl-api-admin
Assim que ele conseguir, vamos mover isso aqui pra esse repo e usar como starting point também. Já cobre bastante coisa massa.
Hey pessoal, vou organizar e disponibilizar aqui em breve ^^
Sintaxe
Vejam o que acham e dêem feedback.
window.dl = new DL.Client( window.CONFIG_API );
admin = new DLAdmin()
admin.addModel(
{
name: "Conversas",
collection: "hwcconversations",
fields: [{name:"name", type:"text"}, {name:"category", type:"text"}],
relationships: [{type: "has_many", collection: "hwcmessages", sourceField:"id", targetField: "conversation_id"}]
}
)
admin.addModel(
{
name: "Mensagens",
collection: "hwcmessages",
fields: [{name:"text", type:"text", multiLine: true}, {name:"image", type:"image"}],
relationships: [
{type: "belongs_to", collection: "hwcconversations", sourceField:"conversation_id", targetField: "id"}
]
}
);
admin.init()
Screenshots
Coisas bacanas
- Login e tudo mais usando dl-api-javascript
- Suporte a histórico do browser com pushState / popState
- Tem um suporte mínimo a relationships
Coisas importantes que faltaram
- Deleção (a princípio é simples mas queria muito tratar o caso dos relationships - "cascading")
- Paginação
👏 👏 👏
\o/