public void copyApplication()

in server/src/main/java/com/epam/aidial/core/server/service/ApplicationService.java [287:340]


    public void copyApplication(ResourceDescriptor source, ResourceDescriptor destination, boolean overwrite, Consumer<Application> consumer) {
        verifyApplication(source);
        verifyApplication(destination);

        Application application = getApplication(source).getValue();
        Application.Function function = application.getFunction();

        EtagHeader etag = overwrite ? EtagHeader.ANY : EtagHeader.NEW_ONLY;
        consumer.accept(application);
        application.setName(destination.getUrl());

        boolean isPublicOrReview = isPublicOrReview(destination);
        String sourceFolder = (function == null) ? null : function.getSourceFolder();

        resourceService.computeResource(destination, etag, json -> {
            Application existing = ProxyUtil.convertToObject(json, Application.class);

            if (function != null) {
                if (existing == null || existing.getFunction() == null) {
                    function.setId(UrlUtil.encodePathSegment(idGenerator.get()));
                    function.setStatus(Application.Function.Status.UNDEPLOYED);
                    function.setTargetFolder(encodeTargetFolder(destination, function.getId()));

                    if (isPublicOrReview) {
                        function.setSourceFolder(function.getTargetFolder());
                    } else {
                        function.setAuthorBucket(destination.getBucketName());
                    }
                } else {
                    if (isPublicOrReview) {
                        throw new HttpException(HttpStatus.CONFLICT, "The application function must be deleted in public/review bucket");
                    }
                    application.setEndpoint(existing.getEndpoint());
                    application.getFeatures().setRateEndpoint(existing.getFeatures().getRateEndpoint());
                    application.getFeatures().setTokenizeEndpoint(existing.getFeatures().getTokenizeEndpoint());
                    application.getFeatures().setTruncatePromptEndpoint(existing.getFeatures().getTruncatePromptEndpoint());
                    application.getFeatures().setConfigurationEndpoint(existing.getFeatures().getConfigurationEndpoint());
                    function.setId(existing.getFunction().getId());
                    function.setAuthorBucket(existing.getFunction().getAuthorBucket());
                    function.setStatus(existing.getFunction().getStatus());
                    function.setTargetFolder(existing.getFunction().getTargetFolder());
                    function.setError(existing.getFunction().getError());
                }
            }

            return ProxyUtil.convertToString(application);
        });

        // for public/review application source folder is equal to target folder
        // source files are copied to read-only deployment bucket for such applications
        if (isPublicOrReview && function != null) {
            copyFolder(sourceFolder, function.getSourceFolder(), false);
        }
    }