class Blufin::YmlJavaApiResourceWriter

Constants

PACKAGE
SERVICE

Public Class Methods

new(site, schema_resources) click to toggle source

Initialize the class. @return void

# File lib/core/yml_writers/yml_java_api_resource_writer.rb, line 10
def initialize(site, schema_resources)

    @schema_resources = schema_resources

    raise RuntimeError, 'Could not find valid @schema_resources.' if @schema_resources.nil? || !@schema_resources.is_a?(Hash)

    @site             = Blufin::SiteResolver::validate_site(site)
    @site_name        = Blufin::SiteResolver::get_site_name(@site)
    @site_domain      = Blufin::SiteResolver::get_site_domain(@site)
    @site_domain_gsub = @site_domain.strip == '' ? '' : "#{@site_domain}."
    @site_location    = "#{Blufin::SiteResolver::get_site_location(@site)}/"

    # Wipe out all previous files.
    Blufin::YmlSchemaValidator::VALID_SCHEMAS_GENERATE.each do |schema|
        path_to_wipe_out = "#{get_java_path(@site, schema, SERVICE, PACKAGE)}"
        if Blufin::Files::path_exists(path_to_wipe_out)
            if Blufin::Files::get_files_in_dir(path_to_wipe_out).any?
                Blufin::Terminal::command('rm *', path_to_wipe_out, false, false)
            end
        end
    end

end

Public Instance Methods

write() click to toggle source

@return void

