1 of 49

GoatCLI

2 of 49

O czym będzie mowa?

3 of 49

GoatCLI

GoatCore

GoatCMS

4 of 49

Czym jest GoatCLI?

5 of 49

6 of 49

7 of 49

Prosta aplikacja

8 of 49

9 of 49

cd $GOPATH/src/github.com/goatcms

git clone https://github.com/goatcms/emptyapp.git

cd emptyapp

goatcli build

go build ./main.go

./main run --loglvl=dev

10 of 49

Architektura

11 of 49

DANE (tłumaczenia, opis struktur, …)

GoatCLI

Kod (Twój projekt)

Szablony (opis budowania)

12 of 49

GoatCLI

Twoja aplikacja

Moduły

DANE

Definicja budowania

Szablony budowania

Opis pobierania danych

Opis pobierania haseł

Definicja budowania

Szablony budowania

Więcej modułów

Definicja budowania

Szablony budowania

Więcej modułów

13 of 49

KOD

Repozytorium

CACHE

Moduł/Projekt

14 of 49

Definicja budowania

Szablony budowania

Opis pobierania danych

Opis pobierania haseł

Opis pobierania parametrów

Dane prywatne (hasła, …)

Parametry

Dane

/.goat/build/template/<name>/…/*.tmpl

/.goat/build.def.json

/.goat/build/<type>/<name>.json

/.goat/data.def.json

/.goat/secrets.def.json

/.goat/properties.def.json

/.goat/secrets.json (.gitignore)

/.goat/properties.json

15 of 49

Properties

16 of 49

.goat/properties.def.json

[{

"prompt":"Insert application userfriendly name",

"key":"app.name",

"type":"line",

"min":1,

"max":50

}, {

"prompt":"Insert application default web port",

"key":"app.port",

"type":"numeric",

"min":1,

"max":4

}, …

]

17 of 49

.goat/properties.json

{

"app": {

"id": "goatapp",

"lang": {

"default": "en"

},

"name": "GoatApp",

"port": "5555"

},

"goatcms_package": "github.com/goatcms/emptyapp/modules/goatcms"

}

18 of 49

19 of 49

Secrets

20 of 49

.goat/secrets.def.json

[{

"prompt":"Insert SMTP address (like smtp.gmail.com:465)",

"key":"smtp.address",

"type":"line",

"min":1,

"max":1024,

"pattern": "^[a-zA-Z0-9]+[a-zA-Z0-9\\.]*[a-zA-Z0-9]+(:[0-9]+)?$"

},{

"prompt":"Insert SMTP username",

"key":"smtp.user",

"type":"line",

"min":1,

"max":1024,

"pattern": "^[a-zA-Z0-9_\\.\\@]+?$"

}, …

]

21 of 49

Data

22 of 49

.goat/data.def.json

[{

"type":"model",

"properties":[{

"prompt":"insert single entity name",

"key":"entity",

"type":"line",

"min":1,

"max":30,

"pattern": "^[a-zA-z]+[a-zA-Z0-9]*$"

}, … ]

}, … ]

23 of 49

.goat/data.def.json

[{

"type":"lang",

"collections":[{

"type": "map",

"prompt": "Insert translates",

"properties": [{

"prompt":"Insert translate",

"key":"text",

"type":"line",

"min":1,

"max":1024

}]

}]

}, … ]

24 of 49

Build

25 of 49

.goat/build.def.json

[{

"to":"config",

"template":"config",

},{

"to":"translates",

"template":"translates",

},{

"to":"templates/views/admin",

"template":"admin/views",

},{

"to":"templates/helpers/forms",

"template":"form/view",

}]

26 of 49

.goat/build/

27 of 49

.goat/build/templates/admin/views/main.tmpl

{{- $ctx := . -}}

{{- range $index, $key := (keys .Data "model.") -}}

{{- $path := (print $ctx.To "/model/" $key "/list/main.gohtml") -}}

{{- if not ($ctx.Filesystem.IsFile $path) -}}

{{- $ctx.Out.File $path -}}

{{- template "admin.views.model.list" (ctx $ctx (print "model." $key) "") -}}

{{- $ctx.Out.EOF -}}

{{- end -}}

{{- end -}}

28 of 49

.../model/list.gohtml.tmpl

{{- define "admin.views.model.list" -}}

{{- $ctx := . -}}

{{- /* ... */ -}}

