@@ -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