( rw http.ResponseWriter, r *http.Request, connect httpapi.EventSender, )
| 2103 | } |
| 2104 | |
| 2105 | func (api *API) watchWorkspace( |
| 2106 | rw http.ResponseWriter, |
| 2107 | r *http.Request, |
| 2108 | connect httpapi.EventSender, |
| 2109 | ) { |
| 2110 | ctx := r.Context() |
| 2111 | workspace := httpmw.WorkspaceParam(r) |
| 2112 | apiKey := httpmw.APIKey(r) |
| 2113 | |
| 2114 | sendEvent, senderClosed, err := connect(rw, r) |
| 2115 | if err != nil { |
| 2116 | httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ |
| 2117 | Message: "Internal error setting up server-sent events.", |
| 2118 | Detail: err.Error(), |
| 2119 | }) |
| 2120 | return |
| 2121 | } |
| 2122 | // Prevent handler from returning until the sender is closed. |
| 2123 | defer func() { |
| 2124 | <-senderClosed |
| 2125 | }() |
| 2126 | |
| 2127 | sendUpdate := func(_ context.Context, _ []byte) { |
| 2128 | workspace, err := api.Database.GetWorkspaceByID(ctx, workspace.ID) |
| 2129 | if err != nil { |
| 2130 | _ = sendEvent(codersdk.ServerSentEvent{ |
| 2131 | Type: codersdk.ServerSentEventTypeError, |
| 2132 | Data: codersdk.Response{ |
| 2133 | Message: "Internal error fetching workspace.", |
| 2134 | Detail: err.Error(), |
| 2135 | }, |
| 2136 | }) |
| 2137 | return |
| 2138 | } |
| 2139 | |
| 2140 | data, err := api.workspaceData(ctx, []database.Workspace{workspace}) |
| 2141 | if err != nil { |
| 2142 | _ = sendEvent(codersdk.ServerSentEvent{ |
| 2143 | Type: codersdk.ServerSentEventTypeError, |
| 2144 | Data: codersdk.Response{ |
| 2145 | Message: "Internal error fetching workspace data.", |
| 2146 | Detail: err.Error(), |
| 2147 | }, |
| 2148 | }) |
| 2149 | return |
| 2150 | } |
| 2151 | if len(data.templates) == 0 { |
| 2152 | _ = sendEvent(codersdk.ServerSentEvent{ |
| 2153 | Type: codersdk.ServerSentEventTypeError, |
| 2154 | Data: codersdk.Response{ |
| 2155 | Message: "Forbidden reading template of selected workspace.", |
| 2156 | }, |
| 2157 | }) |
| 2158 | return |
| 2159 | } |
| 2160 | |
| 2161 | appStatus := codersdk.WorkspaceAppStatus{} |
| 2162 | if len(data.appStatuses) > 0 { |
no test coverage detected