{{- noescape "{{- define \"content\" -}}" }}

<h1>{{$entityName}}</h1>

<div class="top-nav">

{{- $hrefAttr := (print "href=\"/admin/" (lower $entityName) "/insert\"") }}

<a type="button" class="btn btn-primary" {{$hrefAttr|safeHTMLAttr}}>

{{noescape "{{" }} TranslateFor "insert_btn" $prefix }}</a>

</a>

</div>

{{ noescape "{{- end }}" }}

{{- end -}}

29 of 49

Modules

30 of 49

.goat/modules.def.json

[{

"srcClone": "https://github.com/goatcms/goatcms.git",

"srcDir": "modules/goatcms",

}]

31 of 49

(goatcms)/.goat/replaces.def.json

[{

"from": "github.com/goatcms/goatcms",

"to": "{{goatcms_package}}",

"pattern": ".*\.go",

}]

32 of 49

GoatCMS

33 of 49

34 of 49

GoatCMS

CustomApp

GoatCore

35 of 49

dao

entities

http

commands

controllers

services

cmsapp

36 of 49

GoatCMS - Entities

37 of 49

user.go

type User struct {

ID *int64 `json:"id"`

Firstname *string `json:"firstname" db:"Firstname"`

Lastname *string `json:"lastname" db:"Lastname"`

Email *string `json:"email" db:"Email"`

Password *string `json:"password" db:"Password"`

Roles *string `json:"roles" db:"Roles"`

Username *string `json:"username" db:"Username"`

}

38 of 49

User.java

package com.goatcms.goatforandroid.entities;

public class User {

public Long id;

public String firstname;

public String lastname;

public String email;

public String password;

public String roles;

public String username;

public User() {}

}

39 of 49

user.go

var UserSystemFieldsAndID = &UserFields{

ID: true,

Firstname: false,

Lastname: false,

Email: false,

Password: true,

Roles: true,

Username: false,

}

type UserFields struct {

ID bool

Firstname bool

Lastname bool

Email bool

Password bool

Roles bool

Username bool

}

40 of 49

user_json.go

package entities

import (

"fmt"

"github.com/buger/jsonparser"

"github.com/goatcms/goatcore/varutil"

"strconv"

"strings"

)

func UserFromJSON(e *User, json []byte, fields *UserFields) (err error) {

return jsonparser.ObjectEach(json, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {

//…

})

}

41 of 49

GoatCMS - DAO

42 of 49

user.go

type UserCriteriaWhere struct {

Firstname *StringFieldCriteria

Lastname *StringFieldCriteria

Email *StringFieldCriteria

Password *StringFieldCriteria

Roles *StringFieldCriteria

Username *StringFieldCriteria

}

type UserCriteriaRelated struct {

}

type UserCriteria struct {

Fields *entities.UserFields

Where UserCriteriaWhere

Related UserCriteriaRelated

Order UserCriteriaOrder

}

43 of 49

user.go

type UserCriteriaSearch interface {

Find(scope app.Scope, criteria *UserCriteria, pager *Pager) (rows UserRows, err error)

}

type UserCriteriaDeleter interface {

Delete(scope app.Scope, criteria *UserCriteria) (err error)

}

type UserCriteriaCounter interface {

Count(scope app.Scope, criteria *UserCriteria) (count int64, err error)

}

44 of 49

GoatCMS - Tłumaczenia

45 of 49

translates/pl/layout.json

{"pl.layout":{

"footer": "GoatCMS",

"head_title": "GoatCMS",

"navbar": {

"home": "GoatCMS",

"signin": "Logowanie",

"signout": "Wylogowanie",

"signup": "Rejestracja"

}

}}

46 of 49

.../res/bundles/home/values-pl/strings.xml

<resources>

<string name="home_nav_admin_fragment">FRAGMENT (ADMIN)</string>

<string name="home_nav_admin_session">SESSION (ADMIN)</string>

<string name="home_nav_admin_user">USER (ADMIN)</string>

</resources>

47 of 49

Dziękuję za uwagę

48 of 49

Linki

49 of 49