Загрузка данных


create_db.sql
250 B
-- poweruser
SET SESSION ROLE db_mgr;
create DATABASE "xapidb";
-- sysadmin
SELECT dba.create_login(__login_name => 'xapiservice', __pass => 'xapiservice123' );
SELECT dba.create_login(__login_name => 'xapideveloper', __pass => 'xapideveloper123' );


CREATE OR REPLACE FUNCTION xapi_check_service_subscription(
    p_subscriber_name text,
    p_http_method text,
    p_method_url text,  -- было p_service_name
    p_headers jsonb
)
RETURNS jsonb AS $$
DECLARE
    v_subscriber_id integer;
    v_subscriber_name text;
    v_method_id integer;
    v_system_id integer;
    v_granted integer;
    v_required_parameters jsonb := '{}';
    v_missing_parameters jsonb := '{}';
    v_header_value text;   
    v_systems RECORD;
    v_param RECORD;
    v_received_value TEXT;
    v_value text;
    v_found BOOLEAN := FALSE;
    v_system_name text;
BEGIN
    -- Получаем ID подписчика
    SELECT subscriber_id, subscriber_name 
    INTO v_subscriber_id, v_subscriber_name
    FROM xapi_subscribers
    WHERE tech_user_name = p_subscriber_name;

    if v_subscriber_name = 'xapi' then
      RETURN jsonb_build_object('result','OK','message','Доступ к методу разрешен','system_name','xapi');
    end if;
   
    IF v_subscriber_id IS NULL then
      return jsonb_build_object('result','ERROR','message','Не найден подписчик ' || p_subscriber_name,'system_name','');
    END IF;

    -- Получаем ID системы
    -- по списку подписок
    for v_systems in 
      SELECT system_id, count(*) over (partition by subscriber_id) subscriber_systems_count
      FROM xapi_system_subscribers
      WHERE subscriber_id = v_subscriber_id
    loop
	  if v_systems.subscriber_systems_count = 1 then
	    v_system_id := v_systems.system_id;
	    exit;
	  end if;
	 
      -- плюс параметры
	  FOR v_param IN
        SELECT sp.parameter_id, p.parameter_name, sp.parameter_value
        FROM xapi_system_parameters sp
        JOIN xapi_parameters p ON sp.parameter_id = p.parameter_id
        WHERE sp.system_id = v_systems.system_id
      loop	    
        -- Извлекаем значение из переданных заголовков
        SELECT value INTO v_received_value
        FROM jsonb_each_text(p_headers)
        WHERE key = v_param.parameter_name;

        -- Если значение совпадает — отмечаем, что хотя бы один параметр прошёл
        IF v_received_value = v_param.parameter_value THEN
          v_found := TRUE;
          EXIT; -- Выходим из цикла, так как нашли подходящий параметр
        END IF;
      END LOOP;
     
      -- у системы не задан параметры или параметр найден
      if not found or v_found then 
  	    v_system_id := v_systems.system_id;
  	    exit;
      end if;
    end loop;
   
    IF v_system_id IS NULL THEN
      RETURN jsonb_build_object('result','ERROR','message','Не определена внешняя система для подписчика ' || p_subscriber_name,'system_name','');
    END IF;

    SELECT system_name
    INTO v_system_name
    FROM xapi_systems
    WHERE system_id = v_system_id;

    -- Получаем ID метода через URL и HTTP-метод
    SELECT m.method_id INTO v_method_id
    FROM xapi_methods m
    WHERE m.method_url = p_method_url
      AND m.http_method = p_http_method
      AND m.active = 'Y';

    IF v_method_id IS NULL THEN
      RETURN jsonb_build_object('result','ERROR','message','Метод ' || p_http_method || ' ' || p_method_url || ' отсутствует в xAPI или отключен','system_name',v_system_name);
    END IF;

    -- Проверка активности системы
    for v_systems in 
      SELECT active, system_name FROM xapi_systems WHERE system_id = v_system_id 
    loop
      IF v_systems.active = 'N' THEN
        RETURN jsonb_build_object('result','ERROR','message','Внешняя система ' || v_systems.system_name || ' деактивирована','system_name',v_system_name);
      END IF;
    end loop;

    -- Проверяем, есть ли разрешение у системы на этот метод
    SELECT count(*) INTO v_granted
    FROM xapi_method_grants
    WHERE method_id = v_method_id
      AND system_id = v_system_id
      and CURRENT_DATE between start_date and COALESCE(end_date, 'infinity'::date);

    IF v_granted = 0 THEN
      RETURN jsonb_build_object('result','ERROR','message','Доступ к методу ' || p_http_method || ' ' || p_method_url || ' запрещен','system_name',v_system_name);
    END IF;

    -- Возвращаем успешный результат с именем системы
    RETURN jsonb_build_object('result','OK','message','Доступ к методу разрешен','system_name',v_system_name);
