@@ -194,9 +194,9 @@ func (h *HostUsecase) GetInstallCommand(ctx context.Context, user *domain.User)
194194
195195// InstallScript implements domain.HostUsecase.
196196func (h * HostUsecase ) InstallScript (ctx context.Context , token * domain.InstallReq ) (string , error ) {
197- key := fmt . Sprintf ( "host:token:%s" , token .Token )
198- if _ , err := h . redis . Get ( ctx , key ). Result (); err != nil {
199- return "" , errcode . ErrInvalidInstallToken
197+ teamID , err := h . teamIDFromInstallToken ( ctx , token .Token )
198+ if err != nil {
199+ return "" , err
200200 }
201201
202202 tplName := "install"
@@ -212,19 +212,36 @@ func (h *HostUsecase) InstallScript(ctx context.Context, token *domain.InstallRe
212212 }
213213 buf := bytes .NewBuffer ([]byte ("" ))
214214 param := map [string ]any {
215- "token" : token .Token ,
216- "grpc_url" : h .cfg .TaskFlow .GrpcURL ,
217- "base_url" : h .cfg .Server .BaseURL ,
218- "installer_url" : h .installerURL (),
219- "docker_bundle_path" : h .installerBundlePath ("docker.tgz" ),
220- "host_bundle_path" : h .hostBundlePath (),
215+ "token" : token .Token ,
216+ "grpc_url" : h .cfg .TaskFlow .GrpcURL ,
217+ "base_url" : h .cfg .Server .BaseURL ,
218+ "installer_url" : h .installerURL (),
219+ "docker_bundle_path" : h .installerBundlePath ("docker.tgz" ),
220+ "host_bundle_path" : h .hostBundlePath (),
221+ "extension_images_manifest_path" : h .extensionImagesManifestPath (teamID ),
221222 }
222223 if err := tmp .Execute (buf , param ); err != nil {
223224 return "" , fmt .Errorf ("failed to execute template %s" , err )
224225 }
225226 return buf .String (), nil
226227}
227228
229+ func (h * HostUsecase ) teamIDFromInstallToken (ctx context.Context , token string ) (uuid.UUID , error ) {
230+ key := fmt .Sprintf ("host:token:%s" , token )
231+ raw , err := h .redis .Get (ctx , key ).Result ()
232+ if err != nil {
233+ return uuid .Nil , errcode .ErrInvalidInstallToken
234+ }
235+ var user domain.User
236+ if err := json .Unmarshal ([]byte (raw ), & user ); err != nil {
237+ return uuid .Nil , nil
238+ }
239+ if user .Team == nil {
240+ return uuid .Nil , nil
241+ }
242+ return user .Team .ID , nil
243+ }
244+
228245func (h * HostUsecase ) installerURL () string {
229246 if h .cfg .Server .BaseURL == "" {
230247 return ""
@@ -249,6 +266,13 @@ func (h *HostUsecase) installerBundlePath(name string) string {
249266 return "/" + strings .Trim (h .cfg .StaticFiles .RoutePrefix , "/" ) + "/installer/{{.arch}}/" + name
250267}
251268
269+ func (h * HostUsecase ) extensionImagesManifestPath (teamID uuid.UUID ) string {
270+ if teamID == uuid .Nil {
271+ return ""
272+ }
273+ return "/" + strings .Trim (h .cfg .StaticFiles .RoutePrefix , "/" ) + "/extensions/teams/" + teamID .String () + "/images/{{.arch}}/manifest.json"
274+ }
275+
252276// List implements domain.HostUsecase.
253277func (h * HostUsecase ) List (ctx context.Context , uid uuid.UUID ) (* domain.HostListResp , error ) {
254278 user , err := h .userRepo .Get (ctx , uid )
0 commit comments