HEX
Server: Apache/2.4.54 (Win64) OpenSSL/1.1.1p PHP/7.4.30
System: Windows NT website-api 10.0 build 20348 (Windows Server 2016) AMD64
User: SYSTEM (0)
PHP: 7.4.30
Disabled: NONE
Upload Files
File: C:/github_repos/casibase/object/image_cloud.go
// Copyright 2025 The casbin Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package object

import (
	"github.com/casibase/casibase/pkgimage"
)

func getImageFromService(owner string, provider string, clientImage *pkgimage.Image) *Image {
	return &Image{
		Owner:                   owner,
		Provider:                provider,
		Name:                    clientImage.Name,
		Category:                clientImage.Category,
		BootMode:                clientImage.BootMode,
		ImageId:                 clientImage.ImageId,
		ImageOwnerAlias:         clientImage.ImageOwnerAlias,
		OSName:                  clientImage.OSName,
		OSNameEn:                clientImage.OSNameEn,
		ImageFamily:             clientImage.ImageFamily,
		Architecture:            clientImage.Architecture,
		IsSupportIoOptimized:    clientImage.IsSupportIoOptimized,
		Size:                    clientImage.Size,
		ResourceGroupId:         clientImage.ResourceGroupId,
		SupplierName:            clientImage.SupplierName,
		Description:             clientImage.Description,
		Usage:                   clientImage.Usage,
		IsCopied:                clientImage.IsCopied,
		LoginAsNonRootSupported: clientImage.LoginAsNonRootSupported,
		ImageVersion:            clientImage.ImageVersion,
		OSType:                  clientImage.OSType,
		IsSubscribed:            clientImage.IsSubscribed,
		IsSupportCloudinit:      clientImage.IsSupportCloudinit,
		CreationTime:            clientImage.CreationTime,
		ProductCode:             clientImage.ProductCode,
		Progress:                clientImage.Progress,
		Platform:                clientImage.Platform,
		IsSelfShared:            clientImage.IsSelfShared,
		ImageName:               clientImage.ImageName,
		Status:                  clientImage.Status,
		ImageOwnerId:            clientImage.ImageOwnerId,
		IsPublic:                clientImage.IsPublic,
	}
}

func getImagesCloud(owner string, lang string) ([]*Image, error) {
	images := []*Image{}
	providers, err := getActiveCloudProviders(owner)
	if err != nil {
		return nil, err
	}

	for _, provider := range providers {
		client, err2 := pkgimage.NewImageClient(provider.Type, provider.ClientId, provider.ClientSecret, provider.Region, lang)
		if len(images) > 0 && err2 != nil {
			continue
		}
		if err2 != nil {
			return nil, err2
		}

		clientImages, err2 := client.GetImages()

		for _, clientImage := range clientImages {
			images = append(images, getImageFromService(owner, provider.Type, clientImage))
		}

	}

	return images, nil
}

func SyncImagesCloud(owner string, lang string) (bool, error) {
	images, err := getImagesCloud(owner, lang)
	if err != nil {
		return false, err
	}

	dbImages, err := GetImages(owner)
	if err != nil {
		return false, err
	}

	dbImageMap := map[string]*Image{}
	for _, dbImage := range dbImages {
		dbImageMap[dbImage.GetId()] = dbImage
	}

	for _, image := range images {
		if dbImage, ok := dbImageMap[image.GetId()]; ok {
			image.RemoteProtocol = dbImage.RemoteProtocol
			image.RemotePort = dbImage.RemotePort
			image.RemoteUsername = dbImage.RemoteUsername
			image.RemotePassword = dbImage.RemotePassword
		}
	}

	_, err = deleteImages(owner)
	if err != nil {
		return false, err
	}

	if len(images) == 0 {
		return false, nil
	}

	affected, err := addImages(images)
	return affected, err
}

//func updateImageCloud(oldImage *Image, image *Image) (bool, error) {
//	provider, err := getProvider(oldImage.Owner, oldImage.Provider)
//	if err != nil {
//		return false, err
//	}
//	if provider == nil {
//		return false, fmt.Errorf("The provider: %s does not exist", image.Provider)
//	}
//
//	client, err := service.NewImageClient(provider.Type, provider.ClientId, provider.ClientSecret, provider.Region)
//	if err != nil {
//		return false, err
//	}
//
//	if oldImage.State != image.State {
//		affected, _, err := client.UpdateImageState(oldImage.Name, image.State)
//		if err != nil {
//			return false, err
//		}
//
//		return affected, nil
//	}
//
//	return false, nil
//}