302 lines
8.0 KiB
Smalltalk
302 lines
8.0 KiB
Smalltalk
"
|
|
I model the fossil repository where public data is stored for the
|
|
building of this web site.
|
|
"
|
|
Class {
|
|
#name : #BreaWebsite,
|
|
#superclass : #Object,
|
|
#instVars : [
|
|
'fossilRepo',
|
|
'server',
|
|
'template',
|
|
'title',
|
|
'widgets'
|
|
],
|
|
#category : #Brea
|
|
}
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite class >> availableTemplates [
|
|
self templates keys.
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite class >> demoFolder [
|
|
^ FileLocator temp asFileReference / 'BreaDemo'.
|
|
]
|
|
|
|
{ #category : #example }
|
|
BreaWebsite class >> example [
|
|
"I run an example mockup of a website using Brea.
|
|
After runing me, go to:
|
|
- http://localhost:8080/demo
|
|
- http://localhost:8080/members/test
|
|
- http://localhost:8080/members/add "
|
|
self new
|
|
local: FileLocator temp asFileReference / 'BreaDemo';
|
|
template: 'portafolio';
|
|
downloadTemplate;
|
|
modifyTemplate;
|
|
start
|
|
]
|
|
|
|
{ #category : #example }
|
|
BreaWebsite class >> exampleDashboard [
|
|
"I run an example mockup of a website using Brea.
|
|
After runing me, go to: http://localhost:8080/demo "
|
|
self new
|
|
local: FileLocator temp asFileReference / 'BreaDemo';
|
|
template: 'dashboard';
|
|
downloadTemplate;
|
|
modifyTemplate;
|
|
start
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite class >> stopAll [
|
|
"I stop the server"
|
|
Teapot stopAll
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite class >> templates [
|
|
"I provide the supported MDL templates taken from: https://getmdl.io/templates/"
|
|
^ Dictionary new
|
|
at: 'portafolio' put: 'https://code.getmdl.io/1.3.0/mdl-template-portfolio.zip';
|
|
at: 'dashboard' put: 'https://code.getmdl.io/1.3.0/mdl-template-dashboard.zip';
|
|
yourself.
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> defaultTemplate [
|
|
self template
|
|
ifNil: [
|
|
self template: 'portafolio' ].
|
|
^ self template.
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> downloadDefaultTemplate [
|
|
self downloadTemplateNamed: self defaultTemplate Into: self local.
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> downloadDefaultTemplateInto: aDirectory [
|
|
| remoteUrl templatesFile |
|
|
aDirectory ensureDeleteAll.
|
|
aDirectory ensureCreateDirectory.
|
|
remoteUrl := self class templates at: self template.
|
|
GrafoscopioUtils
|
|
downloadingFrom: remoteUrl
|
|
withMessage: 'Downloading templates'
|
|
into: FileLocator temp asFileReference.
|
|
templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last.
|
|
ZipArchive new
|
|
readFrom: templatesFile;
|
|
extractAllTo: aDirectory
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> downloadTemplate [
|
|
self downloadTemplateNamed: self template Into: self local asFileReference.
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> downloadTemplateNamed: aName Into: aDirectory [
|
|
"aName: String aDirectory: aFileLocation"
|
|
| remoteUrl templatesFile |
|
|
aDirectory ensureDeleteAll.
|
|
aDirectory ensureCreateDirectory.
|
|
remoteUrl := self class templates at: aName.
|
|
GrafoscopioUtils
|
|
downloadingFrom: remoteUrl
|
|
withMessage: 'Downloading templates'
|
|
into: FileLocator temp asFileReference.
|
|
templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last.
|
|
ZipArchive new
|
|
readFrom: templatesFile;
|
|
extractAllTo: aDirectory
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> fossilRepo [
|
|
^ fossilRepo ifNil: [ fossilRepo := FossilRepo new ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> fossilRepo: aFossilRepo [
|
|
fossilRepo := aFossilRepo
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> local [
|
|
^ self fossilRepo local
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> local: aFilePath [
|
|
"I define the local storage of the Fossil repository.
|
|
For the moment aFilePath must be an absolute "
|
|
| localSite |
|
|
localSite := aFilePath asFileReference.
|
|
localSite exists
|
|
ifFalse: [ localSite ensureCreateDirectory].
|
|
self fossilRepo local: aFilePath.
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> local: aFilePath remote: anUrl [
|
|
"I define the local and remote storages of the Fossil repository"
|
|
self remote: anUrl.
|
|
self local: aFilePath
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> modifyDashboardTemplate [
|
|
"I replace default templates with versioned files, that contains Mustache tags used
|
|
for examples."
|
|
"This part should be factorized and integrated into a single method tha modifies any
|
|
template, instead of repeated the code of modifyPortafolioTemplate."
|
|
| remoteRepoUrl files |
|
|
remoteRepoUrl := 'http://mutabit.com/repos.fossil/brea/templates/portafolio'.
|
|
files := #('index.html' 'styles.css').
|
|
"files do: [ :file |
|
|
GrafoscopioUtils
|
|
downloadingFrom: remoteRepoUrl, 'doc/tip/', file
|
|
withMessage: 'Replacing ', file
|
|
into: self local ]"
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> modifyPortafolioTemplate [
|
|
"I replace default templates with versioned files, that contains Mustache tags used
|
|
for examples."
|
|
| remoteRepoUrl files |
|
|
remoteRepoUrl := 'http://mutabit.com/repos.fossil/gig/'.
|
|
files := #('index.html' 'styles.css').
|
|
files do: [ :file |
|
|
GrafoscopioUtils
|
|
downloadingFrom: remoteRepoUrl, 'doc/tip/', file
|
|
withMessage: 'Replacing ', file
|
|
into: self local ]
|
|
]
|
|
|
|
{ #category : #utility }
|
|
BreaWebsite >> modifyTemplate [
|
|
"I replace default templates with versioned files, that contains Mustache tags used
|
|
for examples."
|
|
self template = 'portafolio' ifTrue: [ self modifyPortafolioTemplate ].
|
|
self template = 'dashboard' ifTrue: [ self modifyDashboardTemplate ]
|
|
]
|
|
|
|
{ #category : #'input processing' }
|
|
BreaWebsite >> processNewMember: request [
|
|
| member badRequest |
|
|
badRequest := [ ^ ZnResponse badRequest: request ].
|
|
(request hasEntity
|
|
and: [ request contentType matches: ZnMimeType applicationFormUrlEncoded ])
|
|
ifFalse: [ badRequest ].
|
|
member := BreaMember new
|
|
givenName: (request at: #givenName);
|
|
familyName: (request at: #familyName);
|
|
email: (request at: #email);
|
|
country: (request at: #country);
|
|
organizations: (request at: #organizations);
|
|
picture: (request at: #picture);
|
|
website: (request at: #website);
|
|
twitter: (request at: #twitter);
|
|
facebook: (request at: #facebook);
|
|
tags: (request at: #tags).
|
|
self store: member.
|
|
^ 'New member stored!'
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> remote: anUrl [
|
|
"I define the remote storage of the Fossil repository"
|
|
self remote: anUrl.
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> routes [
|
|
"I define how the website behaves accordingly to particular routes."
|
|
self server
|
|
serveStatic: 'demo' from: (self local);
|
|
GET: 'members/test' -> [ :req | BreaMember new renderTestUserAsHtml ];
|
|
GET: 'members/add' -> [ :req | BreaMember new htmlInput ];
|
|
POST: 'members/summit' -> [ :req | self processNewMember: req ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> server [
|
|
^ server ifNil: [ self setup ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> server: anObject [
|
|
server := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> setup [
|
|
^ server := Teapot
|
|
configure:
|
|
{(#port -> 8080).
|
|
(#debugMode -> true)}
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> start [
|
|
"I define the config and start the server"
|
|
self routes.
|
|
self server start
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> storageFor: anObject [
|
|
"I define the places where local storage is done for several types of objects"
|
|
anObject class = BreaMember
|
|
ifTrue: [ ^ self local asFileReference / 'members' ].
|
|
^ self
|
|
]
|
|
|
|
{ #category : #'server handling' }
|
|
BreaWebsite >> store: anObject [
|
|
"I store different kind of objects in the website repository.
|
|
For the moment I will only store BreaMembers, but as long as new
|
|
objects will emerge, I will specialize other ways of storage."
|
|
anObject storeInto: (self storageFor: anObject)
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> template [
|
|
^ template
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> template: aTemplateName [
|
|
"I define the default template to be used for the Brea website.
|
|
Available options are at self class templates."
|
|
template := aTemplateName
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> title [
|
|
^ title
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> title: anObject [
|
|
title := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> widgets [
|
|
^ widgets ifNil: [ widgets := OrderedCollection new ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
BreaWebsite >> widgets: anOrderedCollection [
|
|
widgets := anOrderedCollection
|
|
]
|