@@ -20,7 +20,7 @@ import java.nio.charset.Charset
20
20
/* *
21
21
* Handle routes relating to document generation. Mostly this will be done by sending messages to the appropriate queues.
22
22
*/
23
- class GeneratorController (sourceBucket : String ) : KoinComponent, APIController(sourceBucket) {
23
+ class GeneratorController (sourceBucket : String , generationBucket : String ) : KoinComponent, APIController(sourceBucket, generationBucket ) {
24
24
25
25
companion object {
26
26
const val error_NO_RESPONSE = " No response received for message"
@@ -40,16 +40,17 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
40
40
val requestKey = request.pathParameters[" srcKey" ]
41
41
? : return ResponseEntity .badRequest(body = APIResult .Error (" No srcKey provided" ))
42
42
var srcKey = " "
43
+ val projectKeyHeader = request.headers[" cantilever-project-domain" ]!!
43
44
try {
44
- loadContentTree()
45
+ loadContentTree(projectKeyHeader )
45
46
if (requestKey == " *" ) {
46
47
info(" GeneratorController: Received request to regenerate all pages" )
47
48
val pages = contentTree.items.filterIsInstance<ContentNode .PageNode >()
48
49
var count = 0
49
50
if (pages.isNotEmpty()) {
50
51
pages.forEach { page ->
51
52
val sourceString = s3Service.getObjectAsString(page.srcKey, sourceBucket)
52
- val msgResponse = queuePageRegeneration(page.srcKey, sourceString)
53
+ val msgResponse = queuePageRegeneration(projectKeyHeader, page.srcKey, sourceString)
53
54
if (msgResponse != null ) {
54
55
count++
55
56
} else {
@@ -65,12 +66,12 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
65
66
srcKey = URLDecoder .decode(requestKey, Charset .defaultCharset())
66
67
info(" GeneratorController: Received request to regenerate page '$srcKey '" )
67
68
val sourceString = s3Service.getObjectAsString(srcKey, sourceBucket)
68
- queuePageRegeneration(srcKey, sourceString)
69
+ queuePageRegeneration(projectKeyHeader, srcKey, sourceString)
69
70
return ResponseEntity .ok(body = APIResult .Success (value = " Regenerated page '$requestKey '" ))
70
71
}
71
72
} catch (nske: NoSuchKeyException ) {
72
73
error(" ${nske.message} for key $srcKey " )
73
- return ResponseEntity .notFound(body = APIResult .Error (message = " Could not find page with key '$srcKey '" ))
74
+ return ResponseEntity .notFound(body = APIResult .Error (statusText = " Could not find page with key '$srcKey '" ))
74
75
} catch (e: Exception ) {
75
76
error(" Error generating page: ${e.message} " )
76
77
return ResponseEntity .serverError(body = APIResult .Error (" Error generating page: ${e.message} " ))
@@ -86,8 +87,9 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
86
87
fun generatePost (request : Request <Unit >): ResponseEntity <APIResult <String >> {
87
88
val requestKey = request.pathParameters[" srcKey" ]
88
89
var srcKey = " "
90
+ val projectKeyHeader = request.headers[" cantilever-project-domain" ]!!
89
91
try {
90
- loadContentTree()
92
+ loadContentTree(projectKeyHeader )
91
93
if (requestKey == " *" ) {
92
94
info(" GeneratorController: Received request to regenerate all posts" )
93
95
val posts = contentTree.items.filterIsInstance<ContentNode .PostNode >()
@@ -96,7 +98,11 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
96
98
posts.forEach { post ->
97
99
val sourceString = s3Service.getObjectAsString(post.srcKey, sourceBucket)
98
100
val postSrcKey = post.srcKey.removePrefix(postsPrefix)
99
- val msgResponse = queuePostRegeneration(postSrcKey, sourceString)
101
+ val msgResponse = queuePostRegeneration(
102
+ postSrcKey = postSrcKey,
103
+ sourceString = sourceString,
104
+ projectDomain = projectKeyHeader
105
+ )
100
106
if (msgResponse != null ) {
101
107
count++
102
108
} else {
@@ -113,13 +119,18 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
113
119
info(" GeneratorController: Received request to regenerate post '$srcKey '" )
114
120
val sourceString = s3Service.getObjectAsString(srcKey, sourceBucket)
115
121
val postSrcKey = srcKey.removePrefix(postsPrefix)
116
- queuePostRegeneration(postSrcKey, sourceString)
122
+ queuePostRegeneration(
123
+ postSrcKey = postSrcKey,
124
+ sourceString = sourceString,
125
+ projectDomain = projectKeyHeader
126
+ )
117
127
return ResponseEntity .ok(body = APIResult .Success (value = " Regenerated post '$requestKey '" ))
118
128
}
119
129
} catch (nske: NoSuchKeyException ) {
120
130
error(" ${nske.message} for key $srcKey " )
121
- return ResponseEntity .notFound(body = APIResult .Error (message = " Could not find post with key '$srcKey '" ))
131
+ return ResponseEntity .notFound(body = APIResult .Error (statusText = " Could not find post with key '$srcKey '" ))
122
132
} catch (e: Exception ) {
133
+ error(" Error generating post: ${e.javaClass} : ${e.message} " )
123
134
return ResponseEntity .serverError(body = APIResult .Error (" Error generating post: ${e.message} " ))
124
135
}
125
136
}
@@ -136,23 +147,30 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
136
147
body = APIResult .Error (" Regeneration of all templates is not supported." )
137
148
)
138
149
}
139
- info( " ENCODED: GeneratorController received request to regenerate pages based on template ' $requestKey ' " )
150
+ val projectKeyHeader = request.headers[ " cantilever-project-domain " ] !!
140
151
// TODO: https://github.com/v79/Cantilever/issues/26 this only works for HTML handlebars templates, i.e. those whose file names end in ".index.html" in the "templates" folder.
141
152
// Also, annoying that I have to double-decode this.
153
+ // And I need to strip off the domain from the requestKey
142
154
val templateKey =
143
- URLDecoder .decode(URLDecoder .decode(requestKey, Charset .defaultCharset()), Charset .defaultCharset())
155
+ URLDecoder .decode(URLDecoder .decode(requestKey, Charset .defaultCharset()), Charset .defaultCharset()).substringAfter(
156
+ " $projectKeyHeader /"
157
+ )
144
158
info(
145
- " DOUBLE DECODED: GeneratorController received request to regenerate pages based on template '$templateKey '"
159
+ " Received request to regenerate pages based on template '$templateKey '"
146
160
)
147
161
var count = 0
148
162
149
163
// We don't know if the template is for a Page or a Post. This is less than ideal as I have to check both. But I could short-circuit the second check if the first one succeeds?
150
164
try {
151
- loadContentTree()
165
+ loadContentTree(projectKeyHeader )
152
166
contentTree.getPagesForTemplate(templateKey).forEach { page ->
153
167
info(" Regenerating page ${page.srcKey} because it has template ${page.templateKey} " )
154
168
val pageSource = s3Service.getObjectAsString(page.srcKey, sourceBucket)
155
- val response = queuePageRegeneration(page.srcKey, pageSource)
169
+ val response = queuePageRegeneration(
170
+ pageSrcKey = page.srcKey,
171
+ sourceString = pageSource,
172
+ projectDomain = projectKeyHeader
173
+ )
156
174
if (response != null ) {
157
175
count++
158
176
} else {
@@ -163,7 +181,11 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
163
181
contentTree.getPostsForTemplate(templateKey).forEach { post ->
164
182
info(" Regenerating post ${post.srcKey} because it has template ${post.templateKey} " )
165
183
val postSource = s3Service.getObjectAsString(post.srcKey, sourceBucket)
166
- val msgResponse = queuePostRegeneration(post.srcKey, postSource)
184
+ val msgResponse = queuePostRegeneration(
185
+ postSrcKey = post.srcKey,
186
+ sourceString = postSource,
187
+ projectDomain = projectKeyHeader
188
+ )
167
189
if (msgResponse != null ) {
168
190
count++
169
191
} else {
@@ -194,10 +216,18 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
194
216
/* *
195
217
* Send a message to the markdown queue for a Page
196
218
*/
197
- private fun queuePageRegeneration (pageSrcKey : String , sourceString : String ): SendMessageResponse ? {
219
+ private fun queuePageRegeneration (
220
+ pageSrcKey : String ,
221
+ sourceString : String ,
222
+ projectDomain : String
223
+ ): SendMessageResponse ? {
198
224
// extract page model
199
225
val pageMode = ContentMetaDataBuilder .PageBuilder .buildFromSourceString(sourceString, pageSrcKey)
200
- val msgBody = MarkdownSQSMessage .PageUploadMsg (pageMode, sourceString)
226
+ val msgBody = MarkdownSQSMessage .PageUploadMsg (
227
+ projectDomain = projectDomain,
228
+ metadata = pageMode,
229
+ markdownText = sourceString
230
+ )
201
231
return sqsService.sendMarkdownMessage(
202
232
toQueue = markdownQueue, body = msgBody,
203
233
messageAttributes = createStringAttribute(" sourceType" , SOURCE_TYPE .Pages .folder)
@@ -207,14 +237,22 @@ class GeneratorController(sourceBucket: String) : KoinComponent, APIController(s
207
237
/* *
208
238
* Send a message to the markdown queue for a Post
209
239
*/
210
- private fun queuePostRegeneration (postSrcKey : String , sourceString : String ): SendMessageResponse ? {
240
+ private fun queuePostRegeneration (
241
+ postSrcKey : String ,
242
+ sourceString : String ,
243
+ projectDomain : String
244
+ ): SendMessageResponse ? {
211
245
// extract post model
212
246
val metadata =
213
247
ContentMetaDataBuilder .PostBuilder .buildFromSourceString(sourceString.getFrontMatter(), postSrcKey)
214
248
// extract body
215
249
val markdownBody = sourceString.stripFrontMatter()
216
250
217
- val msgBody = MarkdownSQSMessage .PostUploadMsg (metadata, markdownBody)
251
+ val msgBody = MarkdownSQSMessage .PostUploadMsg (
252
+ projectDomain = projectDomain,
253
+ metadata = metadata,
254
+ markdownText = markdownBody
255
+ )
218
256
return sqsService.sendMarkdownMessage(
219
257
toQueue = markdownQueue, body = msgBody,
220
258
messageAttributes = createStringAttribute(" sourceType" , SOURCE_TYPE .Posts .folder)
0 commit comments