# File lib/core/yml_writers/yml_java_api_resource_writer.rb, line 35
def write

    @schema_resources.each do |schema_table, resource_data|

        # This filters out the "mock" schema used for testing.
        next if schema_table.split('.')[0] == Blufin::YmlSchemaValidator::MOCK

        # Only write PARENT resources as they will contain the others as 'dependents'.
        next unless resource_data[:tree].length < 2

        # Skip if this resource has no HTTP Methods.
        next unless Blufin::YmlCommon::has_at_least_one_http_method(resource_data, Blufin::YmlSchemaValidator::CONFIG_INTERNAL)

        @schema = schema_table.split('.')[0]
        @table  = schema_table.split('.')[1]
        @type   = resource_data[:type]

        @import_statements = []

        auth_level       = Blufin::SiteAuth::get_auth_level_for_table(@schema, @table)
        table_name       = Blufin::Strings::snake_case_to_camel_case(@table)
        table_name_lower = Blufin::Strings::snake_case_to_camel_case_lower(@table)
        class_name       = "#{table_name}Resource"
        auth_string      = ''

        # TODO - THIS CANNOT BE HARD-CODED TO FALSE/TRUE.
        is_public        = false
        is_secured       = false
        is_account_aware = false
        is_user_aware    = false

        if auth_level == Blufin::SiteAuth::LEVEL_ACCOUNT || auth_level == Blufin::SiteAuth::LEVEL_ACCOUNT_USER
            is_secured       = true
            is_account_aware = true
            auth_string      = '{BY.ACCOUNT}'
        end

        if auth_level == Blufin::SiteAuth::LEVEL_ACCOUNT_USER
            is_secured    = true
            is_user_aware = true
            auth_string   = '{BY.ACCOUNT, BY.USER}'

        end

        # TODO - THIS CANNOT BE HARD-CODED TO FALSE.
        is_oauth = false

        # TODO - REMOVE (AFTER OAUTH IS FIXED -- HANDY DEBUG STRING)
        # puts "\x1B[38;5;154m#{@schema}.#{@table}\x1B[0m \xe2\x86\x92 \x1B[38;5;196m#{auth_level}\x1B[0m"

        # TODO - REMOVE
        # puts "\x1B[38;5;198m#{schema_table}\x1B[0m"
        # puts resource_data.inspect

        @import_statements << 'import org.blufin.sdk.rest.PatchOperation;'
        @import_statements << 'import org.blufin.api.base.AbstractResource;'
        @import_statements << 'import org.blufin.core.auth.annotations.Public;' if is_public
        @import_statements << 'import org.blufin.core.auth.annotations.Secured;' if is_secured
        @import_statements << 'import org.blufin.core.auth.annotations.OAuth;' if is_oauth
        @import_statements << 'import org.blufin.core.auth.annotations.helper.BY;'
        @import_statements << 'import org.blufin.sdk.constants.SdkConstants;'
        @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::SDK}.dto.#{table_name};"
        @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::SDK}.metadata.#{table_name}#{Blufin::YmlJavaMetaWriter::META_DATA};"
        @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::API}.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.validator.#{table_name}Validator;"
        @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::API}.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.model.#{table_name}Model;"
        @import_statements << 'import java.util.List;'
        @import_statements << 'import org.springframework.http.ResponseEntity;'
        @import_statements << 'import org.springframework.web.bind.annotation.PathVariable;'
        @import_statements << 'import org.springframework.web.bind.annotation.RequestParam;'
        @import_statements << 'import org.springframework.web.bind.annotation.GetMapping;'
        @import_statements << 'import org.springframework.web.bind.annotation.PostMapping;'
        @import_statements << 'import org.springframework.web.bind.annotation.PutMapping;'
        @import_statements << 'import org.springframework.web.bind.annotation.PatchMapping;'
        @import_statements << 'import org.springframework.web.bind.annotation.DeleteMapping;'
        @import_statements << 'import org.springframework.web.bind.annotation.RestController;'
        @import_statements << 'import java.util.List;'

        content_inner = []
        content_inner << '@RestController'
        content_inner << '@TestNotRequired'
        content_inner << "public class #{class_name} extends AbstractResource {"

        lb = "\n            " # line-break

        if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::GET)
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @GetMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity get#{table_name}(#{lb}@RequestParam(name = SdkConstants.FIELDS, required = false) String fields,#{lb}@RequestParam(name = SdkConstants.SORT, required = false) String sort,#{lb}@RequestParam(name = SdkConstants.PAGE, required = false) String page,#{lb}@RequestParam(name = SdkConstants.ENTRIES, required = false) String entries,#{lb}@RequestParam(name = SdkConstants.FILTERS, required = false) String filters) {"
            content_inner << ''
            content_inner << "        return getPaginatedResponse(#{table_name}Model.getInstance(), #{table_name}#{Blufin::YmlJavaMetaWriter::META_DATA}.getInstance(), fields, sort, page, entries, filters);"
            content_inner << '    }'
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @GetMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}/{ids:[0-9\\\\-,]+}\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity get#{table_name}(#{lb}@PathVariable(\"ids\") String ids,#{lb}@RequestParam(name = SdkConstants.FIELDS, required = false) String fields,#{lb}@RequestParam(name = SdkConstants.SORT, required = false) String sort) {"
            content_inner << ''
            content_inner << "        return getIdSetResponse(#{table_name}Model.getInstance(), #{table_name}#{Blufin::YmlJavaMetaWriter::META_DATA}.getInstance(), ids, fields, sort);"
            content_inner << '    }'
        end

        if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::POST)
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @PostMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity post#{table_name}(#{lb}@RequestBody #{table_name} #{table_name_lower}) {"
            content_inner << ''
            content_inner << "        return post(#{table_name}Model.getInstance(), #{table_name}MetaData.getInstance(), #{table_name}Validator.getInstance(), #{table_name_lower});"
            content_inner << '    }'
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @PostMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}/list\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity post#{table_name}List(#{lb}@RequestBody List<#{table_name}> #{table_name_lower}List) {"
            content_inner << ''
            content_inner << "        return post(#{table_name}Model.getInstance(), #{table_name}MetaData.getInstance(), #{table_name}Validator.getInstance(), #{table_name_lower}List);"
            content_inner << '    }'
        end

        if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PUT)
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @PutMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity put#{table_name}(#{lb}@RequestBody #{table_name} #{table_name_lower}) {"
            content_inner << ''
            content_inner << "        return put(#{table_name}Model.getInstance(), #{table_name}MetaData.getInstance(), #{table_name}Validator.getInstance(), #{table_name_lower});"
            content_inner << '    }'
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @PutMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}/list\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity put#{table_name}List(#{lb}@RequestBody List<#{table_name}> #{table_name_lower}List) {"
            content_inner << ''
            content_inner << "        return put(#{table_name}Model.getInstance(), #{table_name}MetaData.getInstance(), #{table_name}Validator.getInstance(), #{table_name_lower}List);"
            content_inner << '    }'
        end

        if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PATCH)
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @PatchMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity patch#{table_name}(#{lb}@RequestBody List<PatchOperation> #{table_name_lower}Patch) {"
            content_inner << ''
            content_inner << "        return patch(#{table_name}Model.getInstance(), #{table_name}MetaData.getInstance(), #{table_name}Validator.getInstance(), #{table_name_lower}Patch);"
            content_inner << '    }'
        end

        if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::DELETE)
            content_inner << ''
            content_inner << '    @Public' if is_public
            content_inner << '    @OAuth' if is_oauth
            content_inner << "    @DeleteMapping(\"/#{@schema_resources["#{schema_table}"][:resource]}/{ids:[0-9\\\\-,]+}\")"
            content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
            content_inner << "    public ResponseEntity delete#{table_name}(#{lb}@PathVariable(\"ids\") String ids) {"
            content_inner << ''
            content_inner << "        return delete(#{table_name}Model.getInstance(), #{table_name}MetaData.getInstance(), #{table_name}Validator.getInstance(), ids);"
            content_inner << '    }'
        end

        if !resource_data[:dependents].nil? && resource_data[:dependents].any?
            resource_data[:dependents].each do |dependent|

                dependent_resource_data = @schema_resources["#{@schema}.#{dependent}"]
                dependent_auth_level    = Blufin::SiteAuth::get_auth_level_for_table(dependent_resource_data[:schema], dependent_resource_data[:table]) # TODO - IMPLEMENT OR DELETE (ONCE WE START DOING AUTH STUFF)

                dcc                = Blufin::Strings::snake_case_to_camel_case(dependent)
                dccl               = Blufin::Strings::snake_case_to_camel_case_lower(dependent)
                uri                = @schema_resources["#{@schema}.#{dependent}"][:resource]
                uri_with_parent_id = ''
                uri_parts          = uri.split('/')
                uri_parts.each_with_index do |uri_part, idx|
                    uri_with_parent_id = uri_with_parent_id + '/' + uri_part
                    uri_with_parent_id = uri_with_parent_id + '/{parentId}' if (idx + 2) == uri_parts.length

                end
                uri_with_parent_id.slice!(0)

                # TODO - REMOVE
                # puts "\x1B[38;5;166m#{dependent_resource_data[:schema]}.#{dependent_resource_data[:table]}\x1B[0m \xe2\x86\x92 \x1B[38;5;150m#{dependent_auth_level}\x1B[0m"

                # TODO - REMOVE
                # puts dependent_resource_data.to_yaml

                @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::SDK}.dto.#{dcc};"
                @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::SDK}.metadata.#{dcc}#{Blufin::YmlJavaMetaWriter::META_DATA};"
                @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::API}.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.validator.#{dcc}Validator;"
                @import_statements << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.#{Blufin::SiteServices::API}.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.model.#{dcc}Model;"
                
                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::GET)
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @GetMapping(\"/#{uri}\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity get#{dcc}(#{lb}@RequestParam(name = SdkConstants.FIELDS, required = false) String fields,#{lb}@RequestParam(name = SdkConstants.SORT, required = false) String sort,#{lb}@RequestParam(name = SdkConstants.PAGE, required = false) String page,#{lb}@RequestParam(name = SdkConstants.ENTRIES, required = false) String entries,#{lb}@RequestParam(name = SdkConstants.FILTERS, required = false) String filters) {"
                    content_inner << ''
                    content_inner << "        return getPaginatedResponse(#{dcc}Model.getInstance(), #{dcc}#{Blufin::YmlJavaMetaWriter::META_DATA}.getInstance(), fields, sort, page, entries, filters);"
                    content_inner << '    }'
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @GetMapping(\"/#{uri}/{ids:[0-9\\\\-,]+}\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity get#{dcc}(#{lb}@PathVariable(\"ids\") String ids,#{lb}@RequestParam(name = SdkConstants.FIELDS, required = false) String fields,#{lb}@RequestParam(name = SdkConstants.SORT, required = false) String sort) {"
                    content_inner << ''
                    content_inner << "        return getIdSetResponse(#{dcc}Model.getInstance(), #{dcc}#{Blufin::YmlJavaMetaWriter::META_DATA}.getInstance(), ids, fields, sort);"
                    content_inner << '    }'
                end

                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::POST) && dependent_resource_data[:type] == Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @PostMapping(\"/#{uri_with_parent_id}\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity post#{dcc}(#{lb}@PathVariable(\"parentId\") int parentId,#{lb}@RequestBody #{dcc} #{dccl}) {"
                    content_inner << ''
                    content_inner << "        return post(parentId, #{dcc}Model.getInstance(), #{dcc}MetaData.getInstance(), #{dcc}Validator.getInstance(), #{dccl});"
                    content_inner << '    }'
                end

                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::POST) && dependent_resource_data[:type] == Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LIST
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @PostMapping(\"/#{uri_with_parent_id}/list\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity post#{dcc}List(#{lb}@PathVariable(\"parentId\") int parentId,#{lb}@RequestBody List<#{dcc}> #{dccl}List) {"
                    content_inner << ''
                    content_inner << "        return post(parentId, #{dcc}Model.getInstance(), #{dcc}MetaData.getInstance(), #{dcc}Validator.getInstance(), #{dccl}List);"
                    content_inner << '    }'
                end

                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PUT) && dependent_resource_data[:type] == Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @PutMapping(\"/#{uri_with_parent_id}\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity put#{dcc}(#{lb}@PathVariable(\"parentId\") int parentId,#{lb}@RequestBody #{dcc} #{dccl}) {"
                    content_inner << ''
                    content_inner << "        return put(parentId, #{dcc}Model.getInstance(), #{dcc}MetaData.getInstance(), #{dcc}Validator.getInstance(), #{dccl});"
                    content_inner << '    }'
                end

                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PUT) && dependent_resource_data[:type] == Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LIST
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @PutMapping(\"/#{uri_with_parent_id}/list\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity put#{dcc}List(#{lb}@PathVariable(\"parentId\") int parentId,#{lb}@RequestBody List<#{dcc}> #{dccl}) {"
                    content_inner << ''
                    content_inner << "        return put(parentId, #{dcc}Model.getInstance(), #{dcc}MetaData.getInstance(), #{dcc}Validator.getInstance(), #{dccl});"
                    content_inner << '    }'
                end

                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PATCH)
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @PatchMapping(\"/#{uri}/{id}\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity patch#{dcc}(#{lb}@PathVariable(\"id\") int id,#{lb}@RequestBody List<PatchOperation> #{dccl}Patch) {"
                    content_inner << ''
                    content_inner << "        return patch(id, #{dcc}Model.getInstance(), #{dcc}MetaData.getInstance(), #{dcc}Validator.getInstance(), #{dccl}Patch);"
                    content_inner << '    }'
                end

                if dependent_resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::DELETE)
                    content_inner << ''
                    content_inner << '    @Public' if is_public
                    content_inner << '    @OAuth' if is_oauth
                    content_inner << "    @DeleteMapping(\"/#{uri}/{ids:[0-9\\\\-,]+}\")"
                    content_inner << "    @Secured(#{auth_string})" if is_account_aware || is_user_aware
                    content_inner << "    public ResponseEntity delete#{dcc}(#{lb}@PathVariable(\"ids\") String ids) {"
                    content_inner << ''
                    content_inner << "        return delete(#{dcc}Model.getInstance(), #{dcc}MetaData.getInstance(), #{dcc}Validator.getInstance(), ids);"
                    content_inner << '    }'
                end

            end

        end

        content = ["package #{get_package(@site, resource_data[:schema], PACKAGE, SERVICE)};", '']
        content = content.push(*@import_statements)
        content << ''
        content = content.push(*content_inner)
        content << '}'

        full_file_path = "#{get_java_path(@site, @schema, SERVICE, PACKAGE)}/#{class_name}.java"

        write_file_java(full_file_path, content).gsub(@site_location, '')

    end

end