END;
$$ LANGUAGE plpgsql;

grant execute on function xapi_check_service_subscription TO PUBLIC;
grant ALL on function xapi_check_service_subscription TO xapideveloper;


variables:
  PROJECT_NAME: vendors
  TEAM_NAME: nfs
  IMAGE_REGISTRY: harbor.vimpelcom.ru
  IMAGE: "xapi_vendors"
  TAG: "1.0.1"
  SERVICE_PORT: "8111"
stages:
  - build_app
  - build_docker
  - deploy

build_app:
  image: harbor.vimpelcom.ru/nfs/ubuntu-builder@sha256:8a194582d2316a1b3658b7441f267c3809d98de5f6cdacdc8ac25d221b5bb941
  stage: build_app
  artifacts:
    paths:
      - target/*.jar
    expire_in: 1 day
  script: 
    #push to harbor
    - java -version
    - mvn clean package -e
  tags:
    - yd-m6-ktrun34-build-deploy

.build_docker_template:
  image: harbor.vimpelcom.ru/dockerhub/library/docker@sha256:6f4ccd1fda9a901a738e925982c81e9ba960c11bb0c9136fc2bace7233e8e9ce
  stage: build_docker
  services:
    - harbor.vimpelcom.ru/dockerhub/library/docker@sha256:6f4ccd1fda9a901a738e925982c81e9ba960c11bb0c9136fc2bace7233e8e9ce
  variables:
    DOCKER_HOST: tcp://localhost:2375
    DOCKER_TLS_CERTDIR: ""
  dependencies:
    - build_app
  before_script:
    - cp ./.gitlab-ci/certs/VimpelcomCAG2.pem /root/my-root-ca.crt
    - cp ./.gitlab-ci/certs/VimpelcomCAG2.pem /usr/local/share/ca-certificates/VimpelcomCAG2.crt
    - cat /root/my-root-ca.crt >> /etc/ssl/certs/ca-certificates.crt
    - update-ca-certificates
    - sleep 60
  script:
    - docker build -t ${IMAGE_REGISTRY}/${TEAM_NAME}/${PROJECT_NAME}_${ENV} -f ./.gitlab-ci/Dockerfile . 
    - docker image ls
    - docker push ${IMAGE_REGISTRY}/${TEAM_NAME}/${PROJECT_NAME}_${ENV}
  tags:
    - k8s

.deploy_template:
  #image: harbor.vimpelcom.ru/common/ci-tools:latest
  image: harbor.vimpelcom.ru/nfs/ubuntu-builder:2.0
  stage: deploy
  script:
    - echo "${SERVER_KEY}" >> ssh_key
    - chmod 600 ssh_key
    - mkdir -p ~/.ssh
    - ssh-keyscan ${HOST} >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
    - ssh -i ssh_key dorootless@${HOST} "mkdir -p ~/app"
    - scp -i ssh_key ./.gitlab-ci/docker-compose.yml dorootless@${HOST}:~/app/docker-compose.yml
    # удалять старый контейнер
    - ssh -i ssh_key dorootless@${HOST} "docker rm -f ${PROJECT_NAME}_${ENV}"
    - ssh -i ssh_key dorootless@${HOST} "docker image rm ${IMAGE_REGISTRY}/${TEAM_NAME}/${PROJECT_NAME}_${ENV}"
    # - scp -i ssh_key ./.gitlab-ci/envs/envs-test.env dorootless@camel-test.xapi-test.cloud.vimpelcom.ru:~/app/variables.env
    - ssh -i ssh_key dorootless@${HOST} "echo "NFS_URL=${TEST_NFS_URL}">~/app/variables.env"
    - ssh -i ssh_key dorootless@${HOST} "echo "NFS_USER=${TEST_NFS_USER}">>~/app/variables.env"
    - ssh -i ssh_key dorootless@${HOST} "echo "NFS_PASSWORD=${TEST_NFS_PASSWORD}">>~/app/variables.env"
    # - scp -i ssh_key ./.gitlab-ci/nginx/nginx.conf dorootless@${HOST}:~/conf/nginx.conf
    # - ssh -i ssh_key "sed -i -e 's/replace_hostname/${HOST}/g' ~/conf/nginx.conf"
    #пулим и запускаем новый контейнер
    - ssh -i ssh_key dorootless@${HOST} "docker pull ${IMAGE_REGISTRY}/${TEAM_NAME}/${PROJECT_NAME}_${ENV}"
    - ssh -i ssh_key dorootless@${HOST} "docker run -d -p ${SERVICE_PORT}:${SERVICE_PORT} --name ${PROJECT_NAME}_${ENV} --env-file=/export/home/dorootless/app/variables.env ${IMAGE_REGISTRY}/${TEAM_NAME}/${PROJECT_NAME}_${ENV}"
  tags:
    - k8s

# build_app_dev:
#   extends: .build_app_template
#   when: manual
#   variables: 
#     ENV: dev
#   only:
#     refs:
#       - dev

# build_app_test:
#   extends: .build_app_template
#   when: manual
#   variables:
#     ENV: test
#   only:
#     refs:
#       - test

# build_app_uat:
#   extends: .build_app_template
#   when: manual
#   variables:
#     ENV: uat
#   only:
#     refs:
#       - uat

# build_app_prod:
#   extends: .build_app_template
#   when: manual
#   variables:
#     ENV: prod
#   only:
#     refs:
#       - main

build_docker_dev:
  extends: .build_docker_template
  when: manual
  variables: 
    ENV: dev
  only:
    refs:
      - dev

build_docker_test:
  extends: .build_docker_template
  when: manual
  variables:
    ENV: test
  only:
    refs:
      - main

build_docker_uat:
  extends: .build_docker_template
  when: manual
  variables:
    ENV: uat
  only:
    refs:
      - uat

build_docker_prod:
  extends: .build_docker_template
  when: manual
  variables:
    ENV: prod
  only:
    refs:
      - test

deploy_dev:
  extends: .deploy_template
  when: manual
  variables: 
    ENV: dev
    SERVER_KEY: ${DEV_KEY}
    HOST: camel-karavan-dev.xapi-dev.cloud.vimpelcom.ru
    NFS_USER: ${DEV_NFS_USER}
    NFS_PASSWORD: ${DEV_NFS_PASSWORD}
    NFS_HOST: ${DEV_NFS_HOST}
  only:
    refs:
      - dev

deploy_test:
  extends: .deploy_template
  when: manual
  variables:
    ENV: test
    SERVER_KEY: ${TEST_KEY}
    HOST: camel-test.xapi-test.cloud.vimpelcom.ru
    NFS_USER: ${TEST_NFS_USER}
    NFS_PASSWORD: ${TEST_NFS_PASSWORD}
    NFS_HOST: ${TEST_NFS_HOST}
  only:
    refs:
      - main

deploy_uat:
  extends: .deploy_template
  when: manual
  variables:
    ENV: uat
    SERVER_KEY: ${UAT_KEY}
    HOST: camel-plrnd.xapi-prodlike.cloud.vimpelcom.ru
    NFS_USER: ${UAT_NFS_USER}
    NFS_PASSWORD: ${UAT_NFS_PASSWORD}
    NFS_HOST: ${UAT_NFS_HOST}
  only:
    refs:
      - uat

deploy_prod:
  extends: .deploy_template
  when: manual
  variables:
    ENV: prod
    SERVER_KEY: ${PROD_KEY}
    HOST: camel-prod.xapi-prod.cloud.vimpelcom.ru
    NFS_USER: ${PROD_NFS_USER}
    NFS_PASSWORD: ${PROD_NFS_PASSWORD}
    NFS_HOST: ${PROD_NFS_HOST}
  only:
    refs:
      - test


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>4.10.2</version>
    </parent>

    <artifactId>xapi_vendors</artifactId>
    <name>XAPI Vendors service</name>
    <description>An example showing Camel REST DSL and OpenApi with Spring Boot</description>
    <version>1.0.1</version>

    <properties>
        <camel-version>4.10.2</camel-version>
        <skip.starting.camel.context>false</skip.starting.camel.context>
        <jkube-maven-plugin-version>1.18.1</jkube-maven-plugin-version>
        <jkube.generator.from>registry.access.redhat.com/ubi9/openjdk-17:latest</jkube.generator.from>
        <jkube.build.switchToDeployment>true</jkube.build.switchToDeployment>
        <kafka-avro-serializer-version>7.1.1</kafka-avro-serializer-version>
        <reactor-version>3.7.0</reactor-version>
        <testcontainers-version>1.20.4</testcontainers-version>
        <hapi-structures-v24-version>2.5.1</hapi-structures-v24-version>
        <artemis-jakarta-version>2.38.0</artemis-jakarta-version>
        <category>Rest</category>
    </properties>

	<repositories>

	    <repository>
			<id>central</id>
			<url>file://${user.home}/.m2/repository</url>
	        <releases>
	            <enabled>false</enabled>
	        </releases>
	        <snapshots>
	            <enabled>false</enabled>
	        </snapshots>
	    </repository>
    
    	<repository>
			<id>xapi__mvn__camel</id>
			<!--suppress UnresolvedMavenProperty -->
            <url>https://${env.NEXUS_USER}:${env.NEXUS_PASSWORD}@nexus.vimpelcom.ru/repository/xapi__mvn__camel/</url>
			<name>xapi__mvn__camel</name>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
			<releases>
				<enabled>true</enabled>
			</releases>
		</repository>

    	<repository>
			<id>maven-central</id>
			<url>https://nexus.vimpelcom.ru/repository/maven-central/</url>
			<name>maven-central</name>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
			<releases>
				<enabled>true</enabled>
			</releases>
		</repository>
    
	</repositories>
    <pluginRepositories>


        <pluginRepository>
            <id>central</id>
            <url>file://${user.home}/.m2/repository</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>

        <pluginRepository>
            <id>xapi__mvn__camel</id>
            <url>https://${env.NEXUS_USER}:${env.NEXUS_PASSWORD}@nexus.vimpelcom.ru/repository/xapi__mvn__camel/</url>
            <name>xapi__mvn__camel</name>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </pluginRepository>

        <pluginRepository>
            <id>maven-central</id>
            <url>https://nexus.vimpelcom.ru/repository/maven-central/</url>
            <name>maven-central</name>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </pluginRepository>

    </pluginRepositories>


    <!-- Spring-Boot and Camel BOM -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.camel.springboot</groupId>
                <artifactId>camel-spring-boot-bom</artifactId>
                <version>${camel-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <!-- Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- Camel -->
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-openapi-java-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-servlet-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-platform-http-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-spring-jdbc-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-sql-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-jackson-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-direct-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <!-- custom -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-attachments</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core-model</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core-processor</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core-reifier</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-api</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-main</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jdbc</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-base-engine</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core-languages</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-http-base</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-management-api</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-tooling-model</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-tooling-util</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-base</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-support</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-util</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-xml-io</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-xml-io-util</artifactId>
            <version>4.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-xml-jaxp-util</artifactId>
            <version>4.10.2</version>
        </dependency>
		<dependency>
	    	<groupId>jakarta.xml.bind</groupId>
		    <artifactId>jakarta.xml.bind-api</artifactId>
		    <version>4.0.2</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jcl</artifactId>
		    <version>6.2.3</version>
		</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>6.2.3</version>
</dependency>

<dependency>
    <groupId>io.swagger.core.v3</groupId>
    <artifactId>swagger-annotations-jakarta</artifactId>
    <version>2.2.23</version>
</dependency>
<dependency>
    <groupId>io.swagger.core.v3</groupId>
    <artifactId>swagger-core-jakarta</artifactId>
    <version>2.2.23</version>
</dependency>
<dependency>
    <groupId>io.swagger.core.v3</groupId>
    <artifactId>swagger-models-jakarta</artifactId>
    <version>2.2.23</version>
</dependency>
<dependency>
    <groupId>io.swagger.parser.v3</groupId>
    <artifactId>swagger-parser</artifactId>
    <version>2.1.25</version>
</dependency>


        <!-- db driver -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <version>23.6.0.24.10</version>
        </dependency>

        <!-- metrics and expose for prometheus -->
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-micrometer-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-test-junit5</artifactId>
            <version>${camel-version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.4.3</version>
    	        <dependencies>
	                <dependency>
                	    <groupId>commons-logging</groupId>
            	        <artifactId>commons-logging</artifactId>
        	            <version>1.2</version>
    	            </dependency>
	            </dependencies>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>