Skip to content

Commit fce8739

Browse files
committed
fix: do not return useless short code for client
1 parent 125302e commit fce8739

File tree

1 file changed

+56
-6
lines changed

1 file changed

+56
-6
lines changed

internal/api/handlers.go

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,13 @@ func GenerateShortCodeHandler(c *gin.Context) {
7777
// Check if it's currently being rendered in our queue
7878
if renderer.GlobalRenderQueue.IsInProgress(req.URL) {
7979
log.Printf("URL %s is already being rendered, waiting for completion", req.URL)
80-
// Wait for up to 30 seconds for rendering to complete
81-
if renderer.GlobalRenderQueue.WaitForRender(req.URL, 30*time.Second) {
80+
// Wait for up to the configured timeout for rendering to complete
81+
timeoutDuration := time.Duration(config.AppConfig.RenderTimeoutSeconds) * time.Second
82+
if renderer.GlobalRenderQueue.WaitForRender(req.URL, timeoutDuration) {
8283
// Fetch updated link after rendering
8384
updatedLink, fetchErr := db.GetLinkByShortCode(existingLink.ShortCode)
8485
if fetchErr == nil {
86+
log.Printf("Existing URL rendering completed, returning ready short code to client")
8587
c.JSON(http.StatusOK, GenerateResponse{
8688
ShortCode: updatedLink.ShortCode,
8789
OriginalURL: updatedLink.OriginalURL,
@@ -90,11 +92,27 @@ func GenerateShortCodeHandler(c *gin.Context) {
9092
}
9193
}
9294
// If waiting failed or timeout, just return the existing short code
93-
log.Printf("Timeout waiting for render of %s, returning existing short code", req.URL)
95+
log.Printf("Timeout waiting for render of %s, returning existing short code anyway", req.URL)
9496
} else {
95-
// Not currently in queue, re-queue for rendering
96-
log.Printf("URL %s exists but not in render queue, re-queuing", req.URL)
97+
// Not currently in queue, re-queue for rendering and wait
98+
log.Printf("URL %s exists but not in render queue, re-queuing and waiting", req.URL)
9799
renderer.GlobalRenderQueue.QueueRender(existingLink.ShortCode, req.URL)
100+
101+
// Wait for the re-queued rendering to complete
102+
timeoutDuration := time.Duration(config.AppConfig.RenderTimeoutSeconds) * time.Second
103+
if renderer.GlobalRenderQueue.WaitForRender(req.URL, timeoutDuration) {
104+
// Fetch updated link after rendering
105+
updatedLink, fetchErr := db.GetLinkByShortCode(existingLink.ShortCode)
106+
if fetchErr == nil {
107+
log.Printf("Re-queued URL rendering completed, returning ready short code to client")
108+
c.JSON(http.StatusOK, GenerateResponse{
109+
ShortCode: updatedLink.ShortCode,
110+
OriginalURL: updatedLink.OriginalURL,
111+
})
112+
return
113+
}
114+
}
115+
log.Printf("Timeout waiting for re-queued render of %s, returning existing short code anyway", req.URL)
98116
}
99117

100118
c.JSON(http.StatusOK, GenerateResponse{
@@ -165,7 +183,39 @@ func GenerateShortCodeHandler(c *gin.Context) {
165183
// Queue for rendering
166184
renderer.GlobalRenderQueue.QueueRender(generatedShortCode, req.URL)
167185

168-
// Return immediately with the short code
186+
// Wait for rendering to complete before returning to client
187+
log.Printf("Waiting for rendering to complete for %s before returning to client", generatedShortCode)
188+
189+
// Wait for up to the configured timeout for rendering to complete
190+
timeoutDuration := time.Duration(config.AppConfig.RenderTimeoutSeconds) * time.Second
191+
if renderer.GlobalRenderQueue.WaitForRender(req.URL, timeoutDuration) {
192+
// Fetch updated link after rendering
193+
updatedLink, fetchErr := db.GetLinkByShortCode(generatedShortCode)
194+
if fetchErr == nil {
195+
if updatedLink.RenderStatus == db.RenderStatusCompleted {
196+
log.Printf("Rendering completed successfully for %s, returning ready short code to client", generatedShortCode)
197+
c.JSON(http.StatusCreated, GenerateResponse{
198+
ShortCode: updatedLink.ShortCode,
199+
OriginalURL: updatedLink.OriginalURL,
200+
})
201+
return
202+
} else if updatedLink.RenderStatus == db.RenderStatusFailed {
203+
log.Printf("Rendering failed for %s, but returning short code anyway", generatedShortCode)
204+
c.JSON(http.StatusCreated, GenerateResponse{
205+
ShortCode: updatedLink.ShortCode,
206+
OriginalURL: updatedLink.OriginalURL,
207+
})
208+
return
209+
}
210+
} else {
211+
log.Printf("Error fetching updated link after render wait for %s: %v", generatedShortCode, fetchErr)
212+
}
213+
} else {
214+
log.Printf("Timeout waiting for render completion of %s, returning short code anyway", generatedShortCode)
215+
}
216+
217+
// Fallback: return the short code even if rendering didn't complete
218+
// (This handles timeout cases or other issues)
169219
c.JSON(http.StatusCreated, GenerateResponse{
170220
ShortCode: newLink.ShortCode,
171221
OriginalURL: newLink.OriginalURL,

0 commit comments

Comments
 (0)