summaryrefslogtreecommitdiff
path: root/pharo-mooc/tiny-chat/src/TinyChat-server/TCServer.class.st
blob: cda06a0dc30b53a9bc2fe8b16d5ee331a507616b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Class {
	#name : 'TCServer',
	#superclass : 'Object',
	#instVars : [
		'teapotServer',
		'messagesQueue'
	],
	#category : 'TinyChat-server',
	#package : 'TinyChat-server'
}

{ #category : 'initialization' }
TCServer class >> startOn: aPortNumber [
	^self new
		  initializePort: aPortNumber;
		  registerRoutes;
		  registerErrorHandlers;
		  yourself
]

{ #category : 'initialization' }
TCServer class >> stopAll [
	self allInstancesDo: #stop
]

{ #category : 'initialization' }
TCServer >> addMessage: aRequest [
	messagesQueue add: (TCMessage from: (aRequest at: #sender) text: (aRequest at: #text)).
]

{ #category : 'initialization' }
TCServer >> initialize [
	super initialize.
	messagesQueue := TCMessageQueue new
]

{ #category : 'initialization' }
TCServer >> initializePort: anInteger [
	teapotServer := Teapot configure: {
		#defaultOutput -> #text.
		#port -> anInteger.
		#debugMode -> true
	}.
	teapotServer start
]

{ #category : 'initialization' }
TCServer >> messageCount [
	^ messagesQueue size
]

{ #category : 'initialization' }
TCServer >> messagesFrom: request [
	^ messagesQueue formattedMessagesFrom: (request at: #id)
]

{ #category : 'initialization' }
TCServer >> registerErrorHandlers [
	teapotServer
		exception: KeyNotFound -> (TeaResponse notFound body: 'No such message')
]

{ #category : 'initialization' }
TCServer >> registerRoutes [
	teapotServer
		GET: '/messages/count' -> (Send message: #messageCount to: self);
		GET: '/messages/<id:IsInteger>' -> (Send message: #messagesFrom: to: self);
		POST: '/messages/add' -> (Send message: #addMessage: to: self)
]

{ #category : 'initialization' }
TCServer >> stop [
	teapotServer stop.
	messagesQueue reset
]