diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml
index a8cb98a51..619744987 100644
--- a/.github/workflows/build-docker-image.yml
+++ b/.github/workflows/build-docker-image.yml
@@ -48,6 +48,7 @@ jobs:
images: openim/openim-server
# generate Docker tags based on the following events/attributes
tags: |
+ type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
@@ -90,6 +91,7 @@ jobs:
images: registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-server
# generate Docker tags based on the following events/attributes
tags: |
+ type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
@@ -133,6 +135,7 @@ jobs:
images: ghcr.io/openimsdk/openim-server
# generate Docker tags based on the following events/attributes
tags: |
+ type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
diff --git a/.github/workflows/build-openim-web-image.yml b/.github/workflows/build-openim-web-image.yml
deleted file mode 100644
index 999c2e1e3..000000000
--- a/.github/workflows/build-openim-web-image.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-# Copyright © 2023 OpenIM open source community. 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.
-
-name: Build OpenIM Web Docker image
-
-on:
-# schedule:
-# - cron: '30 3 * * *'
- push:
- branches:
- # - main
- - release-*
- tags:
- - v*
- workflow_dispatch:
-
-env:
- # Common versions
- GO_VERSION: "1.20"
-
-jobs:
- build-openim-web-dockerhub:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v3
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-
-# docker.io/openim/openim-web:latest
- - name: Extract metadata (tags, labels) for Docker
- id: meta
- uses: docker/metadata-action@v5.0.0
- with:
- images: openim/openim-web
- # generate Docker tags based on the following events/attributes
- tags: |
- type=schedule
- type=ref,event=branch
- type=ref,event=pr
- type=semver,pattern={{version}}
- type=semver,pattern={{major}}.{{minor}}
- type=semver,pattern={{major}}
- type=sha
-
- - name: Log in to Docker Hub
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_PASSWORD }}
-
- - name: Build and push Docker image
- uses: docker/build-push-action@v5
- with:
- context: .
- file: ./build/images/openim-tools/openim-web/Dockerfile
- platforms: linux/amd64,linux/arm64
- push: ${{ github.event_name != 'pull_request' }}
- tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
-
- build-openim-web-aliyun:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v3
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-# registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-web:latest
- - name: Extract metadata (tags, labels) for Docker
- id: meta2
- uses: docker/metadata-action@v5.0.0
- with:
- images: registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-web
-
- - name: Log in to AliYun Docker Hub
- uses: docker/login-action@v3
- with:
- registry: registry.cn-hangzhou.aliyuncs.com
- username: ${{ secrets.ALIREGISTRY_USERNAME }}
- password: ${{ secrets.ALIREGISTRY_TOKEN }}
-
- - name: Build and push Docker image
- uses: docker/build-push-action@v5
- with:
- context: .
- file: ./build/images/openim-tools/openim-web/Dockerfile
- platforms: linux/amd64,linux/arm64
- push: ${{ github.event_name != 'pull_request' }}
- tags: ${{ steps.meta2.outputs.tags }}
- labels: ${{ steps.meta2.outputs.labels }}
-
- build-openim-web-ghcr:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v3
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-# ghcr.io/openimsdk/openim-web:latest
- - name: Extract metadata (tags, labels) for Docker
- id: meta2
- uses: docker/metadata-action@v5.0.0
- with:
- images: ghcr.io/openimsdk/openim-web
-
- - name: Log in to GitHub Container Registry
- uses: docker/login-action@v3
- with:
- registry: ghcr.io
- username: ${{ github.repository_owner }}
- password: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Build and push Docker image
- uses: docker/build-push-action@v5
- with:
- context: .
- file: ./build/images/openim-tools/openim-web/Dockerfile
- platforms: linux/amd64,linux/arm64
- push: ${{ github.event_name != 'pull_request' }}
- tags: ${{ steps.meta2.outputs.tags }}
- labels: ${{ steps.meta2.outputs.labels }}
\ No newline at end of file
diff --git a/.github/workflows/openimci.yml b/.github/workflows/openimci.yml
index 5f010db8a..d65c0dc89 100644
--- a/.github/workflows/openimci.yml
+++ b/.github/workflows/openimci.yml
@@ -130,14 +130,14 @@ jobs:
sudo make install
execute-scripts:
- name: Execute OpenIM script on ${{ matrix.os }}
+ name: Execute OpenIM Script On ${{ matrix.os }}
runs-on: ${{ matrix.os }}
environment:
name: openim
strategy:
matrix:
go_version: ["1.20"]
- os: ["ubuntu-latest"]
+ os: ["ubuntu-latest", "macos-latest"]
steps:
- name: Checkout code
uses: actions/checkout@v4
@@ -154,18 +154,52 @@ jobs:
version: '3.x' # If available, use the latest major version that's compatible
repo-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Docker Operations
+ # - name: Install latest Bash (macOS only)
+ # if: runner.os == 'macOS'
+ # run: |
+ # /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+ # brew update
+
+ # brew install bash
+ # brew install gnu-sed
+
+ # echo "/usr/local/bin" >> $GITHUB_PATH
+ # echo "$(brew --prefix)/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH
+ # continue-on-error: true
+
+ - name: Set up Docker for Ubuntu
+ if: runner.os == 'Linux'
run: |
sudo make init
sudo docker compose up -d
sudo sleep 20
- - name: Module Operations
+ # - name: Set up Docker for macOS
+ # if: runner.os == 'macOS'
+ # run: |
+ # brew install --cask docker
+ # open /Applications/Docker.app
+
+ # sleep 10
+ # docker-compose --version || brew install docker-compose
+
+ # docker-compose up -d
+ # sleep 20
+
+ - name: Module Operations for Ubuntu
+ if: runner.os == 'Linux'
run: |
sudo make tidy
sudo make tools.verify.go-gitlint
- - name: Build, Start, Check Services and Print Logs
+ # - name: Module Operations for macOS
+ # if: runner.os == 'macOS'
+ # run: |
+ # make tidy
+ # make tools.verify.go-gitlint
+
+ - name: Build, Start, Check Services and Print Logs for Ubuntu
+ if: runner.os == 'Linux'
run: |
sudo make init && \
sudo make build && \
@@ -173,6 +207,15 @@ jobs:
sudo make check || \
(echo "An error occurred, printing logs:" && sudo cat ./_output/logs/* 2>/dev/null)
+ # - name: Build, Start, Check Services and Print Logs for macOS
+ # if: runner.os == 'macOS'
+ # run: |
+ # make init && \
+ # make build && \
+ # make start && \
+ # make check || \
+ # (echo "An error occurred, printing logs:" && sudo cat ./_output/logs/* 2>/dev/null)
+
openim-test-build-image:
name: Build OpenIM Docker Image
runs-on: ubuntu-latest
diff --git a/.gitignore b/.gitignore
index 675ce10c7..fb8d428d2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,10 +32,13 @@ _output/
deployments/charts/generated-configs/
### OpenIM Config ###
-config/config.yaml
-./config/config.yaml
.env
-./.env
+config/config.yaml
+config/alertmanager.yml
+config/prometheus.yml
+config/email.tmpl
+config/notification.yaml
+config/instance-down-rules.yml
### OpenIM deploy ###
deployments/openim-server/charts
@@ -388,8 +391,4 @@ Sessionx.vim
# End of https://www.toptal.com/developers/gitignore/api/go,git,vim,tags,test,emacs,backup,jetbrains
.idea
-dist/
-.env
-config/config.yaml
-config/alertmanager.yml
-config/prometheus.yml
\ No newline at end of file
+dist/
\ No newline at end of file
diff --git a/config/Readme.md b/config/Readme.md
new file mode 100644
index 000000000..72f4577a5
--- /dev/null
+++ b/config/Readme.md
@@ -0,0 +1,243 @@
+# OpenIM Configuration Guide
+
+
+* 1. [Directory Structure and File Descriptions](#DirectoryStructureandFileDescriptions)
+ * 1.1. [Directory Structure](#DirectoryStructure)
+ * 1.2. [Directory Structure Explanation](#DirectoryStructureExplanation)
+* 2. [File Descriptions](#FileDescriptions)
+ * 2.1. [Files in the Root Directory](#FilesintheRootDirectory)
+ * 2.2. [Files in the `templates/` Directory](#FilesinthetemplatesDirectory)
+* 3. [Configuration File Generation](#ConfigurationFileGeneration)
+ * 3.1. [How to Use `init-config.sh` Script](#HowtoUseinit-config.shScript)
+ * 3.2. [Examples of Operations](#ExamplesofOperations)
+ * 3.3. [Points to Note](#PointstoNote)
+* 4. [Example Directory](#ExampleDirectory)
+ * 4.1. [Overview](#Overview)
+ * 4.2. [Structure](#Structure)
+ * 4.3. [How to Use These Examples](#HowtoUseTheseExamples)
+ * 4.4. [Tips for Using Example Files:](#TipsforUsingExampleFiles:)
+* 5. [Configuration Item Descriptions](#ConfigurationItemDescriptions)
+* 6. [Version Management and Upgrading](#VersionManagementandUpgrading)
+ * 6.1. [Pulling the Latest Code](#PullingtheLatestCode)
+ * 6.2. [Generating the Latest Example Configuration Files](#GeneratingtheLatestExampleConfigurationFiles)
+ * 6.3. [Comparing Configuration File Differences](#ComparingConfigurationFileDifferences)
+ * 6.4. [Updating Configuration Files](#UpdatingConfigurationFiles)
+ * 6.5. [Updating Binary Files and Restarting Services](#UpdatingBinaryFilesandRestartingServices)
+ * 6.6. [Best Practices for Version Management](#BestPracticesforVersionManagement)
+* 7. [How to Contribute](#HowtoContribute)
+ * 7.1. [OpenIM Configuration Item Descriptions](#OpenIMConfigurationItemDescriptions)
+ * 7.2. [Modifying Template Files](#ModifyingTemplateFiles)
+ * 7.3. [Updating Configuration Center Scripts](#UpdatingConfigurationCenterScripts)
+ * 7.4. [Configuration File Generation Process](#ConfigurationFileGenerationProcess)
+ * 7.5. [Contribution Guidelines](#ContributionGuidelines)
+ * 7.6. [Submission and Review](#SubmissionandReview)
+
+
+
+
+
+## 1. Directory Structure and File Descriptions
+
+This document details the structure of the `config` directory, aiding users in understanding and managing configuration files.
+
+### 1.1. Directory Structure
+
+```bash
+$ tree config
+├── alertmanager.yml
+├── config.yaml
+├── email.tmpl
+├── instance-down-rules.yml
+├── notification.yaml
+├── prometheus.yml
+├── Readme.md
+└── templates
+ ├── alertmanager.yml.template
+ ├── config.yaml.template
+ ├── email.tmpl.template
+ ├── env.template
+ ├── instance-down-rules.yml.template
+ ├── notification.yaml.template
+ ├── open-im-ng-example.conf
+ ├── prometheus-dashboard.yaml
+ └── prometheus.yml.template
+```
+
+### 1.2. Directory Structure Explanation
+
+- **Root Directory (`config/`)**: Contains actual configuration files and the `templates` subdirectory.
+- **`templates/` Subdirectory**: Stores configuration templates for generating or updating configuration files in the root directory.
+
+## 2. File Descriptions
+
+### 2.1. Files in the Root Directory
+
+- **`alertmanager.yml`**: Configuration file for AlertManager, managing and setting up the alert system.
+- **`config.yaml`**: The main application configuration file, covering service settings.
+- **`email.tmpl`**: Template file for email notifications, defining email format and content.
+- **`instance-down-rules.yml`**: Instance downtime rules configuration file for the monitoring system.
+- **`notification.yaml`**: Configuration file for notification settings, defining different types of notifications.
+- **`prometheus.yml`**: Configuration file for the Prometheus monitoring system, setting monitoring metrics and rules.
+
+### 2.2. Files in the `templates/` Directory
+
+- **`alertmanager.yml.template`**: Template for AlertManager configuration.
+- **`config.yaml.template`**: Main configuration template for the application.
+- **`email.tmpl.template`**: Template for email notifications.
+- **`env.template`**: Template for environmental variable configurations, setting environment-related configurations.
+- **`instance-down-rules.yml.template`**: Template for instance downtime rules.
+- **`notification.yaml.template`**: Template for notification settings.
+- **`open-im-ng-example.conf`**: Example configuration file for the application.
+- **`prometheus-dashboard.yaml`**: Prometheus dashboard configuration file, specific to the OpenIM application.
+- **`prometheus.yml.template`**: Template for Prometheus configuration.
+
+## 3. Configuration File Generation
+
+Configuration files can be automatically generated using the `make init` command or the `./scripts/init-config.sh` script. These scripts conveniently extract templates from the `templates` directory and generate or update actual configuration files in the root directory.
+
+### 3.1. How to Use `init-config.sh` Script
+
+```bash
+$ ./scripts/init-config.sh --help
+Usage: init-config.sh [options]
+Options:
+ -h, --help Show this help message
+ --force Overwrite existing files without prompt
+ --skip Skip generation if file exists
+ --examples Generate example files
+ --clean-config Clean all configuration files
+ --clean-examples Clean all example files
+```
+
+### 3.2. Examples of Operations
+
+- Generate all template configuration files:
+
+ ```bash
+ $ ./scripts/init-config.sh --examples
+ ```
+
+- Force overwrite existing configuration files:
+
+ ```bash
+ $ ./scripts/init-config.sh --force
+ ```
+
+### 3.3. Points to Note
+
+- **Template files should not be directly modified**: Files in the `template` directory are templates included in source code management. Direct modification may lead to version conflicts or management issues.
+- **Operations for Windows Users**: Windows users can use the `cp` command to copy files from the `template` directory to the `config/` directory and then modify the configuration items as needed.
+
+## 4. Example Directory
+
+Welcome to our project's `examples` directory! This directory contains a range of example files, showcasing various configurations and settings of our software. These examples are intended to provide you with templates that can serve as a starting point for your own configurations.
+
+### 4.1. Overview
+
+In this directory, you'll find examples suitable for a variety of use cases. Each file is a template with default values and configurations, demonstrating best practices and typical scenarios. Whether you're just getting started or looking to implement complex settings, these examples should help you get on the right track.
+
+### 4.2. Structure
+
+Here's a quick overview of the contents in this directory:
+
+- `env-example.yaml`: Demonstrates how to set up environmental variables.
+- `openim-example.yaml`: Example configuration file for the OpenIM application.
+- `prometheus-example.yml`: Example configuration for monitoring with Prometheus.
+- `alertmanager-example.yml`: Template for setting up Alertmanager configuration.
+
+### 4.3. How to Use These Examples
+
+To use these examples, simply copy the relevant files to your working directory and rename them as needed (for example, removing the `-example` suffix). Then, modify the files according to your needs.
+
+### 4.4. Tips for Using Example Files:
+
+1. **Read Comments**: Each file contains comments explaining the various sections and settings. Make sure to read these comments for a better understanding of how to customize the file.
+2. **Check Required Changes**: Some examples might require mandatory changes before they can be used effectively (such as setting specific environmental variables).
+3. **Version Compatibility**: Ensure that the example files are compatible with the version of the software you are using.
+
+## 5. Configuration Item Descriptions
+
+## 6. Version Management and Upgrading
+
+When managing and upgrading the `config` directory's versions, it is crucial to ensure that the configuration files in both the local `config/` and `config/templates/` directories are kept in sync. This process can ensure that your configuration files are consistent with the latest standard templates, while also maintaining custom settings.
+
+### 6.1. Pulling the Latest Code
+
+First, ensure that your local repository is in sync with the remote repository. This can be achieved by pulling the latest code:
+
+```bash
+$ git pull
+```
+
+### 6.2. Generating the Latest Example Configuration Files
+
+Next, generate the latest example configuration files. This can be done by running the `init-config.sh` script, using the `--examples` option to generate example files, and the `--skip` option to avoid overwriting existing configuration files:
+
+```bash
+$ ./scripts/init-config.sh --examples --skip
+```
+
+### 6.3. Comparing Configuration File Differences
+
+Once the latest example configuration files are generated, you need to compare the configuration files in the `config/` and `config/templates/` directories to find any potential differences. This step ensures that you can identify and integrate any important updates or changes. Tools like `diff` can be helpful in completing this step:
+
+```bash
+$ diff -ur config/ config/templates/
+```
+
+### 6.4. Updating Configuration Files
+
+Based on the comparison results, manually update the configuration files in the `config/` directory to reflect the latest configurations in `config/templates/`. During this process, ensure to retain any custom configuration settings.
+
+### 6.5. Updating Binary Files and Restarting Services
+
+After updating the configuration files, the next step is to update any related binary files. This typically involves downloading and installing the latest version of the application or service. Depending on the specific application or service, this might involve running specific update scripts or directly downloading the latest version from official sources.
+
+Once the binary files are updated, the services need to be restarted to apply the new configurations. Make sure to conduct necessary checks before restarting to ensure the correctness of the configurations.
+
+### 6.6. Best Practices for Version Management
+
+- **Record Changes**: When committing changes to a version control system, ensure to log detailed change logs.
+- **Stay Synced**: Regularly sync with the remote repository to ensure that your local configurations are in line with the latest developments.
+- **Backup**: Backup your current configurations before making any significant changes, so that you can revert to a previous state if necessary.
+
+By following these steps and best practices, you can ensure effective management and smooth upgrading of your `config` directory.
+
+## 7. How to Contribute
+
+If you have an understanding of the logic behind OpenIM's configuration generation, then you will clearly know where to make modifications to contribute code.
+
+### 7.1. OpenIM Configuration Item Descriptions
+
+First, it is recommended to read the [OpenIM Configuration Items Document](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/environment.md). This will help you understand the roles of various configuration items and how they affect the operation of OpenIM.
+
+### 7.2. Modifying Template Files
+
+To contribute to OpenIM, focus on the `./deployments/templates` directory. This contains various configuration template files, which are the basis for generating the final configuration files.
+
+When making modifications, ensure that your changes align with OpenIM's configuration requirements and logic. This may involve adding new template files or modifying existing files to reflect new configuration options or structural changes.
+
+### 7.3. Updating Configuration Center Scripts
+
+In addition to modifying template files, pay attention to the `./scripts/install/environment.sh` script. In this script, you may need to add or modify environment variables.
+
+This script is responsible for defining environment variables that influence configuration generation. Therefore, any new configuration items or modifications to existing items need to be reflected here.
+
+### 7.4. Configuration File Generation Process
+
+The essence of the `make init` command is to use the environment variables defined in `/scripts/install/environment.sh` to render the template files in the `./deployments/templates` directory, thereby generating the final configuration files.
+
+When contributing code, ensure that your changes work smoothly in this process and do not cause errors during configuration file generation.
+
+### 7.5. Contribution Guidelines
+
+- **Code Review**: Ensure your changes have passed code review. This typically means that the code should be clear, easy to understand, and adhere to the project's coding style and best practices.
+- **Testing**: Before submitting changes, conduct thorough tests to ensure new or modified configurations work as expected and do not negatively impact existing functionalities.
+- **Documentation**: If you have added a new configuration option or made significant changes to an existing one, update the relevant documentation to assist other users and developers in understanding and utilizing these changes.
+
+### 7.6. Submission and Review
+
+After completing your changes, submit your code to the OpenIM repository in the form of a Pull Request (PR). The PR will be reviewed by the project maintainers and you may be asked to make further modifications or provide additional information.
\ No newline at end of file
diff --git a/config/templates/alertmanager.yml.template b/config/templates/alertmanager.yml.template
new file mode 100644
index 000000000..a0daadfbd
--- /dev/null
+++ b/config/templates/alertmanager.yml.template
@@ -0,0 +1,47 @@
+# Copyright © 2023 OpenIM. 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.
+
+###################### AlertManager Configuration ######################
+# AlertManager configuration using environment variables
+#
+# Resolve timeout
+# SMTP configuration for sending alerts
+# Templates for email notifications
+# Routing configurations for alerts
+# Receiver configurations
+global:
+ resolve_timeout: 5m
+ smtp_from: alert@openim.io
+ smtp_smarthost: smtp.163.com:465
+ smtp_auth_username: alert@openim.io
+ smtp_auth_password: YOURAUTHPASSWORD
+ smtp_require_tls: false
+ smtp_hello: xxx监控告警
+
+templates:
+ - /etc/alertmanager/email.tmpl
+
+route:
+ group_by: ['alertname']
+ group_wait: 5s
+ group_interval: 5s
+ repeat_interval: 5m
+ receiver: email
+receivers:
+ - name: email
+ email_configs:
+ - to: 'alert@example.com'
+ html: '{{ template "email.to.html" . }}'
+ headers: { Subject: "[OPENIM-SERVER]Alarm" }
+ send_resolved: true
diff --git a/config/templates/config.yaml.template b/config/templates/config.yaml.template
new file mode 100644
index 000000000..fd51a2e31
--- /dev/null
+++ b/config/templates/config.yaml.template
@@ -0,0 +1,513 @@
+# Copyright © 2023 OpenIM. 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.
+
+# -----------------------------------------------------------------
+# TODO: This config file is the template file
+# --| source: deployments/templates/openim.yaml
+# --| env: scripts/install/environment
+# --| target: config/config.yaml
+# -----------------------------------------------------------------
+
+envs:
+ discovery: zookeeper
+
+###################### Zookeeper ######################
+# Zookeeper configuration
+# It's not recommended to modify the schema
+#
+# Zookeeper address
+# Zookeeper username
+# Zookeeper password
+zookeeper:
+ schema: openim
+ address: [ 172.28.0.1:12181 ]
+ username: ''
+ password: ''
+
+###################### Mongo ######################
+# MongoDB configuration
+
+# If uri is not empty, it will be used directly for the MongoDB connection.
+# This is a complete MongoDB URI string.
+# Example: mongodb://user:password@host1:port1,host2:port2/dbname?options
+mongo:
+ uri: ''
+
+# List of MongoDB server addresses.
+# Used for constructing the MongoDB URI if 'uri' above is empty.
+# For a standalone setup, specify the address of the single server.
+# For a sharded cluster, specify the addresses of the Mongos servers.
+# Example: [ '172.28.0.1:37017', '172.28.0.2:37017' ]
+# Default MongoDB database name
+# Maximum connection pool size
+ address: [ 172.28.0.1:37017 ]
+ database: openIM_v3
+ username: root
+ password: openIM123
+ maxPoolSize: 100
+
+###################### Redis configuration information ######################
+# Redis configuration
+#
+# Username is required only for Redis version 6.0+
+redis:
+ address: [ 172.28.0.1:16379 ]
+ username: ''
+ password: openIM123
+
+###################### Kafka configuration information ######################
+# Kafka configuration
+#
+# Kafka username
+# Kafka password
+# It's not recommended to modify this topic name
+# Consumer group ID, it's not recommended to modify
+kafka:
+ username: ''
+ password: ''
+ addr: [ 172.28.0.1:19094 ]
+ latestMsgToRedis:
+ topic: "latestMsgToRedis"
+ offlineMsgToMongo:
+ topic: "offlineMsgToMongoMysql"
+ msgToPush:
+ topic: "msgToPush"
+ consumerGroupID:
+ msgToRedis: redis
+ msgToMongo: mongo
+ msgToMySql: mysql
+ msgToPush: push
+
+###################### RPC configuration information ######################
+# RPC configuration
+#
+# IP address to register with zookeeper when starting RPC, the IP and corresponding rpcPort should be accessible by api/gateway
+# Default listen IP is 0.0.0.0
+rpc:
+ registerIP: ''
+ listenIP: 0.0.0.0
+
+###################### API configuration information ######################
+# API configuration
+#
+# API service port
+# Default listen IP is 0.0.0.0
+api:
+ openImApiPort: [ 10002 ]
+ listenIP: 0.0.0.0
+
+###################### Object configuration information ######################
+# Object storage configuration
+#
+# Use minio for object storage
+# API URL should be accessible by the app
+# It's not recommended to modify the bucket name
+# Endpoint should be accessible by the app
+# Session token
+# Configuration for Tencent COS
+# Configuration for Aliyun OSS
+# apiURL is the address of the api, the access address of the app, use s3 must be configured
+# minio.endpoint can be configured as an intranet address,
+# minio.signEndpoint is minio public network address
+object:
+ enable: "minio"
+ apiURL: "http://14.155.64.202:10002"
+ minio:
+ bucket: "openim"
+ endpoint: "http://172.28.0.1:10005"
+ accessKeyID: "root"
+ secretAccessKey: "openIM123"
+ sessionToken: ''
+ signEndpoint: "http://14.155.64.202:10005"
+ publicRead: false
+ cos:
+ bucketURL: https://temp-1252357374.cos.ap-chengdu.myqcloud.com
+ secretID: ''
+ secretKey: ''
+ sessionToken: ''
+ publicRead: false
+ oss:
+ endpoint: "https://oss-cn-chengdu.aliyuncs.com"
+ bucket: "demo-9999999"
+ bucketURL: "https://demo-9999999.oss-cn-chengdu.aliyuncs.com"
+ accessKeyID: ''
+ accessKeySecret: ''
+ sessionToken: ''
+ publicRead: false
+ kodo:
+ endpoint: "http://s3.cn-east-1.qiniucs.com"
+ bucket: "demo-9999999"
+ bucketURL: "http://your.domain.com"
+ accessKeyID: ''
+ accessKeySecret: ''
+ sessionToken: ''
+ publicRead: false
+
+###################### RPC Port Configuration ######################
+# RPC service ports
+# These ports are passed into the program by the script and are not recommended to modify
+# For launching multiple programs, just fill in multiple ports separated by commas
+# For example, [10110, 10111]
+rpcPort:
+ openImUserPort: [ 10110 ]
+ openImFriendPort: [ 10120 ]
+ openImMessagePort: [ 10130 ]
+ openImGroupPort: [ 10150 ]
+ openImAuthPort: [ 10160 ]
+ openImPushPort: [ 10170 ]
+ openImConversationPort: [ 10180 ]
+ openImThirdPort: [ 10190 ]
+
+###################### RPC Register Name Configuration ######################
+# RPC service names for registration, it's not recommended to modify these
+rpcRegisterName:
+ openImUserName: User
+ openImFriendName: Friend
+ openImMsgName: Msg
+ openImPushName: Push
+ openImMessageGatewayName: MessageGateway
+ openImGroupName: Group
+ openImAuthName: Auth
+ openImConversationName: Conversation
+ openImThirdName: Third
+
+###################### Log Configuration ######################
+# Log configuration
+#
+# Storage directory
+# Log rotation time
+# Maximum number of logs to retain
+# Log level, 6 means all levels
+# Whether to output to stdout
+# Whether to output in json format
+# Whether to include stack trace in logs
+log:
+ storageLocation: /data/workspaces/open-im-server/logs/
+ rotationTime: 24
+ remainRotationCount: 2
+ remainLogLevel: 6
+ isStdout: false
+ isJson: false
+ withStack: false
+
+###################### Variables definition ######################
+# Long connection server configuration
+#
+# Websocket port for msg_gateway
+# Maximum number of websocket connections
+# Maximum length of websocket request package
+# Websocket connection handshake timeout
+longConnSvr:
+ openImWsPort: [ 10001 ]
+ websocketMaxConnNum: 100000
+ openImMessageGatewayPort: [ 10140 ]
+ websocketMaxMsgLen: 4096
+ websocketTimeout: 10
+
+# Push notification service configuration
+#
+# Use GeTui for push notifications
+# GeTui offline push configuration
+# FCM offline push configuration
+# Account file, place it in the config directory
+# JPush configuration, modify these after applying in JPush backend
+push:
+ enable: getui
+ geTui:
+ pushUrl: "https://restapi.getui.com/v2/$appId"
+ masterSecret: ''
+ appKey: ''
+ intent: ''
+ channelID: ''
+ channelName: ''
+ fcm:
+ serviceAccount: "x.json"
+ jpns:
+ appKey: ''
+ masterSecret: ''
+ pushUrl: ''
+ pushIntent: ''
+
+# App manager configuration
+#
+# Built-in app manager user IDs
+# Built-in app manager nicknames
+manager:
+ userID: [ "openIM123456", "openIM654321", "openIMAdmin" ]
+ nickname: [ "system1", "system2", "system3" ]
+
+# Multi-platform login policy
+# For each platform(Android, iOS, Windows, Mac, web), only one can be online at a time
+multiLoginPolicy: 1
+
+# Whether to store messages in MySQL, messages in MySQL are only used for management background
+chatPersistenceMysql: true
+
+# Message cache timeout in seconds, it's not recommended to modify
+msgCacheTimeout: 86400
+
+# Whether to enable read receipts for group chat
+groupMessageHasReadReceiptEnable: true
+
+# Whether to enable read receipts for single chat
+singleMessageHasReadReceiptEnable: true
+
+# MongoDB offline message retention period in days
+retainChatRecords: 365
+
+# Schedule to clear expired messages(older than retainChatRecords days) in MongoDB every Wednesday at 2am
+# This deletion is just for cleaning up disk usage according to previous configuration retainChatRecords, no notification will be sent
+chatRecordsClearTime: "0 2 * * 3"
+
+# Schedule to auto delete messages every day at 2am
+# This deletion is for messages that have been retained for more than msg_destruct_time (seconds) in the conversation field
+msgDestructTime: "0 2 * * *"
+
+# Secret key
+secret: openIM123
+
+# Token policy
+#
+# Token expiration period in days
+tokenPolicy:
+ expire: 90
+
+# Message verification policy
+#
+# Whether to verify friendship when sending messages
+messageVerify:
+ friendVerify: false
+
+# iOS push notification configuration
+#
+# iOS push notification sound
+# Whether to count badge
+# Whether it's production environment
+iosPush:
+ pushSound: "xxx"
+ badgeCount: true
+ production: false
+
+###################### Third-party service configuration ######################
+# Callback configuration
+#
+# Callback URL
+# Whether to enable this callback event
+# Timeout in seconds
+# Whether to continue execution if callback fails
+callback:
+ url: ""
+ beforeSendSingleMsg:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterSendSingleMsg:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeSendGroupMsg:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterSendGroupMsg:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ msgModify:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ userOnline:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ userOffline:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ userKickOff:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ offlinePush:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ onlinePush:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ superGroupOnlinePush:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeAddFriend:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeUpdateUserInfo:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeCreateGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterCreateGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeMemberJoinGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeSetGroupMemberInfo:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterSetGroupMemberInfo:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ setMessageReactionExtensions:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ quitGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ killGroupMember:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ dismissGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ joinGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ groupMsgRead:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ singleMsgRead:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ updateUserInfo:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeUserRegister:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterUserRegister:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ transferGroupOwner:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeSetFriendRemark:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterSetFriendRemark:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterGroupMsgRead:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterGroupMsgRevoke:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ afterJoinGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ beforeInviteUserToGroup:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ joinGroupAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ setGroupInfoAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ setGroupInfoBefore:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ revokeMsgAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ addBlackBefore:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ addFriendAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ addFriendAgreeBefore:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ deleteFriendAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ importFriendsBefore:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ importFriendsAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+ removeBlackAfter:
+ enable: false
+ timeout: 5
+ failedContinue: true
+###################### Prometheus ######################
+# Prometheus configuration for various services
+# The number of Prometheus ports per service needs to correspond to rpcPort
+# The number of ports needs to be consistent with msg_transfer_service_num in script/path_info.sh
+prometheus:
+ enable: false
+ prometheusUrl: 172.28.0.1:13000
+ apiPrometheusPort: [20100]
+ userPrometheusPort: [ 20110 ]
+ friendPrometheusPort: [ 20120 ]
+ messagePrometheusPort: [ 20130 ]
+ messageGatewayPrometheusPort: [ 20140 ]
+ groupPrometheusPort: [ 20150 ]
+ authPrometheusPort: [ 20160 ]
+ pushPrometheusPort: [ 20170 ]
+ conversationPrometheusPort: [ 20230 ]
+ rtcPrometheusPort: [ 21300 ]
+ thirdPrometheusPort: [ 21301 ]
+ messageTransferPrometheusPort: [ 21400, 21401, 21402, 21403 ] # List of ports
diff --git a/config/email.tmpl b/config/templates/email.tmpl.template
similarity index 100%
rename from config/email.tmpl
rename to config/templates/email.tmpl.template
diff --git a/config/templates/env.template b/config/templates/env.template
new file mode 100644
index 000000000..ffcec89e5
--- /dev/null
+++ b/config/templates/env.template
@@ -0,0 +1,260 @@
+# Copyright © 2023 OpenIM. 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.
+
+# ======================================
+# ========= Basic Configuration ========
+# ======================================
+
+# The user for authentication or system operations.
+# Default: OPENIM_USER=root
+USER=root
+
+# Password associated with the specified user for authentication.
+# Default: PASSWORD=openIM123
+PASSWORD=openIM123
+
+# Base URL for the application programming interface (API).
+# Default: API_URL=http://172.28.0.1:10002
+API_URL=http://14.155.64.202:10002
+
+# Directory path for storing data files or related information.
+# Default: DATA_DIR=./
+DATA_DIR=/data/workspaces/open-im-server
+
+# Choose the appropriate image address, the default is GITHUB image,
+# you can choose docker hub, for Chinese users can choose Ali Cloud
+# export IMAGE_REGISTRY="ghcr.io/openimsdk"
+# export IMAGE_REGISTRY="openim"
+# export IMAGE_REGISTRY="registry.cn-hangzhou.aliyuncs.com/openimsdk"
+IMAGE_REGISTRY=ghcr.io/openimsdk
+
+# ======================================
+# ========= Network Configuration ======
+# ======================================
+
+# Subnet for the Docker network.
+# Default: DOCKER_BRIDGE_SUBNET=172.28.0.0/16
+DOCKER_BRIDGE_SUBNET=172.28.0.0/16
+
+# Gateway for the Docker network.
+# Default: DOCKER_BRIDGE_GATEWAY=172.28.0.1
+DOCKER_BRIDGE_GATEWAY=172.28.0.1
+
+MONGO_NETWORK_ADDRESS=172.28.0.2
+REDIS_NETWORK_ADDRESS=172.28.0.3
+KAFKA_NETWORK_ADDRESS=172.28.0.4
+ZOOKEEPER_NETWORK_ADDRESS=172.28.0.5
+MINIO_NETWORK_ADDRESS=172.28.0.6
+OPENIM_WEB_NETWORK_ADDRESS=172.28.0.7
+OPENIM_SERVER_NETWORK_ADDRESS=172.28.0.8
+OPENIM_CHAT_NETWORK_ADDRESS=172.28.0.9
+PROMETHEUS_NETWORK_ADDRESS=172.28.0.10
+GRAFANA_NETWORK_ADDRESS=172.28.0.11
+NODE_EXPORTER_NETWORK_ADDRESS=172.28.0.12
+OPENIM_ADMIN_FRONT_NETWORK_ADDRESS=172.28.0.13
+ALERT_MANAGER_NETWORK_ADDRESS=172.28.0.14
+
+# ===============================================
+# = Component Extension Configuration =
+# ===============================================
+
+# ============ Component Extension Configuration ==========
+# ----- ZooKeeper Configuration -----
+# Address or hostname for the ZooKeeper service.
+# Default: ZOOKEEPER_ADDRESS=172.28.0.1
+ZOOKEEPER_ADDRESS=172.28.0.5
+
+# Port for ZooKeeper service.
+# Default: ZOOKEEPER_PORT=12181
+ZOOKEEPER_PORT=12181
+
+# ----- MongoDB Configuration -----
+# Address or hostname for the MongoDB service.
+# Default: MONGO_ADDRESS=172.28.0.1
+MONGO_ADDRESS=172.28.0.2
+
+# Port on which MongoDB service is running.
+# Default: MONGO_PORT=37017
+# MONGO_PORT=37017
+
+# Username to authenticate with the MongoDB service.
+# Default: MONGO_USERNAME=root
+# MONGO_USERNAME=root
+
+# Password to authenticate with the MongoDB service.
+# Default: MONGO_PASSWORD=openIM123
+MONGO_PASSWORD=openIM123
+
+# Name of the database in MongoDB to be used.
+# Default: MONGO_DATABASE=openIM_v3
+MONGO_DATABASE=openIM_v3
+
+# ----- Redis Configuration -----
+# Address or hostname for the Redis service.
+# Default: REDIS_ADDRESS=172.28.0.1
+REDIS_ADDRESS=172.28.0.3
+
+# Port on which Redis in-memory data structure store is running.
+# Default: REDIS_PORT=16379
+REDIS_PORT=16379
+
+# Password to authenticate with the Redis service.
+# Default: REDIS_PASSWORD=openIM123
+REDIS_PASSWORD=openIM123
+
+# ----- Kafka Configuration -----
+# Address or hostname for the Kafka service.
+# Default: KAFKA_ADDRESS=172.28.0.1
+KAFKA_ADDRESS=172.28.0.4
+
+# Kakfa username to authenticate with the Kafka service.
+# KAFKA_USERNAME=''
+
+# Port on which Kafka distributed streaming platform is running.
+# Default: KAFKA_PORT=19092
+KAFKA_PORT=19094
+
+# Topic in Kafka for storing the latest messages in Redis.
+# Default: KAFKA_LATESTMSG_REDIS_TOPIC=latestMsgToRedis
+KAFKA_LATESTMSG_REDIS_TOPIC=latestMsgToRedis
+
+# Topic in Kafka for pushing messages (e.g. notifications or updates).
+# Default: KAFKA_MSG_PUSH_TOPIC=msgToPush
+KAFKA_MSG_PUSH_TOPIC=msgToPush
+
+# Topic in Kafka for storing offline messages in MongoDB.
+# Default: KAFKA_OFFLINEMSG_MONGO_TOPIC=offlineMsgToMongoMysql
+KAFKA_OFFLINEMSG_MONGO_TOPIC=offlineMsgToMongoMysql
+
+# ----- MinIO Configuration ----
+# Address or hostname for the MinIO object storage service.
+# Default: MINIO_ADDRESS=172.28.0.1
+MINIO_ADDRESS=172.28.0.6
+
+# Port on which MinIO object storage service is running.
+# Default: MINIO_PORT=10005
+MINIO_PORT=10005
+
+# Access key to authenticate with the MinIO service.
+# Default: MINIO_ACCESS_KEY=root
+# MINIO_ACCESS_KEY=root
+
+# Secret key corresponding to the access key for MinIO authentication.
+# Default: MINIO_SECRET_KEY=openIM123
+MINIO_SECRET_KEY=openIM123
+
+# ----- Prometheus Configuration -----
+# Address or hostname for the Prometheus service.
+# Default: PROMETHEUS_ADDRESS=172.28.0.1
+PROMETHEUS_ADDRESS=172.28.0.10
+
+# Port on which Prometheus service is running.
+# Default: PROMETHEUS_PORT=19090
+PROMETHEUS_PORT=19090
+
+# ----- Grafana Configuration -----
+# Address or hostname for the Grafana service.
+# Default: GRAFANA_ADDRESS=172.28.0.1
+GRAFANA_ADDRESS=172.28.0.11
+
+# Port on which Grafana service is running.
+# Default: GRAFANA_PORT=13000
+GRAFANA_PORT=13000
+
+# ======================================
+# ============ OpenIM Web ===============
+# ======================================
+
+# Path to the OpenIM web distribution.
+# Default: OPENIM_WEB_DIST_PATH=/app/dist
+OPENIM_WEB_DIST_PATH=/app/dist
+
+# Port on which OpenIM web service is running.
+# Default: OPENIM_WEB_PORT=11001
+OPENIM_WEB_PORT=11001
+
+# Address or hostname for the OpenIM web service.
+# Default: OPENIM_WEB_ADDRESS=172.28.0.1
+OPENIM_WEB_ADDRESS=172.28.0.7
+
+# ======================================
+# ========= OpenIM Server ==============
+# ======================================
+
+# Address or hostname for the OpenIM server.
+# Default: OPENIM_SERVER_ADDRESS=172.28.0.1
+OPENIM_SERVER_ADDRESS=172.28.0.8
+
+# Port for the OpenIM WebSockets.
+# Default: OPENIM_WS_PORT=10001
+OPENIM_WS_PORT=10001
+
+# Port for the OpenIM API.
+# Default: API_OPENIM_PORT=10002
+API_OPENIM_PORT=10002
+
+
+# ======================================
+# ========== OpenIM Chat ===============
+# ======================================
+
+# Branch name for OpenIM chat.
+# Default: CHAT_IMAGE_VERSION=main
+# https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md
+CHAT_IMAGE_VERSION=main
+
+# Address or hostname for the OpenIM chat service.
+# Default: OPENIM_CHAT_ADDRESS=172.28.0.1
+OPENIM_CHAT_ADDRESS=172.28.0.9
+
+# Port for the OpenIM chat API.
+# Default: OPENIM_CHAT_API_PORT=10008
+OPENIM_CHAT_API_PORT=10008
+
+# Directory path for storing data files or related information for OpenIM chat.
+# Default: OPENIM_CHAT_DATA_DIR=./openim-chat/main
+OPENIM_CHAT_DATA_DIR=./openim-chat/main
+
+
+# ======================================
+# ========== OpenIM Admin ==============
+# ======================================
+
+# Branch name for OpenIM server.
+# Default: SERVER_IMAGE_VERSION=main
+SERVER_IMAGE_VERSION=main
+
+# Port for the OpenIM admin API.
+# Default: OPENIM_ADMIN_API_PORT=10009
+OPENIM_ADMIN_API_PORT=10009
+
+# Port for the node exporter.
+# Default: NODE_EXPORTER_PORT=19100
+NODE_EXPORTER_PORT=19100
+
+# Port for the prometheus.
+# Default: PROMETHEUS_PORT=19090
+PROMETHEUS_PORT=19090
+
+# Port for the grafana.
+# Default: GRAFANA_PORT=13000
+GRAFANA_PORT=13000
+
+# Port for the admin front.
+# Default: OPENIM_ADMIN_FRONT_PORT=11002
+OPENIM_ADMIN_FRONT_PORT=11002
+
+# Port for the alertmanager.
+# Default: ALERT_MANAGER_PORT=19093
+ALERT_MANAGER_PORT=19093
diff --git a/config/templates/instance-down-rules.yml.template b/config/templates/instance-down-rules.yml.template
new file mode 100644
index 000000000..7a6e9fda9
--- /dev/null
+++ b/config/templates/instance-down-rules.yml.template
@@ -0,0 +1,36 @@
+# Copyright © 2023 OpenIM. 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.
+
+groups:
+ - name: instance_down
+ rules:
+ - alert: InstanceDown
+ expr: up == 0
+ for: 1m
+ labels:
+ severity: critical
+ annotations:
+ summary: "Instance {{ $labels.instance }} down"
+ description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
+
+ - name: database_insert_failure_alerts
+ rules:
+ - alert: DatabaseInsertFailed
+ expr: (increase(msg_insert_redis_failed_total[5m]) > 0) or (increase(msg_insert_mongo_failed_total[5m]) > 0)
+ for: 1m
+ labels:
+ severity: critical
+ annotations:
+ summary: "Increase in MsgInsertRedisFailedCounter or MsgInsertMongoFailedCounter detected"
+ description: "Either MsgInsertRedisFailedCounter or MsgInsertMongoFailedCounter has increased in the last 5 minutes, indicating failures in message insert operations to Redis or MongoDB,maybe the redis or mongodb is crash."
diff --git a/config/templates/notification.yaml.template b/config/templates/notification.yaml.template
new file mode 100644
index 000000000..665c21261
--- /dev/null
+++ b/config/templates/notification.yaml.template
@@ -0,0 +1,354 @@
+# Copyright © 2023 OpenIM. 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.
+
+# Determines if a message should be sent. If set to false, it triggers a silent sync without a message. If true, it requires triggering a conversation.
+# For rpc notification, send twice: once as a message and once as a notification.
+# The options field 'isNotification' indicates if it's a notification.
+groupCreated:
+ isSendMsg: true
+
+# Reliability level of the message sending.
+# Set to 1 to send only when online, 2 for guaranteed delivery.
+ reliabilityLevel: 1
+
+# This setting is effective only when 'isSendMsg' is true.
+# It controls whether to count unread messages.
+ unreadCount: false
+
+# Configuration for offline push notifications.
+ offlinePush:
+ # Enables or disables offline push notifications.
+ enable: false
+
+ # Title for the notification when a group is created.
+ title: "create group title"
+
+ # Description for the notification.
+ desc: "create group desc"
+
+ # Additional information for the notification.
+ ext: "create group ext"
+
+# Content type is not added here.
+# Content should use a JSON structure conforming to the protobuf format.
+
+groupInfoSet:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupInfoSet title"
+ desc: "groupInfoSet desc"
+ ext: "groupInfoSet ext"
+
+
+joinGroupApplication:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "joinGroupApplication title"
+ desc: "joinGroupApplication desc"
+ ext: "joinGroupApplication ext"
+
+memberQuit:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "memberQuit title"
+ desc: "memberQuit desc"
+ ext: "memberQuit ext"
+
+groupApplicationAccepted:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupApplicationAccepted title"
+ desc: "groupApplicationAccepted desc"
+ ext: "groupApplicationAccepted ext"
+
+groupApplicationRejected:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: " title"
+ desc: " desc"
+ ext: " ext"
+
+
+groupOwnerTransferred:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupOwnerTransferred title"
+ desc: "groupOwnerTransferred desc"
+ ext: "groupOwnerTransferred ext"
+
+memberKicked:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "memberKicked title"
+ desc: "memberKicked desc"
+ ext: "memberKicked ext"
+
+memberInvited:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "memberInvited title"
+ desc: "memberInvited desc"
+ ext: "memberInvited ext"
+
+memberEnter:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "memberEnter title"
+ desc: "memberEnter desc"
+ ext: "memberEnter ext"
+
+groupDismissed:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupDismissed title"
+ desc: "groupDismissed desc"
+ ext: "groupDismissed ext"
+
+groupMuted:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupMuted title"
+ desc: "groupMuted desc"
+ ext: "groupMuted ext"
+
+groupCancelMuted:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupCancelMuted title"
+ desc: "groupCancelMuted desc"
+ ext: "groupCancelMuted ext"
+ defaultTips:
+ tips: "group Cancel Muted"
+
+
+groupMemberMuted:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupMemberMuted title"
+ desc: "groupMemberMuted desc"
+ ext: "groupMemberMuted ext"
+
+groupMemberCancelMuted:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupMemberCancelMuted title"
+ desc: "groupMemberCancelMuted desc"
+ ext: "groupMemberCancelMuted ext"
+
+groupMemberInfoSet:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupMemberInfoSet title"
+ desc: "groupMemberInfoSet desc"
+ ext: "groupMemberInfoSet ext"
+
+groupInfoSetAnnouncement:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupInfoSetAnnouncement title"
+ desc: "groupInfoSetAnnouncement desc"
+ ext: "groupInfoSetAnnouncement ext"
+
+
+groupInfoSetName:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "groupInfoSetName title"
+ desc: "groupInfoSetName desc"
+ ext: "groupInfoSetName ext"
+
+
+#############################friend#################################
+friendApplicationAdded:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "Somebody applies to add you as a friend"
+ desc: "Somebody applies to add you as a friend"
+ ext: "Somebody applies to add you as a friend"
+
+friendApplicationApproved:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "Someone applies to add your friend application"
+ desc: "Someone applies to add your friend application"
+ ext: "Someone applies to add your friend application"
+
+friendApplicationRejected:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "Someone rejected your friend application"
+ desc: "Someone rejected your friend application"
+ ext: "Someone rejected your friend application"
+
+friendAdded:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "We have become friends"
+ desc: "We have become friends"
+ ext: "We have become friends"
+
+friendDeleted:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "deleted a friend"
+ desc: "deleted a friend"
+ ext: "deleted a friend"
+
+friendRemarkSet:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "Your friend's profile has been changed"
+ desc: "Your friend's profile has been changed"
+ ext: "Your friend's profile has been changed"
+
+blackAdded:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "blocked a user"
+ desc: "blocked a user"
+ ext: "blocked a user"
+
+blackDeleted:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "Remove a blocked user"
+ desc: "Remove a blocked user"
+ ext: "Remove a blocked user"
+
+friendInfoUpdated:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "friend info updated"
+ desc: "friend info updated"
+ ext: "friend info updated"
+
+#####################user#########################
+userInfoUpdated:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "Remove a blocked user"
+ desc: "Remove a blocked user"
+ ext: "Remove a blocked user"
+
+userStatusChanged:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: false
+ title: "user status changed"
+ desc: "user status changed"
+ ext: "user status changed"
+
+#####################conversation#########################
+conversationChanged:
+ isSendMsg: false
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "conversation changed"
+ desc: "conversation changed"
+ ext: "conversation changed"
+
+conversationSetPrivate:
+ isSendMsg: true
+ reliabilityLevel: 1
+ unreadCount: false
+ offlinePush:
+ enable: true
+ title: "burn after reading"
+ desc: "burn after reading"
+ ext: "burn after reading"
diff --git a/config/open-im-ng-example.conf b/config/templates/open-im-ng-example.conf
similarity index 100%
rename from config/open-im-ng-example.conf
rename to config/templates/open-im-ng-example.conf
diff --git a/config/prometheus-dashboard.yaml b/config/templates/prometheus-dashboard.yaml
similarity index 98%
rename from config/prometheus-dashboard.yaml
rename to config/templates/prometheus-dashboard.yaml
index 0e7823797..e1b569df3 100644
--- a/config/prometheus-dashboard.yaml
+++ b/config/templates/prometheus-dashboard.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{
"annotations": {
"list": [
diff --git a/config/templates/prometheus.yml.template b/config/templates/prometheus.yml.template
new file mode 100644
index 000000000..709fe9754
--- /dev/null
+++ b/config/templates/prometheus.yml.template
@@ -0,0 +1,99 @@
+# Copyright © 2023 OpenIM. 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.
+
+# my global config
+global:
+ scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
+ evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
+ # scrape_timeout is set to the global default (10s).
+
+# Alertmanager configuration
+alerting:
+ alertmanagers:
+ - static_configs:
+ - targets: ['172.28.0.1:19093']
+
+# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
+rule_files:
+ - "instance-down-rules.yml"
+# - "first_rules.yml"
+# - "second_rules.yml"
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+ # The job name is added as a label "job='job_name'"" to any timeseries scraped from this config.
+ # Monitored information captured by prometheus
+ - job_name: 'node-exporter'
+ static_configs:
+ - targets: [ '172.28.0.1:19100' ]
+ labels:
+ namespace: 'default'
+
+ # prometheus fetches application services
+ - job_name: 'openimserver-openim-api'
+ static_configs:
+ - targets: [ '172.28.0.1:20100' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-msggateway'
+ static_configs:
+ - targets: [ '172.28.0.1:20140' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-msgtransfer'
+ static_configs:
+ - targets: [ 172.28.0.1:21400, 172.28.0.1:21401, 172.28.0.1:21402, 172.28.0.1:21403 ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-push'
+ static_configs:
+ - targets: [ '172.28.0.1:20170' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-auth'
+ static_configs:
+ - targets: [ '172.28.0.1:20160' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-conversation'
+ static_configs:
+ - targets: [ '172.28.0.1:20230' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-friend'
+ static_configs:
+ - targets: [ '172.28.0.1:20120' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-group'
+ static_configs:
+ - targets: [ '172.28.0.1:20150' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-msg'
+ static_configs:
+ - targets: [ '172.28.0.1:20130' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-third'
+ static_configs:
+ - targets: [ '172.28.0.1:21301' ]
+ labels:
+ namespace: 'default'
+ - job_name: 'openimserver-openim-rpc-user'
+ static_configs:
+ - targets: [ '172.28.0.1:20110' ]
+ labels:
+ namespace: 'default'
diff --git a/deployments/README.md b/deployments/Readme.md
similarity index 100%
rename from deployments/README.md
rename to deployments/Readme.md
diff --git a/deployments/charts/helmfile.yaml b/deployments/charts/helmfile.yaml
index a6a009257..eb064be9a 100644
--- a/deployments/charts/helmfile.yaml
+++ b/deployments/charts/helmfile.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- define "defaultValues" -}}
- ./generated-configs/helm-image.yaml
- ./generated-configs/config.yaml
diff --git a/deployments/charts/openim-api/Chart.yaml b/deployments/charts/openim-api/Chart.yaml
index 74779b64a..e79d2a2c2 100644
--- a/deployments/charts/openim-api/Chart.yaml
+++ b/deployments/charts/openim-api/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-api
description: A OpenIM Api Helm chart for Kubernetes
diff --git a/deployments/charts/openim-api/templates/app-cm.yaml b/deployments/charts/openim-api/templates/app-cm.yaml
index 7a6f23314..9d4e96e8b 100644
--- a/deployments/charts/openim-api/templates/app-cm.yaml
+++ b/deployments/charts/openim-api/templates/app-cm.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: ConfigMap
metadata:
diff --git a/deployments/charts/openim-api/templates/deployment.yaml b/deployments/charts/openim-api/templates/deployment.yaml
index 27bfa1f13..3b4bf57a2 100644
--- a/deployments/charts/openim-api/templates/deployment.yaml
+++ b/deployments/charts/openim-api/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-api/templates/hpa.yaml b/deployments/charts/openim-api/templates/hpa.yaml
index 0e5848181..dc0742a25 100644
--- a/deployments/charts/openim-api/templates/hpa.yaml
+++ b/deployments/charts/openim-api/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-api/templates/ingress.yaml b/deployments/charts/openim-api/templates/ingress.yaml
index 62c66c135..55bc69710 100644
--- a/deployments/charts/openim-api/templates/ingress.yaml
+++ b/deployments/charts/openim-api/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-api.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-api/templates/service.yaml b/deployments/charts/openim-api/templates/service.yaml
index eb37fa56c..3704bf35c 100644
--- a/deployments/charts/openim-api/templates/service.yaml
+++ b/deployments/charts/openim-api/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-api/templates/serviceaccount.yaml b/deployments/charts/openim-api/templates/serviceaccount.yaml
index e3e7b2849..556a71e34 100644
--- a/deployments/charts/openim-api/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-api/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-api/values.yaml b/deployments/charts/openim-api/values.yaml
index e41fb6e76..4208335de 100644
--- a/deployments/charts/openim-api/values.yaml
+++ b/deployments/charts/openim-api/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-api.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-msggateway/Chart.yaml b/deployments/charts/openim-msggateway/Chart.yaml
index c8c380bf9..fb6d0d153 100644
--- a/deployments/charts/openim-msggateway/Chart.yaml
+++ b/deployments/charts/openim-msggateway/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-msggateway
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-msggateway/templates/hpa.yaml b/deployments/charts/openim-msggateway/templates/hpa.yaml
index e1fbe50a6..99121afba 100644
--- a/deployments/charts/openim-msggateway/templates/hpa.yaml
+++ b/deployments/charts/openim-msggateway/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-msggateway/templates/ingress.yaml b/deployments/charts/openim-msggateway/templates/ingress.yaml
index 5c1c24078..0e22e1936 100644
--- a/deployments/charts/openim-msggateway/templates/ingress.yaml
+++ b/deployments/charts/openim-msggateway/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-msggateway.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-msggateway/templates/service.yaml b/deployments/charts/openim-msggateway/templates/service.yaml
index 2ed58a869..e33fce6db 100644
--- a/deployments/charts/openim-msggateway/templates/service.yaml
+++ b/deployments/charts/openim-msggateway/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-msggateway/templates/serviceaccount.yaml b/deployments/charts/openim-msggateway/templates/serviceaccount.yaml
index 6b47c12c5..718880d71 100644
--- a/deployments/charts/openim-msggateway/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-msggateway/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-msggateway/values.yaml b/deployments/charts/openim-msggateway/values.yaml
index d82c674fc..059601807 100644
--- a/deployments/charts/openim-msggateway/values.yaml
+++ b/deployments/charts/openim-msggateway/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-msggateway.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-msgtransfer/Chart.yaml b/deployments/charts/openim-msgtransfer/Chart.yaml
index bba7a047f..37d897728 100644
--- a/deployments/charts/openim-msgtransfer/Chart.yaml
+++ b/deployments/charts/openim-msgtransfer/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-msgtransfer
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-msgtransfer/templates/deployment.yaml b/deployments/charts/openim-msgtransfer/templates/deployment.yaml
index adb8ae737..2c9e24bdd 100644
--- a/deployments/charts/openim-msgtransfer/templates/deployment.yaml
+++ b/deployments/charts/openim-msgtransfer/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-msgtransfer/templates/hpa.yaml b/deployments/charts/openim-msgtransfer/templates/hpa.yaml
index 75c7d4fef..89921bf30 100644
--- a/deployments/charts/openim-msgtransfer/templates/hpa.yaml
+++ b/deployments/charts/openim-msgtransfer/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-msgtransfer/templates/ingress.yaml b/deployments/charts/openim-msgtransfer/templates/ingress.yaml
index c9968a438..ab28a9e71 100644
--- a/deployments/charts/openim-msgtransfer/templates/ingress.yaml
+++ b/deployments/charts/openim-msgtransfer/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-msgtransfer.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-msgtransfer/templates/service.yaml b/deployments/charts/openim-msgtransfer/templates/service.yaml
index 839e520e5..e657f8c18 100644
--- a/deployments/charts/openim-msgtransfer/templates/service.yaml
+++ b/deployments/charts/openim-msgtransfer/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-msgtransfer/templates/serviceaccount.yaml b/deployments/charts/openim-msgtransfer/templates/serviceaccount.yaml
index 2e3ca4ee7..78816bd80 100644
--- a/deployments/charts/openim-msgtransfer/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-msgtransfer/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-msgtransfer/values.yaml b/deployments/charts/openim-msgtransfer/values.yaml
index d4a792d17..6e26d72c8 100644
--- a/deployments/charts/openim-msgtransfer/values.yaml
+++ b/deployments/charts/openim-msgtransfer/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-msgtransfer.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-push/Chart.yaml b/deployments/charts/openim-push/Chart.yaml
index 93e134879..966769b00 100644
--- a/deployments/charts/openim-push/Chart.yaml
+++ b/deployments/charts/openim-push/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-push
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-push/templates/deployment.yaml b/deployments/charts/openim-push/templates/deployment.yaml
index 684e76e02..34de33e10 100644
--- a/deployments/charts/openim-push/templates/deployment.yaml
+++ b/deployments/charts/openim-push/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-push/templates/hpa.yaml b/deployments/charts/openim-push/templates/hpa.yaml
index 89c89c041..40c77b048 100644
--- a/deployments/charts/openim-push/templates/hpa.yaml
+++ b/deployments/charts/openim-push/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-push/templates/ingress.yaml b/deployments/charts/openim-push/templates/ingress.yaml
index b00fda3d3..6638f256d 100644
--- a/deployments/charts/openim-push/templates/ingress.yaml
+++ b/deployments/charts/openim-push/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-push.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-push/templates/service.yaml b/deployments/charts/openim-push/templates/service.yaml
index 4d8bb0457..b38c35375 100644
--- a/deployments/charts/openim-push/templates/service.yaml
+++ b/deployments/charts/openim-push/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-push/templates/serviceaccount.yaml b/deployments/charts/openim-push/templates/serviceaccount.yaml
index e22115724..66dfedfdf 100644
--- a/deployments/charts/openim-push/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-push/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-push/values.yaml b/deployments/charts/openim-push/values.yaml
index dd6f0faf6..3348fe79d 100644
--- a/deployments/charts/openim-push/values.yaml
+++ b/deployments/charts/openim-push/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-push.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-auth/Chart.yaml b/deployments/charts/openim-rpc-auth/Chart.yaml
index 97848dbf2..8e8fb03b4 100644
--- a/deployments/charts/openim-rpc-auth/Chart.yaml
+++ b/deployments/charts/openim-rpc-auth/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-auth
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-auth/templates/deployment.yaml b/deployments/charts/openim-rpc-auth/templates/deployment.yaml
index 4dbc49731..202162775 100644
--- a/deployments/charts/openim-rpc-auth/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-auth/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-auth/templates/hpa.yaml b/deployments/charts/openim-rpc-auth/templates/hpa.yaml
index 20108afbf..e99536cf1 100644
--- a/deployments/charts/openim-rpc-auth/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-auth/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-auth/templates/ingress.yaml b/deployments/charts/openim-rpc-auth/templates/ingress.yaml
index f14458c52..ece395de7 100644
--- a/deployments/charts/openim-rpc-auth/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-auth/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-auth.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-auth/templates/service.yaml b/deployments/charts/openim-rpc-auth/templates/service.yaml
index ef7b00b86..3674da014 100644
--- a/deployments/charts/openim-rpc-auth/templates/service.yaml
+++ b/deployments/charts/openim-rpc-auth/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-auth/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-auth/templates/serviceaccount.yaml
index f13dcca81..555d4f6ff 100644
--- a/deployments/charts/openim-rpc-auth/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-auth/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-auth/values.yaml b/deployments/charts/openim-rpc-auth/values.yaml
index a6db6716c..93fa68b87 100644
--- a/deployments/charts/openim-rpc-auth/values.yaml
+++ b/deployments/charts/openim-rpc-auth/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-auth.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-conversation/Chart.yaml b/deployments/charts/openim-rpc-conversation/Chart.yaml
index 090d63127..0ca8f5513 100644
--- a/deployments/charts/openim-rpc-conversation/Chart.yaml
+++ b/deployments/charts/openim-rpc-conversation/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-conversation
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-conversation/templates/deployment.yaml b/deployments/charts/openim-rpc-conversation/templates/deployment.yaml
index 13dd5c531..01721aa30 100644
--- a/deployments/charts/openim-rpc-conversation/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-conversation/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-conversation/templates/hpa.yaml b/deployments/charts/openim-rpc-conversation/templates/hpa.yaml
index a2378bfa0..524245562 100644
--- a/deployments/charts/openim-rpc-conversation/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-conversation/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-conversation/templates/ingress.yaml b/deployments/charts/openim-rpc-conversation/templates/ingress.yaml
index 224591f67..078c472b8 100644
--- a/deployments/charts/openim-rpc-conversation/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-conversation/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-conversation.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-conversation/templates/service.yaml b/deployments/charts/openim-rpc-conversation/templates/service.yaml
index be8355154..f90673584 100644
--- a/deployments/charts/openim-rpc-conversation/templates/service.yaml
+++ b/deployments/charts/openim-rpc-conversation/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-conversation/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-conversation/templates/serviceaccount.yaml
index 4e2d0e29f..14b1b2129 100644
--- a/deployments/charts/openim-rpc-conversation/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-conversation/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-conversation/values.yaml b/deployments/charts/openim-rpc-conversation/values.yaml
index 1b3e1e3de..bb88ab613 100644
--- a/deployments/charts/openim-rpc-conversation/values.yaml
+++ b/deployments/charts/openim-rpc-conversation/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-conversation.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-friend/Chart.yaml b/deployments/charts/openim-rpc-friend/Chart.yaml
index d7e4a9fef..62e92db9b 100644
--- a/deployments/charts/openim-rpc-friend/Chart.yaml
+++ b/deployments/charts/openim-rpc-friend/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-friend
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-friend/templates/deployment.yaml b/deployments/charts/openim-rpc-friend/templates/deployment.yaml
index 227ef1144..a57188828 100644
--- a/deployments/charts/openim-rpc-friend/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-friend/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-friend/templates/hpa.yaml b/deployments/charts/openim-rpc-friend/templates/hpa.yaml
index 7c4f14b7c..ae88e2621 100644
--- a/deployments/charts/openim-rpc-friend/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-friend/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-friend/templates/ingress.yaml b/deployments/charts/openim-rpc-friend/templates/ingress.yaml
index b5d411743..0845aa783 100644
--- a/deployments/charts/openim-rpc-friend/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-friend/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-friend.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-friend/templates/service.yaml b/deployments/charts/openim-rpc-friend/templates/service.yaml
index 792592d87..e445d561f 100644
--- a/deployments/charts/openim-rpc-friend/templates/service.yaml
+++ b/deployments/charts/openim-rpc-friend/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-friend/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-friend/templates/serviceaccount.yaml
index c81343f6b..5146d6781 100644
--- a/deployments/charts/openim-rpc-friend/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-friend/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-friend/values.yaml b/deployments/charts/openim-rpc-friend/values.yaml
index 041665a81..34dcda9da 100644
--- a/deployments/charts/openim-rpc-friend/values.yaml
+++ b/deployments/charts/openim-rpc-friend/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-friend.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-group/Chart.yaml b/deployments/charts/openim-rpc-group/Chart.yaml
index 8e037caea..c3f7e3bfa 100644
--- a/deployments/charts/openim-rpc-group/Chart.yaml
+++ b/deployments/charts/openim-rpc-group/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-group
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-group/templates/deployment.yaml b/deployments/charts/openim-rpc-group/templates/deployment.yaml
index 74ebe6c92..406d0b342 100644
--- a/deployments/charts/openim-rpc-group/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-group/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-group/templates/hpa.yaml b/deployments/charts/openim-rpc-group/templates/hpa.yaml
index 0ba0e8283..91f313abe 100644
--- a/deployments/charts/openim-rpc-group/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-group/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-group/templates/ingress.yaml b/deployments/charts/openim-rpc-group/templates/ingress.yaml
index 6a744f914..e3cad781a 100644
--- a/deployments/charts/openim-rpc-group/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-group/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-group.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-group/templates/service.yaml b/deployments/charts/openim-rpc-group/templates/service.yaml
index aa16f71b9..fc6f76060 100644
--- a/deployments/charts/openim-rpc-group/templates/service.yaml
+++ b/deployments/charts/openim-rpc-group/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-group/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-group/templates/serviceaccount.yaml
index b42dfb13b..304bbda56 100644
--- a/deployments/charts/openim-rpc-group/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-group/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-group/values.yaml b/deployments/charts/openim-rpc-group/values.yaml
index ec36e256f..f04c64147 100644
--- a/deployments/charts/openim-rpc-group/values.yaml
+++ b/deployments/charts/openim-rpc-group/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-group.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-msg/Chart.yaml b/deployments/charts/openim-rpc-msg/Chart.yaml
index 659767484..c32fe64c1 100644
--- a/deployments/charts/openim-rpc-msg/Chart.yaml
+++ b/deployments/charts/openim-rpc-msg/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-msg
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-msg/templates/deployment.yaml b/deployments/charts/openim-rpc-msg/templates/deployment.yaml
index e0565710a..d764294ea 100644
--- a/deployments/charts/openim-rpc-msg/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-msg/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-msg/templates/hpa.yaml b/deployments/charts/openim-rpc-msg/templates/hpa.yaml
index c01e07294..0e6dde369 100644
--- a/deployments/charts/openim-rpc-msg/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-msg/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-msg/templates/ingress.yaml b/deployments/charts/openim-rpc-msg/templates/ingress.yaml
index 2f5ad9d15..2ba587338 100644
--- a/deployments/charts/openim-rpc-msg/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-msg/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-msg.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-msg/templates/service.yaml b/deployments/charts/openim-rpc-msg/templates/service.yaml
index 9afd55a8c..953b89d5d 100644
--- a/deployments/charts/openim-rpc-msg/templates/service.yaml
+++ b/deployments/charts/openim-rpc-msg/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-msg/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-msg/templates/serviceaccount.yaml
index da69e5ce8..70fd82069 100644
--- a/deployments/charts/openim-rpc-msg/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-msg/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-msg/values.yaml b/deployments/charts/openim-rpc-msg/values.yaml
index 22cfd61f1..cf2f4e84d 100644
--- a/deployments/charts/openim-rpc-msg/values.yaml
+++ b/deployments/charts/openim-rpc-msg/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-msg.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-third/Chart.yaml b/deployments/charts/openim-rpc-third/Chart.yaml
index d7763d70a..ff624aa34 100644
--- a/deployments/charts/openim-rpc-third/Chart.yaml
+++ b/deployments/charts/openim-rpc-third/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-third
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-third/templates/deployment.yaml b/deployments/charts/openim-rpc-third/templates/deployment.yaml
index c14cce817..e4f47de57 100644
--- a/deployments/charts/openim-rpc-third/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-third/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-third/templates/hpa.yaml b/deployments/charts/openim-rpc-third/templates/hpa.yaml
index 2197e21a5..f20ecb973 100644
--- a/deployments/charts/openim-rpc-third/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-third/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-third/templates/ingress.yaml b/deployments/charts/openim-rpc-third/templates/ingress.yaml
index 3ba50cf33..1c64ac545 100644
--- a/deployments/charts/openim-rpc-third/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-third/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-third.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-third/templates/service.yaml b/deployments/charts/openim-rpc-third/templates/service.yaml
index 866b5cda2..f467992a2 100644
--- a/deployments/charts/openim-rpc-third/templates/service.yaml
+++ b/deployments/charts/openim-rpc-third/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-third/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-third/templates/serviceaccount.yaml
index 8a45872ce..27f2bf067 100644
--- a/deployments/charts/openim-rpc-third/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-third/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-third/values.yaml b/deployments/charts/openim-rpc-third/values.yaml
index 8a92566a9..71d9a3ede 100644
--- a/deployments/charts/openim-rpc-third/values.yaml
+++ b/deployments/charts/openim-rpc-third/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-third.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/charts/openim-rpc-user/Chart.yaml b/deployments/charts/openim-rpc-user/Chart.yaml
index 7a2118e46..feb5a3195 100644
--- a/deployments/charts/openim-rpc-user/Chart.yaml
+++ b/deployments/charts/openim-rpc-user/Chart.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v2
name: openim-rpc-user
description: A Helm chart for Kubernetes
diff --git a/deployments/charts/openim-rpc-user/templates/deployment.yaml b/deployments/charts/openim-rpc-user/templates/deployment.yaml
index f6f679c2d..62106e5a2 100644
--- a/deployments/charts/openim-rpc-user/templates/deployment.yaml
+++ b/deployments/charts/openim-rpc-user/templates/deployment.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: apps/v1
kind: Deployment
metadata:
diff --git a/deployments/charts/openim-rpc-user/templates/hpa.yaml b/deployments/charts/openim-rpc-user/templates/hpa.yaml
index 7c00c9d64..012b15ae3 100644
--- a/deployments/charts/openim-rpc-user/templates/hpa.yaml
+++ b/deployments/charts/openim-rpc-user/templates/hpa.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
diff --git a/deployments/charts/openim-rpc-user/templates/ingress.yaml b/deployments/charts/openim-rpc-user/templates/ingress.yaml
index 7ed5a0328..38aa6fdff 100644
--- a/deployments/charts/openim-rpc-user/templates/ingress.yaml
+++ b/deployments/charts/openim-rpc-user/templates/ingress.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "openim-rpc-user.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
diff --git a/deployments/charts/openim-rpc-user/templates/service.yaml b/deployments/charts/openim-rpc-user/templates/service.yaml
index 728c5de92..f89be1c44 100644
--- a/deployments/charts/openim-rpc-user/templates/service.yaml
+++ b/deployments/charts/openim-rpc-user/templates/service.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
apiVersion: v1
kind: Service
metadata:
diff --git a/deployments/charts/openim-rpc-user/templates/serviceaccount.yaml b/deployments/charts/openim-rpc-user/templates/serviceaccount.yaml
index d3395f00d..ebe3e3d68 100644
--- a/deployments/charts/openim-rpc-user/templates/serviceaccount.yaml
+++ b/deployments/charts/openim-rpc-user/templates/serviceaccount.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
diff --git a/deployments/charts/openim-rpc-user/values.yaml b/deployments/charts/openim-rpc-user/values.yaml
index d137f0ad7..4f1ad7ede 100644
--- a/deployments/charts/openim-rpc-user/values.yaml
+++ b/deployments/charts/openim-rpc-user/values.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# Default values for openim-rpc-user.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
diff --git a/deployments/openim-charts.yaml b/deployments/openim-charts.yaml
index 59815dbd5..2b468dad0 100644
--- a/deployments/openim-charts.yaml
+++ b/deployments/openim-charts.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
---
# Source: openim-api/templates/app-cm.yaml
apiVersion: v1
diff --git a/deployments/templates/alertmanager.yml b/deployments/templates/alertmanager.yml
index ea99a9286..4e390b2bb 100644
--- a/deployments/templates/alertmanager.yml
+++ b/deployments/templates/alertmanager.yml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
###################### AlertManager Configuration ######################
# AlertManager configuration using environment variables
#
diff --git a/deployments/templates/charts-value.yaml b/deployments/templates/charts-value.yaml
index 274d9b8d1..26bbe2926 100644
--- a/deployments/templates/charts-value.yaml
+++ b/deployments/templates/charts-value.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
#This configuration file is used to override the use of the value.yaml variable.
#Currently, only the configuration with ingressName as nginx is provided.
#If it is another gateway such as istio or treafik, please modify the corresponding gateway requirements
diff --git a/deployments/templates/chat.yaml b/deployments/templates/chat.yaml
deleted file mode 100644
index 561d45d6e..000000000
--- a/deployments/templates/chat.yaml
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright © 2023 OpenIM. 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.
-
-# Configuration for OpenIMServer
-
-# -----------------------------------------------------------------
-# TODO: This config file is the template file
-# --| source: deployments/templates/chat.yaml
-# --| env: scripts/install/environment
-# --| target: config/config.yaml
-# -----------------------------------------------------------------
-
-###################### Zookeeper ######################
-# Zookeeper configuration
-# It's not recommended to modify the schema
-zookeeper:
- schema: ${ZOOKEEPER_SCHEMA}
- zkAddr:
- - ${ZOOKEEPER_ADDRESS}:${ZOOKEEPER_PORT}
- username: ${ZOOKEEPER_USERNAME}
- password: ${ZOOKEEPER_PASSWORD}
-
-###################### Chat API ######################
-chatApi:
- openImChatApiPort: [ ${OPENIM_CHAT_API_PORT} ]
- listenIP: ${CHAT_API_LISTEN_IP}
-
-###################### Admin API ######################
-adminApi:
- openImAdminApiPort: [ ${OPENIM_ADMIN_API_PORT} ]
- listenIP: ${ADMIN_API_LISTEN_IP}
-
-###################### RPC ######################
-rpc:
- registerIP: #作为rpc启动时,注册到zookeeper的IP,api/gateway能访问到此ip和对应的rpcPort中的端口
- listenIP: #默认为0.0.0.0
-
-rpcPort:
- openImAdminPort: [ ${OPENIM_ADMIN_PORT} ]
- openImChatPort: [ ${OPENIM_CHAT_PORT} ]
-rpcRegisterName:
- openImAdminName: ${OPENIM_ADMIN_NAME}
- openImChatName: ${OPENIM_CHAT_NAME}
-
-###################### Log ######################
-log:
- storageLocation: ../logs/ #存放目录
-# rotationTime: 24 #日志旋转时间
-# remainRotationCount: 2 #日志数量
-# remainLogLevel: 6 #日志级别 6表示全都打印,
-# isStdout: false
-# isJson: false
-# withStack: false
-
-###################### Secret & Token Policy ######################
-# secret: openIM123
-#tokenPolicy:
-# expire: 86400
-
-###################### Verify Code ######################
-verifyCode:
- validTime: 300 # 验证码有效时间
- validCount: 5 # 验证码有效次数
- uintTime: 86400 # 单位时间间隔
- maxCount: 10 # 单位时间内最大获取次数
- superCode: "666666" # 超级验证码(只有use为空时使用)
- len: 6 # 验证码长度
- use: "" # 使用的验证码服务(use: "ali")
- ali:
- endpoint: "dysmsapi.aliyuncs.com"
- accessKeyId: ""
- accessKeySecret: ""
- signName: ""
- verificationCodeTemplateCode: ""
- mail: # 根据对应的发件邮箱更改 sendMail、senderAuthorizationCode、smtpAddr、smtpPort 即可
- title: ""
- senderMail: "" # 发送者
- senderAuthorizationCode: "" # 授权码
- smtpAddr: "smtp.qq.com" # smtp 服务器地址
- smtpPort: 25 # smtp 服务器邮件发送端口
- testDepartMentID: 001
- imAPIURL: http://127.0.0.1:10002
-
-###################### Proxy Header ######################
-# 获取ip的header,没有配置直接获取远程地址
-#proxyHeader: "X-Forwarded-For"
-
-###################### Admin List ######################
-adminList:
- - adminID: admin1
- nickname: chat1
- imAdmin: openIM123456
- - adminID: admin2
- nickname: chat2
- imAdmin: openIM654321
- - adminID: admin3
- nickname: chat3
- imAdmin: openIMAdmin
-
-###################### OpenIM URL ######################
-openIMUrl: ${OPENIM_SERVER_ADDRESS}:${API_OPENIM_PORT}
-
-###################### Redis ######################
-redis:
- # address: [ 127.0.0.1:16379 ]
- # username:
- # password: openIM123
diff --git a/deployments/templates/email.tmpl b/deployments/templates/email.tmpl
new file mode 100644
index 000000000..0385601d0
--- /dev/null
+++ b/deployments/templates/email.tmpl
@@ -0,0 +1,16 @@
+{{ define "email.to.html" }}
+{{ range .Alerts }}
+
+
+
OpenIM Alert
+
Alert Program: Prometheus Alert
+
Severity Level: {{ .Labels.severity }}
+
Alert Type: {{ .Labels.alertname }}
+
Affected Host: {{ .Labels.instance }}
+
Affected Service: {{ .Labels.job }}
+
Alert Subject: {{ .Annotations.summary }}
+
Trigger Time: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
+
+
+{{ end }}
+{{ end }}
diff --git a/deployments/templates/env_template.yaml b/deployments/templates/env-template.yaml
similarity index 95%
rename from deployments/templates/env_template.yaml
rename to deployments/templates/env-template.yaml
index 4db838c8e..ab9c87c02 100644
--- a/deployments/templates/env_template.yaml
+++ b/deployments/templates/env-template.yaml
@@ -24,10 +24,6 @@ USER=${OPENIM_USER}
# Default: PASSWORD=openIM123
PASSWORD=${PASSWORD}
-# Endpoint for the MinIO object storage service.
-# Default: MINIO_ENDPOINT=http://172.28.0.1:10005
-MINIO_ENDPOINT=${MINIO_ENDPOINT}
-
# Base URL for the application programming interface (API).
# Default: API_URL=http://172.28.0.1:10002
API_URL=${API_URL}
@@ -90,11 +86,11 @@ MONGO_ADDRESS=${MONGO_NETWORK_ADDRESS}
# Port on which MongoDB service is running.
# Default: MONGO_PORT=37017
-MONGO_PORT=${MONGO_PORT}
+# MONGO_PORT=${MONGO_PORT}
# Username to authenticate with the MongoDB service.
# Default: MONGO_USERNAME=root
-MONGO_USERNAME=${MONGO_USERNAME}
+# MONGO_USERNAME=${MONGO_USERNAME}
# Password to authenticate with the MongoDB service.
# Default: MONGO_PASSWORD=openIM123
@@ -122,6 +118,9 @@ REDIS_PASSWORD=${REDIS_PASSWORD}
# Default: KAFKA_ADDRESS=172.28.0.1
KAFKA_ADDRESS=${KAFKA_NETWORK_ADDRESS}
+# Kakfa username to authenticate with the Kafka service.
+# KAFKA_USERNAME=${KAFKA_USERNAME}
+
# Port on which Kafka distributed streaming platform is running.
# Default: KAFKA_PORT=19092
KAFKA_PORT=${KAFKA_PORT}
@@ -149,7 +148,7 @@ MINIO_PORT=${MINIO_PORT}
# Access key to authenticate with the MinIO service.
# Default: MINIO_ACCESS_KEY=root
-MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}
+# MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}
# Secret key corresponding to the access key for MinIO authentication.
# Default: MINIO_SECRET_KEY=openIM123
@@ -211,8 +210,8 @@ API_OPENIM_PORT=${API_OPENIM_PORT}
# ======================================
# Branch name for OpenIM chat.
-# Default: CHAT_BRANCH=main
-CHAT_BRANCH=${CHAT_BRANCH}
+# Default: CHAT_IMAGE_VERSION=main
+CHAT_IMAGE_VERSION=${CHAT_IMAGE_VERSION}
# Address or hostname for the OpenIM chat service.
# Default: OPENIM_CHAT_ADDRESS=172.28.0.1
@@ -232,8 +231,8 @@ OPENIM_CHAT_DATA_DIR=${OPENIM_CHAT_DATA_DIR}
# ======================================
# Branch name for OpenIM server.
-# Default: SERVER_BRANCH=main
-SERVER_BRANCH=${SERVER_BRANCH}
+# Default: SERVER_IMAGE_VERSION=main
+SERVER_IMAGE_VERSION=${SERVER_IMAGE_VERSION}
# Port for the OpenIM admin API.
# Default: OPENIM_ADMIN_API_PORT=10009
diff --git a/deployments/templates/helm-image.yaml b/deployments/templates/helm-image.yaml
index 317bc34ac..ef64abf91 100644
--- a/deployments/templates/helm-image.yaml
+++ b/deployments/templates/helm-image.yaml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
#This configuration file is used to override the use of the value.yaml variable.
#Currently, only the configuration with ingressName as nginx is provided.
#If it is another gateway such as istio or treafik, please modify the corresponding gateway requirements
diff --git a/config/instance-down-rules.yml b/deployments/templates/instance-down-rules.yml
similarity index 61%
rename from config/instance-down-rules.yml
rename to deployments/templates/instance-down-rules.yml
index 5541d2c54..7a6e9fda9 100644
--- a/config/instance-down-rules.yml
+++ b/deployments/templates/instance-down-rules.yml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
groups:
- name: instance_down
rules:
diff --git a/config/notification.yaml b/deployments/templates/notification.yaml
similarity index 88%
rename from config/notification.yaml
rename to deployments/templates/notification.yaml
index 5e5223a00..665c21261 100644
--- a/config/notification.yaml
+++ b/deployments/templates/notification.yaml
@@ -12,18 +12,36 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# Determines if a message should be sent. If set to false, it triggers a silent sync without a message. If true, it requires triggering a conversation.
+# For rpc notification, send twice: once as a message and once as a notification.
+# The options field 'isNotification' indicates if it's a notification.
groupCreated:
- isSendMsg: true #是否发送消息,false不发消息为无声的触发同步。true发消息需要触发会话,rpc notification直接发两次,一次消息一次通知, options字段isNotification是否为通知
- reliabilityLevel: 1 # 1为online才发送 2为必达
- unreadCount: false # 只在isSendMsg为true的情况下有作用
+ isSendMsg: true
+
+# Reliability level of the message sending.
+# Set to 1 to send only when online, 2 for guaranteed delivery.
+ reliabilityLevel: 1
+
+# This setting is effective only when 'isSendMsg' is true.
+# It controls whether to count unread messages.
+ unreadCount: false
+
+# Configuration for offline push notifications.
offlinePush:
- enable: false # 开启该开关
- title: "create group title" # xx create the group
+ # Enables or disables offline push notifications.
+ enable: false
+
+ # Title for the notification when a group is created.
+ title: "create group title"
+
+ # Description for the notification.
desc: "create group desc"
- ext: "create group ext"
-# 不加消息contentType,content统一json 结构体使用pb的
+ # Additional information for the notification.
+ ext: "create group ext"
+# Content type is not added here.
+# Content should use a JSON structure conforming to the protobuf format.
groupInfoSet:
isSendMsg: false
@@ -334,4 +352,3 @@ conversationSetPrivate:
title: "burn after reading"
desc: "burn after reading"
ext: "burn after reading"
-
diff --git a/deployments/templates/openim.yaml b/deployments/templates/openim.yaml
index d822fec13..ed5dc4fe1 100644
--- a/deployments/templates/openim.yaml
+++ b/deployments/templates/openim.yaml
@@ -37,13 +37,20 @@ zookeeper:
###################### Mongo ######################
# MongoDB configuration
-# If uri is not empty, it will be used directly
-#
-# MongoDB address for standalone setup, Mongos address for sharded cluster setup
-# Default MongoDB database name
-# Maximum connection pool size
+
+# If uri is not empty, it will be used directly for the MongoDB connection.
+# This is a complete MongoDB URI string.
+# Example: mongodb://user:password@host1:port1,host2:port2/dbname?options
mongo:
uri: ${MONGO_URI}
+
+# List of MongoDB server addresses.
+# Used for constructing the MongoDB URI if 'uri' above is empty.
+# For a standalone setup, specify the address of the single server.
+# For a sharded cluster, specify the addresses of the Mongos servers.
+# Example: [ '172.28.0.1:37017', '172.28.0.2:37017' ]
+# Default MongoDB database name
+# Maximum connection pool size
address: [ ${MONGO_ADDRESS}:${MONGO_PORT} ]
database: ${MONGO_DATABASE}
username: ${MONGO_USERNAME}
diff --git a/deployments/templates/prometheus.yml b/deployments/templates/prometheus.yml
index fb07a8129..5c3e0af66 100644
--- a/deployments/templates/prometheus.yml
+++ b/deployments/templates/prometheus.yml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM. 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.
+
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
diff --git a/docker-compose.yml b/docker-compose.yml
index 233c8d492..de3deaaea 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,55 +7,55 @@ networks:
ipam:
driver: default
config:
- - subnet: '${DOCKER_BRIDGE_SUBNET}'
- gateway: '${DOCKER_BRIDGE_GATEWAY}'
+ - subnet: '${DOCKER_BRIDGE_SUBNET:-172.28.0.0/16}'
+ gateway: '${DOCKER_BRIDGE_GATEWAY:-172.28.0.1}'
services:
mongodb:
- image: mongo:6.0.2
+ image: mongo:${MONGODB_IMAGE_VERSION-6.0.2}
ports:
- - "${MONGO_PORT}:27017"
+ - "${MONGO_PORT:-37017}:27017"
container_name: mongo
command: --wiredTigerCacheSizeGB 1 --auth
volumes:
- - "${DATA_DIR}/components/mongodb/data/db:/data/db"
- - "${DATA_DIR}/components/mongodb/data/logs:/data/logs"
- - "${DATA_DIR}/components/mongodb/data/conf:/etc/mongo"
- - ./scripts/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro"
+ - "${DATA_DIR:-./}/components/mongodb/data/db:/data/db"
+ - "${DATA_DIR:-./}/components/mongodb/data/logs:/data/logs"
+ - "${DATA_DIR:-./}/components/mongodb/data/conf:/etc/mongo"
+ - ./scripts/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro
environment:
- TZ=Asia/Shanghai
- wiredTigerCacheSizeGB=1
- - MONGO_INITDB_ROOT_USERNAME=${MONGO_USERNAME}
- - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD}
- - MONGO_INITDB_DATABASE=${MONGO_DATABASE}
+ - MONGO_INITDB_ROOT_USERNAME=${MONGO_USERNAME:-root}
+ - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD:-openIM123}
+ - MONGO_INITDB_DATABASE=${MONGO_DATABASE:-openIM_v3}
restart: always
networks:
server:
- ipv4_address: ${MONGO_NETWORK_ADDRESS}
+ ipv4_address: ${MONGO_NETWORK_ADDRESS:-172.28.0.2}
redis:
- image: redis:7.0.0
+ image: redis:${REDIS_IMAGE_VERSION:-7.0.0}
container_name: redis
ports:
- - "${REDIS_PORT}:6379"
+ - "${REDIS_PORT:-16379}:6379"
volumes:
- - "${DATA_DIR}/components/redis/data:/data"
- - "${DATA_DIR}/components/redis/config/redis.conf:/usr/local/redis/config/redis.conf"
+ - "${DATA_DIR:-./}/components/redis/data:/data"
+ - "${DATA_DIR:-./}/components/redis/config/redis.conf:/usr/local/redis/config/redis.conf"
environment:
TZ: Asia/Shanghai
restart: always
sysctls:
net.core.somaxconn: 1024
- command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
+ command: redis-server --requirepass ${REDIS_PASSWORD:-openIM123} --appendonly yes
networks:
server:
- ipv4_address: ${REDIS_NETWORK_ADDRESS}
+ ipv4_address: ${REDIS_NETWORK_ADDRESS:-172.28.0.3}
zookeeper:
- image: bitnami/zookeeper:3.8
+ image: bitnami/zookeeper:${ZOOKEEPER_IMAGE_VERSION:-3.8}
container_name: zookeeper
ports:
- - "${ZOOKEEPER_PORT}:2181"
+ - "${ZOOKEEPER_PORT:-12181}:2181"
volumes:
- "/etc/localtime:/etc/localtime"
environment:
@@ -64,81 +64,74 @@ services:
restart: always
networks:
server:
- ipv4_address: ${ZOOKEEPER_NETWORK_ADDRESS}
+ ipv4_address: ${ZOOKEEPER_NETWORK_ADDRESS:-172.28.0.5}
kafka:
- image: 'bitnami/kafka:3.5.1'
+ image: 'bitnami/kafka:${KAFKA_IMAGE_VERSION:-3.5.1}'
container_name: kafka
- user: root
restart: always
+ user: ${KAFKA_USER:-root}
ports:
- - "${KAFKA_PORT}:9094"
+ - "${KAFKA_PORT:-19094}:9094"
volumes:
- ./scripts/create-topic.sh:/opt/bitnami/kafka/create-topic.sh
- - ${DATA_DIR}/components/kafka:/bitnami/kafka
+ - "${DATA_DIR:-./}/components/kafka:/bitnami/kafka"
command: >
- bash -c "
- /opt/bitnami/scripts/kafka/run.sh & sleep 5; /opt/bitnami/kafka/create-topic.sh; wait
- "
+ bash -c "/opt/bitnami/scripts/kafka/run.sh & sleep 5; /opt/bitnami/kafka/create-topic.sh; wait"
environment:
- TZ=Asia/Shanghai
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://${DOCKER_BRIDGE_GATEWAY}:${KAFKA_PORT}
+ - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://${DOCKER_BRIDGE_GATEWAY:-172.28.0.1}:${KAFKA_PORT:-19094}
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
networks:
server:
- ipv4_address: ${KAFKA_NETWORK_ADDRESS}
+ ipv4_address: ${KAFKA_NETWORK_ADDRESS:-172.28.0.4}
minio:
- image: minio/minio
+ image: minio/minio:${MINIO_IMAGE_VERSION:-latest}
ports:
- - "${MINIO_PORT}:9000"
+ - "${MINIO_PORT:-10005}:9000"
- "9090:9090"
container_name: minio
volumes:
- - "${DATA_DIR}/components/mnt/data:/data"
- - "${DATA_DIR}/components/mnt/config:/root/.minio"
+ - "${DATA_DIR:-./}/components/mnt/data:/data"
+ - "${DATA_DIR:-./}/components/mnt/config:/root/.minio"
environment:
- MINIO_ROOT_USER: "${MINIO_ACCESS_KEY}"
- MINIO_ROOT_PASSWORD: "${MINIO_SECRET_KEY}"
+ MINIO_ROOT_USER: "${MINIO_ACCESS_KEY:-root}"
+ MINIO_ROOT_PASSWORD: "${MINIO_SECRET_KEY:-openIM123}"
restart: always
command: minio server /data --console-address ':9090'
networks:
server:
- ipv4_address: ${MINIO_NETWORK_ADDRESS}
+ ipv4_address: ${MINIO_NETWORK_ADDRESS:-172.28.0.6}
openim-web:
- # image: ghcr.io/openimsdk/openim-web:latest
- # image: registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-web:latest
- # image: openim/openim-web:latest
- image: ${IMAGE_REGISTRY}/openim-web:latest
+ image: ${IMAGE_REGISTRY:-ghcr.io/openimsdk}/openim-web:${OPENIM_WEB_IMAGE_VERSION:-latest}
container_name: openim-web
environment:
- - OPENIM_WEB_DIST_PATH=${OPENIM_WEB_DIST_PATH}
- - OPENIM_WEB_PORT=${OPENIM_WEB_PORT}
+ - OPENIM_WEB_DIST_PATH=${OPENIM_WEB_DIST_PATH:-/app/dist}
+ - OPENIM_WEB_PORT=${OPENIM_WEB_PORT:-11001}
restart: always
ports:
- - "${OPENIM_WEB_PORT}:11001"
+ - "${OPENIM_WEB_PORT:-11001}:11001"
networks:
server:
- ipv4_address: ${OPENIM_WEB_NETWORK_ADDRESS}
+ ipv4_address: ${OPENIM_WEB_NETWORK_ADDRESS:-172.28.0.7}
+ # Uncomment and configure the following services as needed
# openim-admin:
- # image: ${IMAGE_REGISTRY}/openim-admin-front:v3.4.0
- # # image: ghcr.io/openimsdk/openim-admin-front:v3.4.0
- # # image: registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-admin-front:v3.4.0
- # # image: openim/openim-admin-front:v3.4.0
+ # image: ${IMAGE_REGISTRY:-ghcr.io/openimsdk}/openim-admin-front:v3.4.0
# container_name: openim-admin
# restart: always
# ports:
- # - "${OPENIM_ADMIN_FRONT_PORT}:80"
+ # - "${OPENIM_ADMIN_FRONT_PORT:-11002}:80"
# networks:
# server:
- # ipv4_address: ${OPENIM_ADMIN_FRONT_NETWORK_ADDRESS}
+ # ipv4_address: ${OPENIM_ADMIN_FRONT_NETWORK_ADDRESS:-172.28.0.13}
# prometheus:
# image: prom/prometheus
@@ -149,10 +142,10 @@ services:
# - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
# - ./config/instance-down-rules.yml:/etc/prometheus/instance-down-rules.yml
# ports:
- # - "${PROMETHEUS_PORT}:9090"
+ # - "${PROMETHEUS_PORT:-19090}:9090"
# networks:
# server:
- # ipv4_address: ${PROMETHEUS_NETWORK_ADDRESS}
+ # ipv4_address: ${PROMETHEUS_NETWORK_ADDRESS:-172.28.0.10}
# alertmanager:
# image: prom/alertmanager
@@ -163,10 +156,10 @@ services:
# - ./config/alertmanager.yml:/etc/alertmanager/alertmanager.yml
# - ./config/email.tmpl:/etc/alertmanager/email.tmpl
# ports:
- # - "${ALERT_MANAGER_PORT}:9093"
+ # - "${ALERT_MANAGER_PORT:-19093}:9093"
# networks:
# server:
- # ipv4_address: ${ALERT_MANAGER_NETWORK_ADDRESS}
+ # ipv4_address: ${ALERT_MANAGER_NETWORK_ADDRESS:-172.28.0.14}
# grafana:
# image: grafana/grafana
@@ -175,12 +168,12 @@ services:
# user: root
# restart: always
# ports:
- # - "${GRAFANA_PORT}:3000"
+ # - "${GRAFANA_PORT:-13000}:3000"
# volumes:
- # - ${DATA_DIR}/components/grafana:/var/lib/grafana
+ # - ${DATA_DIR:-./}/components/grafana:/var/lib/grafana
# networks:
# server:
- # ipv4_address: ${GRAFANA_NETWORK_ADDRESS}
+ # ipv4_address: ${GRAFANA_NETWORK_ADDRESS:-172.28.0.11}
# node-exporter:
# image: quay.io/prometheus/node-exporter
@@ -188,7 +181,7 @@ services:
# hostname: node-exporter
# restart: always
# ports:
- # - "${NODE_EXPORTER_PORT}:9100"
+ # - "${NODE_EXPORTER_PORT:-19100}:9100"
# networks:
# server:
- # ipv4_address: ${NODE_EXPORTER_NETWORK_ADDRESS}
+ # ipv4_address: ${NODE_EXPORTER_NETWORK_ADDRESS:-172.28.0.12}
diff --git a/docs/contrib/bash-log.md b/docs/contrib/bash-log.md
index 86acb1d33..7725d5589 100644
--- a/docs/contrib/bash-log.md
+++ b/docs/contrib/bash-log.md
@@ -11,7 +11,7 @@ OpenIM, an intricate project, requires a robust logging mechanism to diagnose is
1. **Initialization**: The system begins by determining the verbosity level through the `OPENIM_VERBOSE` variable. If it's not set, a default value of 5 is assigned. This verbosity level dictates the depth of the log details.
2. **Log File Setup**: Logs are stored in the directory specified by `OPENIM_OUTPUT`. If this variable isn't explicitly set, it defaults to the `_output` directory relative to the script location. Each log file is named based on the date to facilitate easy identification.
3. **Logging Function**: The `echo_log()` function plays a pivotal role by writing messages to both the console (stdout) and the log file.
-4. **Logging to a file**: The `echo_log()` function writes to the log file by appending the message to the file. It also adds a timestamp to the message. path: `_output/logs/*`, Enable logging by default. Set to false to disable. If you wish to turn off output to log files set `ENABLE_LOGGING=flase`.
+4. **Logging to a file**: The `echo_log()` function writes to the log file by appending the message to the file. It also adds a timestamp to the message. path: `_output/logs/*`, Enable logging by default. Set to false to disable. If you wish to turn off output to log files set `export ENABLE_LOGGING=flase`.
### Key Functions & Their Usages
diff --git a/docs/contrib/environment.md b/docs/contrib/environment.md
index 3dd090dcc..310c2df6a 100644
--- a/docs/contrib/environment.md
+++ b/docs/contrib/environment.md
@@ -104,18 +104,18 @@ Docker deployment offers a slightly more intricate template. Within the [openim-
Configuration file modifications can be made by specifying corresponding environment variables, for instance:
```bash
-export CHAT_BRANCH="main"
-export SERVER_BRANCH="main"
+export CHAT_IMAGE_VERSION="main"
+export SERVER_IMAGE_VERSION="main"
```
These variables are stored within the [`environment.sh`](https://github.com/OpenIMSDK/openim-docker/blob/main/scripts/install/environment.sh) configuration:
```bash
-readonly CHAT_BRANCH=${CHAT_BRANCH:-'main'}
-readonly SERVER_BRANCH=${SERVER_BRANCH:-'main'}
+readonly CHAT_IMAGE_VERSION=${CHAT_IMAGE_VERSION:-'main'}
+readonly SERVER_IMAGE_VERSION=${SERVER_IMAGE_VERSION:-'main'}
```
-Setting a variable, e.g., `export CHAT_BRANCH="release-v1.3"`, will prioritize `CHAT_BRANCH="release-v1.3"` as the variable value. Ultimately, the chosen image version is determined, and rendering is achieved through `make init` (or `./scripts/init-config.sh`).
+Setting a variable, e.g., `export CHAT_IMAGE_VERSION="release-v1.3"`, will prioritize `CHAT_IMAGE_VERSION="release-v1.3"` as the variable value. Ultimately, the chosen image version is determined, and rendering is achieved through `make init` (or `./scripts/init-config.sh`).
> Note: Direct modifications to the `config.yaml` file are also permissible without utilizing `make init`.
diff --git a/docs/contrib/util-makefile.md b/docs/contrib/util-makefile.md
index e0331f50e..8bde02874 100644
--- a/docs/contrib/util-makefile.md
+++ b/docs/contrib/util-makefile.md
@@ -30,7 +30,7 @@ Executing `make tools` ensures verification and installation of the default tool
- go-junit-report
- go-gitlint
-The installation path is situated at `/root/workspaces/openim/Open-IM-Server/_output/tools/`.
+The installation path is situated at `./_output/tools/`.
## Toolset Categories
diff --git a/go.mod b/go.mod
index 6cf2089de..c8dd96689 100644
--- a/go.mod
+++ b/go.mod
@@ -33,8 +33,8 @@ require github.com/google/uuid v1.3.1
require (
github.com/IBM/sarama v1.41.3
- github.com/OpenIMSDK/protocol v0.0.31
- github.com/OpenIMSDK/tools v0.0.18
+ github.com/OpenIMSDK/protocol v0.0.36
+ github.com/OpenIMSDK/tools v0.0.20
github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible
github.com/go-redis/redis v6.15.9+incompatible
github.com/redis/go-redis/v9 v9.2.1
@@ -154,3 +154,7 @@ require (
golang.org/x/crypto v0.14.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
)
+//replace (
+// github.com/OpenIMSDK/protocol v0.0.34 => github.com/AndrewZuo01/protocol v0.0.0-20231218034338-b8d838e0b182
+//)
+
diff --git a/go.sum b/go.sum
index 2f9198c9f..30e4b3cb4 100644
--- a/go.sum
+++ b/go.sum
@@ -20,8 +20,8 @@ github.com/IBM/sarama v1.41.3 h1:MWBEJ12vHC8coMjdEXFq/6ftO6DUZnQlFYcxtOJFa7c=
github.com/IBM/sarama v1.41.3/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ=
github.com/OpenIMSDK/protocol v0.0.31 h1:ax43x9aqA6EKNXNukS5MT5BSTqkUmwO4uTvbJLtzCgE=
github.com/OpenIMSDK/protocol v0.0.31/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y=
-github.com/OpenIMSDK/tools v0.0.18 h1:h3CvKB90DNd2aIJcOQ99cqgeW6C0na0PzR1TNsfxwL0=
-github.com/OpenIMSDK/tools v0.0.18/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI=
+github.com/OpenIMSDK/tools v0.0.20 h1:zBTjQZRJ5lR1FIzP9mtWyAvh5dKsmJXQugi4p8X/97k=
+github.com/OpenIMSDK/tools v0.0.20/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI=
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
diff --git a/install_guide.sh b/install_guide.sh
deleted file mode 100755
index c4323d6a8..000000000
--- a/install_guide.sh
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/usr/bin/env bash
-
-echo "Welcome to the Open-IM-Server installation scripts."
-echo "Please select an deploy option:"
-echo "1. docker-compose install"
-echo "2. exit"
-
-clear_openimlog() {
- rm -rf ./logs/*
-}
-
-is_path() {
- if [ -e "$1" ]; then
- return 1
- else
- return 0
- fi
-}
-
-is_empty() {
- if [ -z "$1" ]; then
- return 1
- else
- return 0
- fi
-}
-
-is_directory_exists() {
- if [ -d "$1" ]; then
- return 1
- else
- return 0
- fi
-}
-
-edit_config() {
- echo "Is edit config.yaml?"
- echo "1. vi edit config"
- echo "2. do not edit config"
- read choice
- case $choice in
- 1)
- vi config/config.yaml
- ;;
- 2)
- echo "do not edit config"
- ;;
- esac
-}
-
-edit_enterprise_config() {
- echo "Is edit enterprise config.yaml?"
- echo "1. vi edit enterprise config"
- echo "2. do not edit enterprise config"
- read choice
- case $choice in
- 1)
- vi ./.docker-compose_cfg/config.yaml
- ;;
- 2)
- echo "Do not edit enterprise config"
- ;;
- esac
-}
-
-install_docker_compose() {
- echo "Please input the installation path, default is $(pwd)/Open-IM-Server, press enter to use default"
- read install_path
- is_empty $install_path
- if [ $? -eq 1 ]; then
- install_path="."
- fi
- echo "Installing Open-IM-Server to ${install_path}/Open-IM-Server..."
- is_path $install_path
- mkdir -p $install_path
- cd $install_path
- is_directory_exists "${install_path}/Open-IM-Server"
- if [ $? -eq 1 ]; then
- echo "WARNING: Directory $install_path/Open-IM-Server exist, please ensure your path"
- echo "1. delete the directory and install"
- echo "2. exit"
- read choice
- case $choice in
- 1)
- rm -rf "${install_path}/Open-IM-Server"
- ;;
- 2)
- exit 1
- ;;
- esac
- fi
- rm -rf ./Open-IM-Server
- set -e
- git clone https://github.com/openimsdk/open-im-server.git --recursive;
- set +e
- cd ./Open-IM-Server
- git checkout errcode
- echo "======== git clone success ========"
- source .env
- if [ $DATA_DIR = "./" ]; then
- DATA_DIR=$(pwd)/components
- fi
- echo "Please input the components data directory, deault is ${DATA_DIR}, press enter to use default"
- read NEW_DATA_DIR
- is_empty $NEW_DATA_DIR
- if [ $? -eq 0 ]; then
- DATA_DIR=$NEW_DATA_DIR
- fi
- echo "Please input the user, deault is root, press enter to use default"
- read NEW_USER
- is_empty $NEW_USER
- if [ $? -eq 0 ]; then
- OPENIM_USER=$NEW_USER
- fi
-
- echo "Please input the password, default is openIM123, press enter to use default"
- read NEW_PASSWORD
- is_empty $NEW_PASSWORD
- if [ $? -eq 0 ]; then
- PASSWORD=$NEW_PASSWORD
- fi
-
- echo "Please input the minio_endpoint, default will detect auto, press enter to use default"
- read NEW_MINIO_ENDPOINT
- is_empty $NEW_MINIO_ENDPOINT
- if [ $? -eq 1 ]; then
- internet_ip=`curl ifconfig.me -s`
- MINIO_ENDPOINT="http://${internet_ip}:10005"
- else
- MINIO_ENDPOINT=$NEW_MINIO_ENDPOINT
- fi
- set -e
- export MINIO_ENDPOINT
- export OPENIM_USER
- export PASSWORD
- export DATA_DIR
-
- cat < .env
-OPENIM_USER=${OPENIM_USER}
-PASSWORD=${PASSWORD}
-MINIO_ENDPOINT=${MINIO_ENDPOINT}
-DATA_DIR=${DATA_DIR}
-EOF
-
- edit_config
- edit_enterprise_config
-
- cd scripts;
- chmod +x *.sh;
- ./init-pwd.sh;
- ./env_check.sh;
- cd ..;
- docker-compose up -d;
- cd scripts;
- ./docker-check-service.sh;
-}
-
-read choice
-
-case $choice in
- 1)
- install_docker_compose
- ;;
- 2)
-
- ;;
- 3)
- ;;
- 4)
- echo "Exiting installation scripts..."
- exit 0
- ;;
- *)
- echo "Invalid option, please try again."
- ;;
-esac
diff --git a/internal/api/friend.go b/internal/api/friend.go
index 23f337a9f..58e7398dd 100644
--- a/internal/api/friend.go
+++ b/internal/api/friend.go
@@ -92,3 +92,6 @@ func (o *FriendApi) GetFriendIDs(c *gin.Context) {
func (o *FriendApi) GetSpecifiedFriendsInfo(c *gin.Context) {
a2r.Call(friend.FriendClient.GetSpecifiedFriendsInfo, o.Client, c)
}
+func (o *FriendApi) SetPinFriends(c *gin.Context) {
+ a2r.Call(friend.FriendClient.PinFriends, o.Client, c)
+}
diff --git a/internal/api/msg.go b/internal/api/msg.go
index 22182d985..664ee505a 100644
--- a/internal/api/msg.go
+++ b/internal/api/msg.go
@@ -27,6 +27,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"github.com/mitchellh/mapstructure"
+
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
diff --git a/internal/api/route.go b/internal/api/route.go
index 7a331d643..8bfea5cca 100644
--- a/internal/api/route.go
+++ b/internal/api/route.go
@@ -77,6 +77,11 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
userRouterGroup.POST("/subscribe_users_status", ParseToken, u.SubscriberStatus)
userRouterGroup.POST("/get_users_status", ParseToken, u.GetUserStatus)
userRouterGroup.POST("/get_subscribe_users_status", ParseToken, u.GetSubscribeUsersStatus)
+
+ userRouterGroup.POST("/process_user_command_add", ParseToken, u.ProcessUserCommandAdd)
+ userRouterGroup.POST("/process_user_command_delete", ParseToken, u.ProcessUserCommandDelete)
+ userRouterGroup.POST("/process_user_command_update", ParseToken, u.ProcessUserCommandUpdate)
+ userRouterGroup.POST("/process_user_command_get", ParseToken, u.ProcessUserCommandGet)
}
// friend routing group
friendRouterGroup := r.Group("/friend", ParseToken)
@@ -98,6 +103,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
friendRouterGroup.POST("/is_friend", f.IsFriend)
friendRouterGroup.POST("/get_friend_id", f.GetFriendIDs)
friendRouterGroup.POST("/get_specified_friends_info", f.GetSpecifiedFriendsInfo)
+ friendRouterGroup.POST("/set_pin_friend", f.SetPinFriends)
}
g := NewGroupApi(*groupRpc)
groupRouterGroup := r.Group("/group", ParseToken)
diff --git a/internal/api/user.go b/internal/api/user.go
index 86b7c0b0b..8350d1711 100644
--- a/internal/api/user.go
+++ b/internal/api/user.go
@@ -199,3 +199,23 @@ func (u *UserApi) GetUserStatus(c *gin.Context) {
func (u *UserApi) GetSubscribeUsersStatus(c *gin.Context) {
a2r.Call(user.UserClient.GetSubscribeUsersStatus, u.Client, c)
}
+
+// ProcessUserCommandAdd user general function add
+func (u *UserApi) ProcessUserCommandAdd(c *gin.Context) {
+ a2r.Call(user.UserClient.ProcessUserCommandAdd, u.Client, c)
+}
+
+// ProcessUserCommandDelete user general function delete
+func (u *UserApi) ProcessUserCommandDelete(c *gin.Context) {
+ a2r.Call(user.UserClient.ProcessUserCommandDelete, u.Client, c)
+}
+
+// ProcessUserCommandUpdate user general function update
+func (u *UserApi) ProcessUserCommandUpdate(c *gin.Context) {
+ a2r.Call(user.UserClient.ProcessUserCommandUpdate, u.Client, c)
+}
+
+// ProcessUserCommandGet user general function get
+func (u *UserApi) ProcessUserCommandGet(c *gin.Context) {
+ a2r.Call(user.UserClient.ProcessUserCommandGet, u.Client, c)
+}
diff --git a/internal/msggateway/compressor_test.go b/internal/msggateway/compressor_test.go
index d41c57bf3..b1544f063 100644
--- a/internal/msggateway/compressor_test.go
+++ b/internal/msggateway/compressor_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 msggateway
import (
diff --git a/internal/push/offlinepush/dummy/push.go b/internal/push/offlinepush/dummy/push.go
index 2b15bc05d..f147886d9 100644
--- a/internal/push/offlinepush/dummy/push.go
+++ b/internal/push/offlinepush/dummy/push.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 dummy
import (
diff --git a/internal/push/push_rpc_server.go b/internal/push/push_rpc_server.go
index 9e66f8f73..3329fc879 100644
--- a/internal/push/push_rpc_server.go
+++ b/internal/push/push_rpc_server.go
@@ -19,6 +19,8 @@ import (
"github.com/OpenIMSDK/tools/utils"
"sync"
+ "github.com/OpenIMSDK/tools/utils"
+
"google.golang.org/grpc"
"github.com/OpenIMSDK/protocol/constant"
diff --git a/internal/rpc/friend/black.go b/internal/rpc/friend/black.go
index 54cdbb2cc..ed5791c38 100644
--- a/internal/rpc/friend/black.go
+++ b/internal/rpc/friend/black.go
@@ -79,6 +79,7 @@ func (s *friendServer) AddBlack(ctx context.Context, req *pbfriend.AddBlackReq)
BlockUserID: req.BlackUserID,
OperatorUserID: mcontext.GetOpUserID(ctx),
CreateTime: time.Now(),
+ Ex: req.Ex,
}
if err := s.blackDatabase.Create(ctx, []*relation.BlackModel{&black}); err != nil {
return nil, err
diff --git a/internal/rpc/friend/callback.go b/internal/rpc/friend/callback.go
index d541071f5..e5054d9a9 100644
--- a/internal/rpc/friend/callback.go
+++ b/internal/rpc/friend/callback.go
@@ -16,8 +16,10 @@ package friend
import (
"context"
+
pbfriend "github.com/OpenIMSDK/protocol/friend"
"github.com/OpenIMSDK/tools/utils"
+
cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/common/http"
diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go
index 7f22c9d0d..12203aa7e 100644
--- a/internal/rpc/friend/friend.go
+++ b/internal/rpc/friend/friend.go
@@ -407,6 +407,7 @@ func (s *friendServer) GetSpecifiedFriendsInfo(ctx context.Context, req *pbfrien
}
var friendInfo *sdkws.FriendInfo
if friend := friendMap[userID]; friend != nil {
+
friendInfo = &sdkws.FriendInfo{
OwnerUserID: friend.OwnerUserID,
Remark: friend.Remark,
@@ -414,6 +415,7 @@ func (s *friendServer) GetSpecifiedFriendsInfo(ctx context.Context, req *pbfrien
AddSource: friend.AddSource,
OperatorUserID: friend.OperatorUserID,
Ex: friend.Ex,
+ IsPinned: friend.IsPinned,
}
}
var blackInfo *sdkws.BlackInfo
@@ -434,3 +436,35 @@ func (s *friendServer) GetSpecifiedFriendsInfo(ctx context.Context, req *pbfrien
}
return resp, nil
}
+func (s *friendServer) PinFriends(
+ ctx context.Context,
+ req *pbfriend.PinFriendsReq,
+) (*pbfriend.PinFriendsResp, error) {
+ if len(req.FriendUserIDs) == 0 {
+ return nil, errs.ErrArgs.Wrap("friendIDList is empty")
+ }
+ if utils.Duplicate(req.FriendUserIDs) {
+ return nil, errs.ErrArgs.Wrap("friendIDList repeated")
+ }
+ var isPinned bool
+ if req.IsPinned != nil {
+ isPinned = req.IsPinned.Value
+ } else {
+ return nil, errs.ErrArgs.Wrap("isPinned is nil")
+ }
+ //check whther in friend list
+ _, err := s.friendDatabase.FindFriendsWithError(ctx, req.OwnerUserID, req.FriendUserIDs)
+ if err != nil {
+ return nil, err
+ }
+
+ //set friendslist friend pin status to isPinned
+ for _, friendID := range req.FriendUserIDs {
+ if err := s.friendDatabase.UpdateFriendPinStatus(ctx, req.OwnerUserID, friendID, isPinned); err != nil {
+ return nil, err
+ }
+ }
+
+ resp := &pbfriend.PinFriendsResp{}
+ return resp, nil
+}
diff --git a/internal/rpc/group/callback.go b/internal/rpc/group/callback.go
index 1599cc7b4..8779cb89b 100644
--- a/internal/rpc/group/callback.go
+++ b/internal/rpc/group/callback.go
@@ -16,9 +16,10 @@ package group
import (
"context"
- "github.com/OpenIMSDK/tools/log"
"time"
+ "github.com/OpenIMSDK/tools/log"
+
"github.com/OpenIMSDK/protocol/constant"
"github.com/OpenIMSDK/protocol/group"
"github.com/OpenIMSDK/protocol/wrapperspb"
@@ -326,8 +327,6 @@ func CallbackBeforeInviteUserToGroup(ctx context.Context, req *group.InviteUserT
// Handle the scenario where certain members are refused
// You might want to update the req.Members list or handle it as per your business logic
}
- utils.StructFieldNotNilReplace(req, resp)
-
return nil
}
@@ -394,7 +393,10 @@ func CallbackBeforeSetGroupInfo(ctx context.Context, req *group.SetGroupInfoReq)
if resp.ApplyMemberFriend != nil {
req.GroupInfoForSet.ApplyMemberFriend = wrapperspb.Int32(*resp.ApplyMemberFriend)
}
- utils.StructFieldNotNilReplace(req, resp)
+ utils.NotNilReplace(&req.GroupInfoForSet.GroupID, &resp.GroupID)
+ utils.NotNilReplace(&req.GroupInfoForSet.GroupName, &resp.GroupName)
+ utils.NotNilReplace(&req.GroupInfoForSet.FaceURL, &resp.FaceURL)
+ utils.NotNilReplace(&req.GroupInfoForSet.Introduction, &resp.Introduction)
return nil
}
func CallbackAfterSetGroupInfo(ctx context.Context, req *group.SetGroupInfoReq) error {
@@ -425,6 +427,5 @@ func CallbackAfterSetGroupInfo(ctx context.Context, req *group.SetGroupInfoReq)
if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, callbackReq, resp, config.Config.Callback.CallbackAfterSetGroupInfo); err != nil {
return err
}
- utils.StructFieldNotNilReplace(req, resp)
return nil
}
diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go
index 5992ed031..ba129d7e9 100644
--- a/internal/rpc/group/group.go
+++ b/internal/rpc/group/group.go
@@ -17,13 +17,14 @@ package group
import (
"context"
"fmt"
- "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
"math/big"
"math/rand"
"strconv"
"strings"
"time"
+ "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
+
pbconversation "github.com/OpenIMSDK/protocol/conversation"
"github.com/OpenIMSDK/protocol/wrapperspb"
"github.com/OpenIMSDK/tools/tx"
@@ -278,7 +279,6 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbgroup.CreateGroupR
break
}
}
- s.Notification.GroupCreatedNotification(ctx, tips)
if req.GroupInfo.GroupType == constant.SuperGroup {
go func() {
for _, userID := range userIDs {
@@ -802,6 +802,7 @@ func (s *groupServer) JoinGroup(ctx context.Context, req *pbgroup.JoinGroupReq)
GroupType: string(group.GroupType),
ApplyID: req.InviterUserID,
ReqMessage: req.ReqMessage,
+ Ex: req.Ex,
}
if err = CallbackApplyJoinGroupBefore(ctx, reqCall); err != nil {
@@ -848,6 +849,7 @@ func (s *groupServer) JoinGroup(ctx context.Context, req *pbgroup.JoinGroupReq)
JoinSource: req.JoinSource,
ReqTime: time.Now(),
HandledTime: time.Unix(0, 0),
+ Ex: req.Ex,
}
if err := s.db.CreateGroupRequest(ctx, []*relationtb.GroupRequestModel{&groupRequest}); err != nil {
return nil, err
diff --git a/internal/rpc/msg/as_read.go b/internal/rpc/msg/as_read.go
index 49113aa0b..5324ccba8 100644
--- a/internal/rpc/msg/as_read.go
+++ b/internal/rpc/msg/as_read.go
@@ -16,18 +16,18 @@ package msg
import (
"context"
- cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
utils2 "github.com/OpenIMSDK/tools/utils"
"github.com/redis/go-redis/v9"
"github.com/OpenIMSDK/protocol/constant"
- "github.com/OpenIMSDK/protocol/conversation"
"github.com/OpenIMSDK/protocol/msg"
"github.com/OpenIMSDK/protocol/sdkws"
"github.com/OpenIMSDK/tools/errs"
"github.com/OpenIMSDK/tools/log"
+
+ cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
)
func (m *msgServer) GetConversationsHasReadAndMaxSeq(ctx context.Context, req *msg.GetConversationsHasReadAndMaxSeqReq) (resp *msg.GetConversationsHasReadAndMaxSeqResp, err error) {
@@ -92,7 +92,10 @@ func (m *msgServer) SetConversationHasReadSeq(
return &msg.SetConversationHasReadSeqResp{}, nil
}
-func (m *msgServer) MarkMsgsAsRead(ctx context.Context, req *msg.MarkMsgsAsReadReq) (resp *msg.MarkMsgsAsReadResp, err error) {
+func (m *msgServer) MarkMsgsAsRead(
+ ctx context.Context,
+ req *msg.MarkMsgsAsReadReq,
+) (resp *msg.MarkMsgsAsReadResp, err error) {
if len(req.Seqs) < 1 {
return nil, errs.ErrArgs.Wrap("seqs must not be empty")
}
@@ -111,6 +114,7 @@ func (m *msgServer) MarkMsgsAsRead(ctx context.Context, req *msg.MarkMsgsAsReadR
if err = m.MsgDatabase.MarkSingleChatMsgsAsRead(ctx, req.UserID, req.ConversationID, req.Seqs); err != nil {
return
}
+
currentHasReadSeq, err := m.MsgDatabase.GetHasReadSeq(ctx, req.UserID, req.ConversationID)
if err != nil && errs.Unwrap(err) != redis.Nil {
return
@@ -128,7 +132,10 @@ func (m *msgServer) MarkMsgsAsRead(ctx context.Context, req *msg.MarkMsgsAsReadR
return &msg.MarkMsgsAsReadResp{}, nil
}
-func (m *msgServer) MarkConversationAsRead(ctx context.Context, req *msg.MarkConversationAsReadReq) (resp *msg.MarkConversationAsReadResp, err error) {
+func (m *msgServer) MarkConversationAsRead(
+ ctx context.Context,
+ req *msg.MarkConversationAsReadReq,
+) (resp *msg.MarkConversationAsReadResp, err error) {
conversation, err := m.Conversation.GetConversation(ctx, req.UserID, req.ConversationID)
if err != nil {
return nil, err
@@ -137,34 +144,54 @@ func (m *msgServer) MarkConversationAsRead(ctx context.Context, req *msg.MarkCon
if err != nil && errs.Unwrap(err) != redis.Nil {
return nil, err
}
- seqs := generateSeqs(hasReadSeq, req)
+ var seqs []int64
- if len(seqs) > 0 || req.HasReadSeq > hasReadSeq {
- err = m.updateReadStatus(ctx, req, conversation, seqs, hasReadSeq)
- if err != nil {
+ log.ZDebug(ctx, "MarkConversationAsRead", "hasReadSeq", hasReadSeq,
+ "req.HasReadSeq", req.HasReadSeq)
+ if conversation.ConversationType == constant.SingleChatType {
+ for i := hasReadSeq + 1; i <= req.HasReadSeq; i++ {
+ seqs = append(seqs, i)
+ }
+ //avoid client missed call MarkConversationMessageAsRead by order
+ for _, val := range req.Seqs {
+ if !utils2.Contain(val, seqs...) {
+ seqs = append(seqs, val)
+ }
+ }
+ if len(seqs) > 0 {
+ log.ZDebug(ctx, "MarkConversationAsRead", "seqs", seqs, "conversationID", req.ConversationID)
+ if err = m.MsgDatabase.MarkSingleChatMsgsAsRead(ctx, req.UserID, req.ConversationID, seqs); err != nil {
+ return nil, err
+ }
+ }
+ if req.HasReadSeq > hasReadSeq {
+ err = m.MsgDatabase.SetHasReadSeq(ctx, req.UserID, req.ConversationID, req.HasReadSeq)
+ if err != nil {
+ return nil, err
+ }
+ hasReadSeq = req.HasReadSeq
+ }
+ if err = m.sendMarkAsReadNotification(ctx, req.ConversationID, conversation.ConversationType, req.UserID,
+ m.conversationAndGetRecvID(conversation, req.UserID), seqs, hasReadSeq); err != nil {
return nil, err
}
- }
- return &msg.MarkConversationAsReadResp{}, nil
-}
-func generateSeqs(hasReadSeq int64, req *msg.MarkConversationAsReadReq) []int64 {
- var seqs []int64
- for _, val := range req.Seqs {
- if val > hasReadSeq && !utils2.Contain(val, seqs...) {
- seqs = append(seqs, val)
+ } else if conversation.ConversationType == constant.SuperGroupChatType ||
+ conversation.ConversationType == constant.NotificationChatType {
+ if req.HasReadSeq > hasReadSeq {
+ err = m.MsgDatabase.SetHasReadSeq(ctx, req.UserID, req.ConversationID, req.HasReadSeq)
+ if err != nil {
+ return nil, err
+ }
+ hasReadSeq = req.HasReadSeq
}
- }
- return seqs
-}
-
-func (m *msgServer) updateReadStatus(ctx context.Context, req *msg.MarkConversationAsReadReq, conversation *conversation.Conversation, seqs []int64, hasReadSeq int64) error {
- if conversation.ConversationType == constant.SingleChatType && len(seqs) > 0 {
- log.ZDebug(ctx, "MarkConversationAsRead", "seqs", seqs, "conversationID", req.ConversationID)
- if err := m.MsgDatabase.MarkSingleChatMsgsAsRead(ctx, req.UserID, req.ConversationID, seqs); err != nil {
- return err
+ if err = m.sendMarkAsReadNotification(ctx, req.ConversationID, constant.SingleChatType, req.UserID,
+ req.UserID, seqs, hasReadSeq); err != nil {
+ return nil, err
}
+
}
+
reqCall := &cbapi.CallbackGroupMsgReadReq{
SendID: conversation.OwnerUserID,
ReceiveID: req.UserID,
@@ -172,21 +199,10 @@ func (m *msgServer) updateReadStatus(ctx context.Context, req *msg.MarkConversat
ContentType: int64(conversation.ConversationType),
}
if err := CallbackGroupMsgRead(ctx, reqCall); err != nil {
- return err
- }
-
- if req.HasReadSeq > hasReadSeq {
- if err := m.MsgDatabase.SetHasReadSeq(ctx, req.UserID, req.ConversationID, req.HasReadSeq); err != nil {
- return err
- }
- }
-
- recvID := m.conversationAndGetRecvID(conversation, req.UserID)
- if conversation.ConversationType == constant.SuperGroupChatType || conversation.ConversationType == constant.NotificationChatType {
- recvID = req.UserID
+ return nil, err
}
- return m.sendMarkAsReadNotification(ctx, req.ConversationID, conversation.ConversationType, req.UserID, recvID, seqs, req.HasReadSeq)
+ return &msg.MarkConversationAsReadResp{}, nil
}
func (m *msgServer) sendMarkAsReadNotification(
diff --git a/internal/rpc/msg/callback.go b/internal/rpc/msg/callback.go
index 4ce5a5443..3a8587ea3 100644
--- a/internal/rpc/msg/callback.go
+++ b/internal/rpc/msg/callback.go
@@ -16,6 +16,7 @@ package msg
import (
"context"
+
"github.com/OpenIMSDK/protocol/sdkws"
"google.golang.org/protobuf/proto"
@@ -24,6 +25,7 @@ import (
"github.com/OpenIMSDK/tools/log"
"github.com/OpenIMSDK/tools/mcontext"
"github.com/OpenIMSDK/tools/utils"
+
cbapi "github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
@@ -200,6 +202,5 @@ func CallbackAfterRevokeMsg(ctx context.Context, req *pbchat.RevokeMsgReq) error
if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, callbackReq, resp, config.Config.Callback.CallbackAfterRevokeMsg); err != nil {
return err
}
- utils.StructFieldNotNilReplace(req, resp)
return nil
}
diff --git a/internal/rpc/third/log.go b/internal/rpc/third/log.go
index 57d4f536e..11c7467b8 100644
--- a/internal/rpc/third/log.go
+++ b/internal/rpc/third/log.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 third
import (
diff --git a/internal/rpc/third/third.go b/internal/rpc/third/third.go
index 7a63d3526..35df3f925 100644
--- a/internal/rpc/third/third.go
+++ b/internal/rpc/third/third.go
@@ -101,6 +101,16 @@ type thirdServer struct {
defaultExpire time.Duration
}
+func (t *thirdServer) InitiateFormData(ctx context.Context, req *third.InitiateFormDataReq) (*third.InitiateFormDataResp, error) {
+ //TODO implement me
+ panic("implement me")
+}
+
+func (t *thirdServer) CompleteFormData(ctx context.Context, req *third.CompleteFormDataReq) (*third.CompleteFormDataResp, error) {
+ //TODO implement me
+ panic("implement me")
+}
+
func (t *thirdServer) FcmUpdateToken(ctx context.Context, req *third.FcmUpdateTokenReq) (resp *third.FcmUpdateTokenResp, err error) {
err = t.thirdDatabase.FcmUpdateToken(ctx, req.Account, int(req.PlatformID), req.FcmToken, req.ExpireTime)
if err != nil {
diff --git a/internal/rpc/user/callback.go b/internal/rpc/user/callback.go
index e87b4674e..7d865af5f 100644
--- a/internal/rpc/user/callback.go
+++ b/internal/rpc/user/callback.go
@@ -16,6 +16,7 @@ package user
import (
"context"
+
pbuser "github.com/OpenIMSDK/protocol/user"
"github.com/OpenIMSDK/tools/utils"
diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go
index 77da408aa..70e3aebe6 100644
--- a/internal/rpc/user/user.go
+++ b/internal/rpc/user/user.go
@@ -334,3 +334,59 @@ func (s *userServer) GetSubscribeUsersStatus(ctx context.Context,
}
return &pbuser.GetSubscribeUsersStatusResp{StatusList: onlineStatusList}, nil
}
+
+// ProcessUserCommandAdd user general function add
+func (s *userServer) ProcessUserCommandAdd(ctx context.Context, req *pbuser.ProcessUserCommandAddReq) (*pbuser.ProcessUserCommandAddResp, error) {
+ // Assuming you have a method in s.UserDatabase to add a user command
+ err := s.UserDatabase.AddUserCommand(ctx, req.UserID, req.Type, req.Uuid, req.Value)
+ if err != nil {
+ return nil, err
+ }
+
+ return &pbuser.ProcessUserCommandAddResp{}, nil
+}
+
+// ProcessUserCommandDelete user general function delete
+func (s *userServer) ProcessUserCommandDelete(ctx context.Context, req *pbuser.ProcessUserCommandDeleteReq) (*pbuser.ProcessUserCommandDeleteResp, error) {
+ // Assuming you have a method in s.UserDatabase to delete a user command
+ err := s.UserDatabase.DeleteUserCommand(ctx, req.UserID, req.Type, req.Uuid)
+ if err != nil {
+ return nil, err
+ }
+
+ return &pbuser.ProcessUserCommandDeleteResp{}, nil
+}
+
+// ProcessUserCommandUpdate user general function update
+func (s *userServer) ProcessUserCommandUpdate(ctx context.Context, req *pbuser.ProcessUserCommandUpdateReq) (*pbuser.ProcessUserCommandUpdateResp, error) {
+ // Assuming you have a method in s.UserDatabase to update a user command
+ err := s.UserDatabase.UpdateUserCommand(ctx, req.UserID, req.Type, req.Uuid, req.Value)
+ if err != nil {
+ return nil, err
+ }
+
+ return &pbuser.ProcessUserCommandUpdateResp{}, nil
+}
+
+func (s *userServer) ProcessUserCommandGet(ctx context.Context, req *pbuser.ProcessUserCommandGetReq) (*pbuser.ProcessUserCommandGetResp, error) {
+ // Fetch user commands from the database
+ commands, err := s.UserDatabase.GetUserCommands(ctx, req.UserID, req.Type)
+ if err != nil {
+ return nil, err
+ }
+
+ // Initialize commandInfoSlice as an empty slice
+ commandInfoSlice := make([]*pbuser.CommandInfoResp, 0, len(commands))
+
+ for _, command := range commands {
+ // No need to use index since command is already a pointer
+ commandInfoSlice = append(commandInfoSlice, &pbuser.CommandInfoResp{
+ Uuid: command.Uuid,
+ Value: command.Value,
+ CreateTime: command.CreateTime,
+ })
+ }
+
+ // Return the response with the slice
+ return &pbuser.ProcessUserCommandGetResp{KVArray: commandInfoSlice}, nil
+}
diff --git a/internal/tools/cron_task_test.go b/internal/tools/cron_task_test.go
index 1f4f1f5c1..28bc2c945 100644
--- a/internal/tools/cron_task_test.go
+++ b/internal/tools/cron_task_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 tools
import (
diff --git a/pkg/apistruct/msg.go b/pkg/apistruct/msg.go
index 61b4d832b..4b7bd1e6f 100644
--- a/pkg/apistruct/msg.go
+++ b/pkg/apistruct/msg.go
@@ -16,11 +16,11 @@ package apistruct
type PictureBaseInfo struct {
UUID string `mapstructure:"uuid"`
- Type string `mapstructure:"type" validate:"required"`
+ Type string `mapstructure:"type" validate:"required"`
Size int64 `mapstructure:"size"`
- Width int32 `mapstructure:"width" validate:"required"`
+ Width int32 `mapstructure:"width" validate:"required"`
Height int32 `mapstructure:"height" validate:"required"`
- Url string `mapstructure:"url" validate:"required"`
+ Url string `mapstructure:"url" validate:"required"`
}
type PictureElem struct {
@@ -34,28 +34,28 @@ type SoundElem struct {
SoundPath string `mapstructure:"soundPath"`
SourceURL string `mapstructure:"sourceUrl" validate:"required"`
DataSize int64 `mapstructure:"dataSize"`
- Duration int64 `mapstructure:"duration" validate:"required,min=1"`
+ Duration int64 `mapstructure:"duration" validate:"required,min=1"`
}
type VideoElem struct {
- VideoPath string `mapstructure:"videoPath" `
+ VideoPath string `mapstructure:"videoPath"`
VideoUUID string `mapstructure:"videoUUID"`
- VideoURL string `mapstructure:"videoUrl" validate:"required"`
- VideoType string `mapstructure:"videoType" validate:"required"`
- VideoSize int64 `mapstructure:"videoSize" validate:"required"`
- Duration int64 `mapstructure:"duration" validate:"required"`
+ VideoURL string `mapstructure:"videoUrl" validate:"required"`
+ VideoType string `mapstructure:"videoType" validate:"required"`
+ VideoSize int64 `mapstructure:"videoSize" validate:"required"`
+ Duration int64 `mapstructure:"duration" validate:"required"`
SnapshotPath string `mapstructure:"snapshotPath"`
SnapshotUUID string `mapstructure:"snapshotUUID"`
SnapshotSize int64 `mapstructure:"snapshotSize"`
- SnapshotURL string `mapstructure:"snapshotUrl" validate:"required"`
- SnapshotWidth int32 `mapstructure:"snapshotWidth" validate:"required"`
+ SnapshotURL string `mapstructure:"snapshotUrl" validate:"required"`
+ SnapshotWidth int32 `mapstructure:"snapshotWidth" validate:"required"`
SnapshotHeight int32 `mapstructure:"snapshotHeight" validate:"required"`
}
type FileElem struct {
- FilePath string `mapstructure:"filePath" `
+ FilePath string `mapstructure:"filePath"`
UUID string `mapstructure:"uuid"`
SourceURL string `mapstructure:"sourceUrl" validate:"required"`
- FileName string `mapstructure:"fileName" validate:"required"`
- FileSize int64 `mapstructure:"fileSize" validate:"required"`
+ FileName string `mapstructure:"fileName" validate:"required"`
+ FileSize int64 `mapstructure:"fileSize" validate:"required"`
}
type AtElem struct {
Text string `mapstructure:"text"`
@@ -63,9 +63,9 @@ type AtElem struct {
IsAtSelf bool `mapstructure:"isAtSelf"`
}
type LocationElem struct {
- Description string `mapstructure:"description" `
- Longitude float64 `mapstructure:"longitude" validate:"required"`
- Latitude float64 `mapstructure:"latitude" validate:"required"`
+ Description string `mapstructure:"description"`
+ Longitude float64 `mapstructure:"longitude" validate:"required"`
+ Latitude float64 `mapstructure:"latitude" validate:"required"`
}
type CustomElem struct {
Data string `mapstructure:"data" validate:"required"`
@@ -87,7 +87,7 @@ type OANotificationElem struct {
NotificationType int32 `mapstructure:"notificationType" json:"notificationType" validate:"required"`
Text string `mapstructure:"text" json:"text" validate:"required"`
Url string `mapstructure:"url" json:"url"`
- MixType int32 `mapstructure:"mixType" json:"mixType" validate:"required"`
+ MixType int32 `mapstructure:"mixType" json:"mixType" validate:"required"`
PictureElem *PictureElem `mapstructure:"pictureElem" json:"pictureElem"`
SoundElem *SoundElem `mapstructure:"soundElem" json:"soundElem"`
VideoElem *VideoElem `mapstructure:"videoElem" json:"videoElem"`
diff --git a/pkg/callbackstruct/constant.go b/pkg/callbackstruct/constant.go
index 2af337ac6..0a03a1ef1 100644
--- a/pkg/callbackstruct/constant.go
+++ b/pkg/callbackstruct/constant.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 callbackstruct
const CallbackBeforeInviteJoinGroupCommand = "callbackBeforeInviteJoinGroupCommand"
diff --git a/pkg/callbackstruct/group.go b/pkg/callbackstruct/group.go
index 899b4312f..5968f1e55 100644
--- a/pkg/callbackstruct/group.go
+++ b/pkg/callbackstruct/group.go
@@ -148,6 +148,7 @@ type CallbackJoinGroupReq struct {
GroupType string `json:"groupType"`
ApplyID string `json:"applyID"`
ReqMessage string `json:"reqMessage"`
+ Ex string `json:"ex"`
}
type CallbackJoinGroupResp struct {
diff --git a/pkg/callbackstruct/revoke.go b/pkg/callbackstruct/revoke.go
index 364c0162b..1f5e0b0c1 100644
--- a/pkg/callbackstruct/revoke.go
+++ b/pkg/callbackstruct/revoke.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 callbackstruct
type CallbackAfterRevokeMsgReq struct {
diff --git a/pkg/common/cmd/constant.go b/pkg/common/cmd/constant.go
index 835593bbe..c332ce3a6 100644
--- a/pkg/common/cmd/constant.go
+++ b/pkg/common/cmd/constant.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 cmd
const (
diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go
index 5fb8fe7e2..6da89fc8f 100644
--- a/pkg/common/config/config.go
+++ b/pkg/common/config/config.go
@@ -16,6 +16,7 @@ package config
import (
"bytes"
+
"github.com/OpenIMSDK/tools/discoveryregistry"
"gopkg.in/yaml.v3"
)
diff --git a/pkg/common/config/parse.go b/pkg/common/config/parse.go
index 22e458e00..1410a5a4a 100644
--- a/pkg/common/config/parse.go
+++ b/pkg/common/config/parse.go
@@ -35,7 +35,7 @@ const (
DefaultFolderPath = "../config/"
)
-// return absolude path join ../config/, this is k8s container config path
+// return absolude path join ../config/, this is k8s container config path.
func GetDefaultConfigPath() string {
b, err := filepath.Abs(os.Args[0])
if err != nil {
@@ -45,7 +45,7 @@ func GetDefaultConfigPath() string {
return filepath.Join(filepath.Dir(b), "../config/")
}
-// getProjectRoot returns the absolute path of the project root directory
+// getProjectRoot returns the absolute path of the project root directory.
func GetProjectRoot() string {
b, _ := filepath.Abs(os.Args[0])
diff --git a/pkg/common/convert/friend.go b/pkg/common/convert/friend.go
index c81cd98d6..62ce6f95b 100644
--- a/pkg/common/convert/friend.go
+++ b/pkg/common/convert/friend.go
@@ -17,7 +17,6 @@ package convert
import (
"context"
"fmt"
-
"github.com/OpenIMSDK/protocol/sdkws"
"github.com/OpenIMSDK/tools/utils"
@@ -62,6 +61,7 @@ func FriendsDB2Pb(
for _, friendDB := range friendsDB {
userID = append(userID, friendDB.FriendUserID)
}
+
users, err := getUsers(ctx, userID)
if err != nil {
return nil, err
@@ -74,6 +74,7 @@ func FriendsDB2Pb(
friendPb.FriendUser.FaceURL = users[friend.FriendUserID].FaceURL
friendPb.FriendUser.Ex = users[friend.FriendUserID].Ex
friendPb.CreateTime = friend.CreateTime.Unix()
+ friendPb.IsPinned = friend.IsPinned
friendsPb = append(friendsPb, friendPb)
}
return friendsPb, nil
diff --git a/pkg/common/convert/user.go b/pkg/common/convert/user.go
index 0c71aac22..72041a790 100644
--- a/pkg/common/convert/user.go
+++ b/pkg/common/convert/user.go
@@ -15,9 +15,10 @@
package convert
import (
- "github.com/OpenIMSDK/protocol/sdkws"
"time"
+ "github.com/OpenIMSDK/protocol/sdkws"
+
relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation"
)
@@ -63,7 +64,7 @@ func UserPb2DBMap(user *sdkws.UserInfo) map[string]any {
"global_recv_msg_opt": user.GlobalRecvMsgOpt,
}
for key, value := range fields {
- if v, ok := value.(string); ok && v != "" {
+ if v, ok := value.(string); ok {
val[key] = v
} else if v, ok := value.(int32); ok && v != 0 {
val[key] = v
diff --git a/pkg/common/db/cache/group.go b/pkg/common/db/cache/group.go
index 603d8e534..57fcf1a9b 100644
--- a/pkg/common/db/cache/group.go
+++ b/pkg/common/db/cache/group.go
@@ -39,7 +39,7 @@ const (
groupMemberIDsKey = "GROUP_MEMBER_IDS:"
groupMembersHashKey = "GROUP_MEMBERS_HASH2:"
groupMemberInfoKey = "GROUP_MEMBER_INFO:"
- //groupOwnerInfoKey = "GROUP_OWNER_INFO:"
+ //groupOwnerInfoKey = "GROUP_OWNER_INFO:".
joinedGroupsKey = "JOIN_GROUPS_KEY:"
groupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:"
groupRoleLevelMemberIDsKey = "GROUP_ROLE_LEVEL_MEMBER_IDS:"
diff --git a/pkg/common/db/cache/init_redis.go b/pkg/common/db/cache/init_redis.go
index 77b38d9b7..63d2f5707 100644
--- a/pkg/common/db/cache/init_redis.go
+++ b/pkg/common/db/cache/init_redis.go
@@ -18,6 +18,8 @@ import (
"context"
"errors"
"fmt"
+ "os"
+ "strings"
"time"
"github.com/redis/go-redis/v9"
@@ -43,6 +45,9 @@ func NewRedis() (redis.UniversalClient, error) {
return redisClient, nil
}
+ // Read configuration from environment variables
+ overrideConfigFromEnv()
+
if len(config.Config.Redis.Address) == 0 {
return nil, errors.New("redis address is empty")
}
@@ -60,9 +65,9 @@ func NewRedis() (redis.UniversalClient, error) {
rdb = redis.NewClient(&redis.Options{
Addr: config.Config.Redis.Address[0],
Username: config.Config.Redis.Username,
- Password: config.Config.Redis.Password, // no password set
- DB: 0, // use default DB
- PoolSize: 100, // connection pool size
+ Password: config.Config.Redis.Password,
+ DB: 0, // use default DB
+ PoolSize: 100, // connection pool size
MaxRetries: maxRetry,
})
}
@@ -78,3 +83,16 @@ func NewRedis() (redis.UniversalClient, error) {
redisClient = rdb
return rdb, err
}
+
+// overrideConfigFromEnv overrides configuration fields with environment variables if present.
+func overrideConfigFromEnv() {
+ if envAddr := os.Getenv("REDIS_ADDRESS"); envAddr != "" {
+ config.Config.Redis.Address = strings.Split(envAddr, ",") // Assuming addresses are comma-separated
+ }
+ if envUser := os.Getenv("REDIS_USERNAME"); envUser != "" {
+ config.Config.Redis.Username = envUser
+ }
+ if envPass := os.Getenv("REDIS_PASSWORD"); envPass != "" {
+ config.Config.Redis.Password = envPass
+ }
+}
diff --git a/pkg/common/db/cache/msg_test.go b/pkg/common/db/cache/msg_test.go
index 3fddf5965..65413199a 100644
--- a/pkg/common/db/cache/msg_test.go
+++ b/pkg/common/db/cache/msg_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 cache
import (
diff --git a/pkg/common/db/cache/s3.go b/pkg/common/db/cache/s3.go
index ba40ceacc..1e68cedf8 100644
--- a/pkg/common/db/cache/s3.go
+++ b/pkg/common/db/cache/s3.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 cache
import (
diff --git a/pkg/common/db/controller/friend.go b/pkg/common/db/controller/friend.go
index 29b2ef9b1..34ce22295 100644
--- a/pkg/common/db/controller/friend.go
+++ b/pkg/common/db/controller/friend.go
@@ -58,6 +58,7 @@ type FriendDatabase interface {
FindFriendsWithError(ctx context.Context, ownerUserID string, friendUserIDs []string) (friends []*relation.FriendModel, err error)
FindFriendUserIDs(ctx context.Context, ownerUserID string) (friendUserIDs []string, err error)
FindBothFriendRequests(ctx context.Context, fromUserID, toUserID string) (friends []*relation.FriendRequestModel, err error)
+ UpdateFriendPinStatus(ctx context.Context, ownerUserID string, friendUserID string, isPinned bool) (err error)
}
type friendDatabase struct {
@@ -298,3 +299,9 @@ func (f *friendDatabase) FindFriendUserIDs(ctx context.Context, ownerUserID stri
func (f *friendDatabase) FindBothFriendRequests(ctx context.Context, fromUserID, toUserID string) (friends []*relation.FriendRequestModel, err error) {
return f.friendRequest.FindBothFriendRequests(ctx, fromUserID, toUserID)
}
+func (f *friendDatabase) UpdateFriendPinStatus(ctx context.Context, ownerUserID string, friendUserID string, isPinned bool) (err error) {
+ if err := f.friend.UpdatePinStatus(ctx, ownerUserID, friendUserID, isPinned); err != nil {
+ return err
+ }
+ return f.cache.DelFriend(ownerUserID, friendUserID).ExecDel(ctx)
+}
diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go
index ca703b729..433fb7ad3 100644
--- a/pkg/common/db/controller/user.go
+++ b/pkg/common/db/controller/user.go
@@ -68,6 +68,12 @@ type UserDatabase interface {
GetUserStatus(ctx context.Context, userIDs []string) ([]*user.OnlineStatus, error)
// SetUserStatus Set the user status and store the user status in redis
SetUserStatus(ctx context.Context, userID string, status, platformID int32) error
+
+ //CRUD user command
+ AddUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error
+ DeleteUserCommand(ctx context.Context, userID string, Type int32, UUID string) error
+ UpdateUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error
+ GetUserCommands(ctx context.Context, userID string, Type int32) ([]*user.CommandInfoResp, error)
}
type userDatabase struct {
@@ -227,3 +233,16 @@ func (u *userDatabase) GetUserStatus(ctx context.Context, userIDs []string) ([]*
func (u *userDatabase) SetUserStatus(ctx context.Context, userID string, status, platformID int32) error {
return u.cache.SetUserStatus(ctx, userID, status, platformID)
}
+func (u *userDatabase) AddUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error {
+ return u.userDB.AddUserCommand(ctx, userID, Type, UUID, value)
+}
+func (u *userDatabase) DeleteUserCommand(ctx context.Context, userID string, Type int32, UUID string) error {
+ return u.userDB.DeleteUserCommand(ctx, userID, Type, UUID)
+}
+func (u *userDatabase) UpdateUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error {
+ return u.userDB.UpdateUserCommand(ctx, userID, Type, UUID, value)
+}
+func (u *userDatabase) GetUserCommands(ctx context.Context, userID string, Type int32) ([]*user.CommandInfoResp, error) {
+ commands, err := u.userDB.GetUserCommand(ctx, userID, Type)
+ return commands, err
+}
diff --git a/pkg/common/db/mgo/black.go b/pkg/common/db/mgo/black.go
index 6235639aa..1047e5c30 100644
--- a/pkg/common/db/mgo/black.go
+++ b/pkg/common/db/mgo/black.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/conversation.go b/pkg/common/db/mgo/conversation.go
index 72d04ebb3..bf5d1a145 100644
--- a/pkg/common/db/mgo/conversation.go
+++ b/pkg/common/db/mgo/conversation.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/friend.go b/pkg/common/db/mgo/friend.go
index aa9cb0301..667098819 100644
--- a/pkg/common/db/mgo/friend.go
+++ b/pkg/common/db/mgo/friend.go
@@ -1,8 +1,22 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
"context"
-
+ "github.com/OpenIMSDK/tools/errs"
"github.com/OpenIMSDK/tools/mgoutil"
"github.com/OpenIMSDK/tools/pagination"
"go.mongodb.org/mongo-driver/mongo/options"
@@ -129,3 +143,20 @@ func (f *FriendMgo) FindFriendUserIDs(ctx context.Context, ownerUserID string) (
filter := bson.M{"owner_user_id": ownerUserID}
return mgoutil.Find[string](ctx, f.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "friend_user_id": 1}))
}
+
+// UpdatePinStatus update friend's pin status
+func (f *FriendMgo) UpdatePinStatus(ctx context.Context, ownerUserID string, friendUserID string, isPinned bool) (err error) {
+
+ filter := bson.M{"owner_user_id": ownerUserID, "friend_user_id": friendUserID}
+ // Create an update operation to set the "is_pinned" field to isPinned for all documents.
+ update := bson.M{"$set": bson.M{"is_pinned": isPinned}}
+
+ // Perform the update operation for all documents in the collection.
+ _, err = f.coll.UpdateMany(ctx, filter, update)
+
+ if err != nil {
+ return errs.Wrap(err, "update pin error")
+ }
+
+ return nil
+}
diff --git a/pkg/common/db/mgo/friend_request.go b/pkg/common/db/mgo/friend_request.go
index c1be87ca2..bfc101917 100644
--- a/pkg/common/db/mgo/friend_request.go
+++ b/pkg/common/db/mgo/friend_request.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/group.go b/pkg/common/db/mgo/group.go
index 3553b6b56..65dbbca59 100644
--- a/pkg/common/db/mgo/group.go
+++ b/pkg/common/db/mgo/group.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/group_member.go b/pkg/common/db/mgo/group_member.go
index ed09a028b..8c3041901 100644
--- a/pkg/common/db/mgo/group_member.go
+++ b/pkg/common/db/mgo/group_member.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/group_request.go b/pkg/common/db/mgo/group_request.go
index e88a39bf5..cb04d2308 100644
--- a/pkg/common/db/mgo/group_request.go
+++ b/pkg/common/db/mgo/group_request.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/log.go b/pkg/common/db/mgo/log.go
index aa280fcf2..09f002ee3 100644
--- a/pkg/common/db/mgo/log.go
+++ b/pkg/common/db/mgo/log.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/object.go b/pkg/common/db/mgo/object.go
index 5976b2d28..88bfde213 100644
--- a/pkg/common/db/mgo/object.go
+++ b/pkg/common/db/mgo/object.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
diff --git a/pkg/common/db/mgo/user.go b/pkg/common/db/mgo/user.go
index 4a53cb3c4..268d69ce3 100644
--- a/pkg/common/db/mgo/user.go
+++ b/pkg/common/db/mgo/user.go
@@ -1,7 +1,22 @@
+// Copyright © 2023 OpenIM. 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 mgo
import (
"context"
+ "github.com/OpenIMSDK/protocol/user"
"time"
"github.com/OpenIMSDK/tools/mgoutil"
@@ -73,6 +88,78 @@ func (u *UserMgo) CountTotal(ctx context.Context, before *time.Time) (count int6
return mgoutil.Count(ctx, u.coll, bson.M{"create_time": bson.M{"$lt": before}})
}
+func (u *UserMgo) AddUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error {
+ collection := u.coll.Database().Collection("userCommands")
+
+ // Create a new document instead of updating an existing one
+ doc := bson.M{
+ "userID": userID,
+ "type": Type,
+ "uuid": UUID,
+ "createTime": time.Now().Unix(), // assuming you want the creation time in Unix timestamp
+ "value": value,
+ }
+
+ _, err := collection.InsertOne(ctx, doc)
+ return err
+}
+func (u *UserMgo) DeleteUserCommand(ctx context.Context, userID string, Type int32, UUID string) error {
+ collection := u.coll.Database().Collection("userCommands")
+
+ filter := bson.M{"userID": userID, "type": Type, "uuid": UUID}
+
+ _, err := collection.DeleteOne(ctx, filter)
+ return err
+}
+func (u *UserMgo) UpdateUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error {
+ collection := u.coll.Database().Collection("userCommands")
+
+ filter := bson.M{"userID": userID, "type": Type, "uuid": UUID}
+ update := bson.M{"$set": bson.M{"value": value}}
+
+ _, err := collection.UpdateOne(ctx, filter, update)
+ return err
+}
+func (u *UserMgo) GetUserCommand(ctx context.Context, userID string, Type int32) ([]*user.CommandInfoResp, error) {
+ collection := u.coll.Database().Collection("userCommands")
+ filter := bson.M{"userID": userID, "type": Type}
+
+ cursor, err := collection.Find(ctx, filter)
+ if err != nil {
+ return nil, err
+ }
+ defer cursor.Close(ctx)
+
+ // Initialize commands as a slice of pointers
+ commands := []*user.CommandInfoResp{}
+
+ for cursor.Next(ctx) {
+ var document struct {
+ UUID string `bson:"uuid"`
+ Value string `bson:"value"`
+ CreateTime int64 `bson:"createTime"`
+ }
+
+ if err := cursor.Decode(&document); err != nil {
+ return nil, err
+ }
+
+ commandInfo := &user.CommandInfoResp{ // Change here: use a pointer to the struct
+ Uuid: document.UUID,
+ Value: document.Value,
+ CreateTime: document.CreateTime,
+ }
+
+ commands = append(commands, commandInfo)
+ }
+
+ if err := cursor.Err(); err != nil {
+ return nil, err
+ }
+
+ return commands, nil
+}
+
func (u *UserMgo) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) {
pipeline := bson.A{
bson.M{
diff --git a/pkg/common/db/s3/cos/internal.go b/pkg/common/db/s3/cos/internal.go
index 02afde684..064546953 100644
--- a/pkg/common/db/s3/cos/internal.go
+++ b/pkg/common/db/s3/cos/internal.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 cos
import (
diff --git a/pkg/common/db/s3/minio/internal.go b/pkg/common/db/s3/minio/internal.go
index 41129ce31..7e9dcd9e4 100644
--- a/pkg/common/db/s3/minio/internal.go
+++ b/pkg/common/db/s3/minio/internal.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 minio
import (
diff --git a/pkg/common/db/s3/minio/thumbnail.go b/pkg/common/db/s3/minio/thumbnail.go
index 01b14541b..49c376c9f 100644
--- a/pkg/common/db/s3/minio/thumbnail.go
+++ b/pkg/common/db/s3/minio/thumbnail.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 minio
import (
diff --git a/pkg/common/db/table/relation/friend.go b/pkg/common/db/table/relation/friend.go
index 75dbea850..4f85998f4 100644
--- a/pkg/common/db/table/relation/friend.go
+++ b/pkg/common/db/table/relation/friend.go
@@ -30,6 +30,7 @@ type FriendModel struct {
AddSource int32 `bson:"add_source"`
OperatorUserID string `bson:"operator_user_id"`
Ex string `bson:"ex"`
+ IsPinned bool `bson:"is_pinned"`
}
// FriendModelInterface defines the operations for managing friends in MongoDB.
@@ -56,4 +57,6 @@ type FriendModelInterface interface {
FindInWhoseFriends(ctx context.Context, friendUserID string, pagination pagination.Pagination) (total int64, friends []*FriendModel, err error)
// FindFriendUserIDs retrieves a list of friend user IDs for a given owner.
FindFriendUserIDs(ctx context.Context, ownerUserID string) (friendUserIDs []string, err error)
+ // UpdatePinStatus update friend's pin status
+ UpdatePinStatus(ctx context.Context, ownerUserID string, friendUserID string, isPinned bool) (err error)
}
diff --git a/pkg/common/db/table/relation/log.go b/pkg/common/db/table/relation/log.go
index f690ff8aa..ba63c0c2b 100644
--- a/pkg/common/db/table/relation/log.go
+++ b/pkg/common/db/table/relation/log.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 relation
import (
diff --git a/pkg/common/db/table/relation/user.go b/pkg/common/db/table/relation/user.go
index 1f26d751f..213a6b774 100644
--- a/pkg/common/db/table/relation/user.go
+++ b/pkg/common/db/table/relation/user.go
@@ -16,6 +16,7 @@ package relation
import (
"context"
+ "github.com/OpenIMSDK/protocol/user"
"time"
"github.com/OpenIMSDK/tools/pagination"
@@ -60,4 +61,9 @@ type UserModelInterface interface {
CountTotal(ctx context.Context, before *time.Time) (count int64, err error)
// 获取范围内用户增量
CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error)
+ //CRUD user command
+ AddUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error
+ DeleteUserCommand(ctx context.Context, userID string, Type int32, UUID string) error
+ UpdateUserCommand(ctx context.Context, userID string, Type int32, UUID string, value string) error
+ GetUserCommand(ctx context.Context, userID string, Type int32) ([]*user.CommandInfoResp, error)
}
diff --git a/pkg/common/db/unrelation/mongo.go b/pkg/common/db/unrelation/mongo.go
index 38a335567..2c1dc6f38 100644
--- a/pkg/common/db/unrelation/mongo.go
+++ b/pkg/common/db/unrelation/mongo.go
@@ -17,11 +17,11 @@ package unrelation
import (
"context"
"fmt"
+ "os"
"strings"
"time"
"go.mongodb.org/mongo-driver/bson"
-
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
@@ -34,7 +34,8 @@ import (
)
const (
- maxRetry = 10 // number of retries
+ maxRetry = 10 // number of retries
+ mongoConnTimeout = 10 * time.Second
)
type Mongo struct {
@@ -44,90 +45,122 @@ type Mongo struct {
// NewMongo Initialize MongoDB connection.
func NewMongo() (*Mongo, error) {
specialerror.AddReplace(mongo.ErrNoDocuments, errs.ErrRecordNotFound)
- uri := "mongodb://sample.host:27017/?maxPoolSize=20&w=majority"
- if config.Config.Mongo.Uri != "" {
- uri = config.Config.Mongo.Uri
- } else {
- mongodbHosts := ""
- for i, v := range config.Config.Mongo.Address {
- if i == len(config.Config.Mongo.Address)-1 {
- mongodbHosts += v
- } else {
- mongodbHosts += v + ","
- }
- }
- if config.Config.Mongo.Password != "" && config.Config.Mongo.Username != "" {
- uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin",
- config.Config.Mongo.Username, config.Config.Mongo.Password, mongodbHosts,
- config.Config.Mongo.Database, config.Config.Mongo.MaxPoolSize)
- } else {
- uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin",
- mongodbHosts, config.Config.Mongo.Database,
- config.Config.Mongo.MaxPoolSize)
- }
- }
- fmt.Println("mongo:", uri)
+ uri := buildMongoURI()
+
var mongoClient *mongo.Client
- var err error = nil
+ var err error
+
+ // Retry connecting to MongoDB
for i := 0; i <= maxRetry; i++ {
- ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+ ctx, cancel := context.WithTimeout(context.Background(), mongoConnTimeout)
defer cancel()
mongoClient, err = mongo.Connect(ctx, options.Client().ApplyURI(uri))
if err == nil {
return &Mongo{db: mongoClient}, nil
}
- if cmdErr, ok := err.(mongo.CommandError); ok {
- if cmdErr.Code == 13 || cmdErr.Code == 18 {
- return nil, err
- } else {
- fmt.Printf("Failed to connect to MongoDB: %s\n", err)
- }
+ if shouldRetry(err) {
+ fmt.Printf("Failed to connect to MongoDB, retrying: %s\n", err)
+ time.Sleep(time.Second) // exponential backoff could be implemented here
+ continue
}
+ return nil, err
}
return nil, err
}
+func buildMongoURI() string {
+ uri := os.Getenv("MONGO_URI")
+ if uri != "" {
+ return uri
+ }
+
+ username := os.Getenv("MONGO_USERNAME")
+ password := os.Getenv("MONGO_PASSWORD")
+ address := os.Getenv("MONGO_ADDRESS")
+ port := os.Getenv("MONGO_PORT")
+ database := os.Getenv("MONGO_DATABASE")
+ maxPoolSize := os.Getenv("MONGO_MAX_POOL_SIZE")
+
+ if username == "" {
+ username = config.Config.Mongo.Username
+ }
+ if password == "" {
+ password = config.Config.Mongo.Password
+ }
+ if address == "" {
+ address = strings.Join(config.Config.Mongo.Address, ",")
+ } else if port != "" {
+ address = fmt.Sprintf("%s:%s", address, port)
+ }
+ if database == "" {
+ database = config.Config.Mongo.Database
+ }
+ if maxPoolSize == "" {
+ maxPoolSize = fmt.Sprint(config.Config.Mongo.MaxPoolSize)
+ }
+
+ uriFormat := "mongodb://%s/%s?maxPoolSize=%s&authSource=admin"
+ if username != "" && password != "" {
+ uriFormat = "mongodb://%s:%s@%s/%s?maxPoolSize=%s&authSource=admin"
+ return fmt.Sprintf(uriFormat, username, password, address, database, maxPoolSize)
+ }
+ return fmt.Sprintf(uriFormat, address, database, maxPoolSize)
+}
+
+func shouldRetry(err error) bool {
+ if cmdErr, ok := err.(mongo.CommandError); ok {
+ return cmdErr.Code != 13 && cmdErr.Code != 18
+ }
+ return true
+}
+
+// GetClient returns the MongoDB client.
func (m *Mongo) GetClient() *mongo.Client {
return m.db
}
+// GetDatabase returns the specific database from MongoDB.
func (m *Mongo) GetDatabase() *mongo.Database {
return m.db.Database(config.Config.Mongo.Database)
}
+// CreateMsgIndex creates an index for messages in MongoDB.
func (m *Mongo) CreateMsgIndex() error {
return m.createMongoIndex(unrelation.Msg, true, "doc_id")
}
+// createMongoIndex creates an index in a MongoDB collection.
func (m *Mongo) createMongoIndex(collection string, isUnique bool, keys ...string) error {
- db := m.db.Database(config.Config.Mongo.Database).Collection(collection)
+ db := m.GetDatabase().Collection(collection)
opts := options.CreateIndexes().SetMaxTime(10 * time.Second)
indexView := db.Indexes()
- keysDoc := bson.D{}
- // create composite indexes
- for _, key := range keys {
- if strings.HasPrefix(key, "-") {
- keysDoc = append(keysDoc, bson.E{Key: strings.TrimLeft(key, "-"), Value: -1})
- // keysDoc = keysDoc.Append(strings.TrimLeft(key, "-"), bsonx.Int32(-1))
- } else {
- keysDoc = append(keysDoc, bson.E{Key: key, Value: 1})
- // keysDoc = keysDoc.Append(key, bsonx.Int32(1))
- }
- }
- // create index
+
+ keysDoc := buildIndexKeys(keys)
+
index := mongo.IndexModel{
Keys: keysDoc,
}
if isUnique {
index.Options = options.Index().SetUnique(true)
}
- result, err := indexView.CreateOne(
- context.Background(),
- index,
- opts,
- )
+
+ _, err := indexView.CreateOne(context.Background(), index, opts)
if err != nil {
- return utils.Wrap(err, result)
+ return utils.Wrap(err, "CreateIndex")
}
return nil
}
+
+// buildIndexKeys builds the BSON document for index keys.
+func buildIndexKeys(keys []string) bson.D {
+ keysDoc := bson.D{}
+ for _, key := range keys {
+ direction := 1 // default direction is ascending
+ if strings.HasPrefix(key, "-") {
+ direction = -1 // descending order for prefixed with "-"
+ key = strings.TrimLeft(key, "-")
+ }
+ keysDoc = append(keysDoc, bson.E{Key: key, Value: direction})
+ }
+ return keysDoc
+}
diff --git a/pkg/common/discoveryregister/discoveryregister.go b/pkg/common/discoveryregister/discoveryregister.go
index c204184ff..c14323027 100644
--- a/pkg/common/discoveryregister/discoveryregister.go
+++ b/pkg/common/discoveryregister/discoveryregister.go
@@ -1,93 +1,42 @@
+// Copyright © 2023 OpenIM. 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 discoveryregister
import (
- "context"
"errors"
- "fmt"
- "time"
+ "os"
- "github.com/OpenIMSDK/tools/discoveryregistry"
- openkeeper "github.com/OpenIMSDK/tools/discoveryregistry/zookeeper"
- "github.com/OpenIMSDK/tools/log"
- "google.golang.org/grpc"
+ "github.com/openimsdk/open-im-server/v3/pkg/common/discoveryregister/kubernetes"
+ "github.com/openimsdk/open-im-server/v3/pkg/common/discoveryregister/zookeeper"
- "github.com/openimsdk/open-im-server/v3/pkg/common/config"
+ "github.com/OpenIMSDK/tools/discoveryregistry"
)
+// NewDiscoveryRegister creates a new service discovery and registry client based on the provided environment type.
func NewDiscoveryRegister(envType string) (discoveryregistry.SvcDiscoveryRegistry, error) {
- var client discoveryregistry.SvcDiscoveryRegistry
- var err error
+
+ if os.Getenv("ENVS_DISCOVERY") != "" {
+ envType = os.Getenv("ENVS_DISCOVERY")
+ }
+
switch envType {
case "zookeeper":
- client, err = openkeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema,
- openkeeper.WithFreq(time.Hour), openkeeper.WithUserNameAndPassword(
- config.Config.Zookeeper.Username,
- config.Config.Zookeeper.Password,
- ), openkeeper.WithRoundRobin(), openkeeper.WithTimeout(10), openkeeper.WithLogger(log.NewZkLogger()))
+ return zookeeper.NewZookeeperDiscoveryRegister()
case "k8s":
- client, err = NewK8sDiscoveryRegister()
+ return kubernetes.NewK8sDiscoveryRegister()
default:
- client = nil
- err = errors.New("envType not correct")
+ return nil, errors.New("envType not correct")
}
- return client, err
-}
-
-type K8sDR struct {
- options []grpc.DialOption
- rpcRegisterAddr string
-}
-
-func NewK8sDiscoveryRegister() (discoveryregistry.SvcDiscoveryRegistry, error) {
- return &K8sDR{}, nil
-}
-
-func (cli *K8sDR) Register(serviceName, host string, port int, opts ...grpc.DialOption) error {
- cli.rpcRegisterAddr = serviceName
- return nil
-}
-func (cli *K8sDR) UnRegister() error {
-
- return nil
-}
-func (cli *K8sDR) CreateRpcRootNodes(serviceNames []string) error {
-
- return nil
-}
-func (cli *K8sDR) RegisterConf2Registry(key string, conf []byte) error {
-
- return nil
-}
-
-func (cli *K8sDR) GetConfFromRegistry(key string) ([]byte, error) {
-
- return nil, nil
-}
-func (cli *K8sDR) GetConns(ctx context.Context, serviceName string, opts ...grpc.DialOption) ([]*grpc.ClientConn, error) {
-
- conn, err := grpc.DialContext(ctx, serviceName, append(cli.options, opts...)...)
- return []*grpc.ClientConn{conn}, err
-}
-func (cli *K8sDR) GetConn(ctx context.Context, serviceName string, opts ...grpc.DialOption) (*grpc.ClientConn, error) {
-
- return grpc.DialContext(ctx, serviceName, append(cli.options, opts...)...)
-}
-func (cli *K8sDR) GetSelfConnTarget() string {
-
- return cli.rpcRegisterAddr
-}
-func (cli *K8sDR) AddOption(opts ...grpc.DialOption) {
- cli.options = append(cli.options, opts...)
-}
-func (cli *K8sDR) CloseConn(conn *grpc.ClientConn) {
- conn.Close()
-}
-
-// do not use this method for call rpc
-func (cli *K8sDR) GetClientLocalConns() map[string][]*grpc.ClientConn {
- fmt.Println("should not call this function!!!!!!!!!!!!!!!!!!!!!!!!!")
- return nil
-}
-func (cli *K8sDR) Close() {
- return
}
diff --git a/pkg/common/discoveryregister/discoveryregister_test.go b/pkg/common/discoveryregister/discoveryregister_test.go
index 8426598f9..d4a634b91 100644
--- a/pkg/common/discoveryregister/discoveryregister_test.go
+++ b/pkg/common/discoveryregister/discoveryregister_test.go
@@ -1,407 +1,59 @@
+// Copyright © 2023 OpenIM. 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 discoveryregister
import (
- "context"
- "reflect"
+ "os"
"testing"
"github.com/OpenIMSDK/tools/discoveryregistry"
- "google.golang.org/grpc"
+ "github.com/stretchr/testify/assert"
)
-func TestNewDiscoveryRegister(t *testing.T) {
- type args struct {
- envType string
- }
- tests := []struct {
- name string
- args args
- want discoveryregistry.SvcDiscoveryRegistry
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- got, err := NewDiscoveryRegister(tt.args.envType)
- if (err != nil) != tt.wantErr {
- t.Errorf("NewDiscoveryRegister() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("NewDiscoveryRegister() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-func TestNewK8sDiscoveryRegister(t *testing.T) {
- tests := []struct {
- name string
- want discoveryregistry.SvcDiscoveryRegistry
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- got, err := NewK8sDiscoveryRegister()
- if (err != nil) != tt.wantErr {
- t.Errorf("NewK8sDiscoveryRegister() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("NewK8sDiscoveryRegister() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-func TestK8sDR_Register(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- serviceName string
- host string
- port int
- opts []grpc.DialOption
- }
- tests := []struct {
- name string
- fields fields
- args args
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- if err := cli.Register(tt.args.serviceName, tt.args.host, tt.args.port, tt.args.opts...); (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.Register() error = %v, wantErr %v", err, tt.wantErr)
- }
- })
- }
-}
-
-func TestK8sDR_UnRegister(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- tests := []struct {
- name string
- fields fields
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- if err := cli.UnRegister(); (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.UnRegister() error = %v, wantErr %v", err, tt.wantErr)
- }
- })
- }
-}
-
-func TestK8sDR_CreateRpcRootNodes(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- serviceNames []string
- }
- tests := []struct {
- name string
- fields fields
- args args
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- if err := cli.CreateRpcRootNodes(tt.args.serviceNames); (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.CreateRpcRootNodes() error = %v, wantErr %v", err, tt.wantErr)
- }
- })
- }
-}
-
-func TestK8sDR_RegisterConf2Registry(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- key string
- conf []byte
- }
- tests := []struct {
- name string
- fields fields
- args args
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- if err := cli.RegisterConf2Registry(tt.args.key, tt.args.conf); (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.RegisterConf2Registry() error = %v, wantErr %v", err, tt.wantErr)
- }
- })
- }
-}
-
-func TestK8sDR_GetConfFromRegistry(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- key string
- }
- tests := []struct {
- name string
- fields fields
- args args
- want []byte
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- got, err := cli.GetConfFromRegistry(tt.args.key)
- if (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.GetConfFromRegistry() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("K8sDR.GetConfFromRegistry() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-func TestK8sDR_GetConns(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- ctx context.Context
- serviceName string
- opts []grpc.DialOption
- }
- tests := []struct {
- name string
- fields fields
- args args
- want []*grpc.ClientConn
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- got, err := cli.GetConns(tt.args.ctx, tt.args.serviceName, tt.args.opts...)
- if (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.GetConns() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("K8sDR.GetConns() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-func TestK8sDR_GetConn(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- ctx context.Context
- serviceName string
- opts []grpc.DialOption
- }
- tests := []struct {
- name string
- fields fields
- args args
- want *grpc.ClientConn
- wantErr bool
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- got, err := cli.GetConn(tt.args.ctx, tt.args.serviceName, tt.args.opts...)
- if (err != nil) != tt.wantErr {
- t.Errorf("K8sDR.GetConn() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("K8sDR.GetConn() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-func TestK8sDR_GetSelfConnTarget(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- tests := []struct {
- name string
- fields fields
- want string
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- if got := cli.GetSelfConnTarget(); got != tt.want {
- t.Errorf("K8sDR.GetSelfConnTarget() = %v, want %v", got, tt.want)
- }
- })
- }
+func setupTestEnvironment() {
+ os.Setenv("ZOOKEEPER_SCHEMA", "openim")
+ os.Setenv("ZOOKEEPER_ADDRESS", "172.28.0.1:12181")
+ os.Setenv("ZOOKEEPER_USERNAME", "")
+ os.Setenv("ZOOKEEPER_PASSWORD", "")
}
-func TestK8sDR_AddOption(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- opts []grpc.DialOption
- }
- tests := []struct {
- name string
- fields fields
- args args
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- cli.AddOption(tt.args.opts...)
- })
- }
-}
+func TestNewDiscoveryRegister(t *testing.T) {
+ setupTestEnvironment()
-func TestK8sDR_CloseConn(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- type args struct {
- conn *grpc.ClientConn
- }
tests := []struct {
- name string
- fields fields
- args args
+ envType string
+ expectedError bool
+ expectedResult bool
}{
- // TODO: Add test cases.
+ {"zookeeper", false, true},
+ {"k8s", false, true}, // 假设 k8s 配置也已正确设置
+ {"invalid", true, false},
}
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- cli.CloseConn(tt.args.conn)
- })
- }
-}
-func TestK8sDR_GetClientLocalConns(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- tests := []struct {
- name string
- fields fields
- want map[string][]*grpc.ClientConn
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
- }
- if got := cli.GetClientLocalConns(); !reflect.DeepEqual(got, tt.want) {
- t.Errorf("K8sDR.GetClientLocalConns() = %v, want %v", got, tt.want)
- }
- })
- }
-}
+ for _, test := range tests {
+ client, err := NewDiscoveryRegister(test.envType)
-func TestK8sDR_Close(t *testing.T) {
- type fields struct {
- options []grpc.DialOption
- rpcRegisterAddr string
- }
- tests := []struct {
- name string
- fields fields
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- cli := &K8sDR{
- options: tt.fields.options,
- rpcRegisterAddr: tt.fields.rpcRegisterAddr,
+ if test.expectedError {
+ assert.Error(t, err)
+ } else {
+ assert.NoError(t, err)
+ if test.expectedResult {
+ assert.Implements(t, (*discoveryregistry.SvcDiscoveryRegistry)(nil), client)
+ } else {
+ assert.Nil(t, client)
}
- cli.Close()
- })
+ }
}
}
diff --git a/pkg/common/discoveryregister/kubernetes/kubernetes.go b/pkg/common/discoveryregister/kubernetes/kubernetes.go
new file mode 100644
index 000000000..cd5fb0a36
--- /dev/null
+++ b/pkg/common/discoveryregister/kubernetes/kubernetes.go
@@ -0,0 +1,174 @@
+// Copyright © 2023 OpenIM. 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 kubernetes
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "os"
+ "strconv"
+ "strings"
+
+ "google.golang.org/grpc"
+
+ "github.com/OpenIMSDK/tools/discoveryregistry"
+ "github.com/OpenIMSDK/tools/log"
+ "github.com/openimsdk/open-im-server/v3/pkg/common/config"
+)
+
+// K8sDR represents the Kubernetes service discovery and registration client.
+type K8sDR struct {
+ options []grpc.DialOption
+ rpcRegisterAddr string
+}
+
+// NewK8sDiscoveryRegister creates a new instance of K8sDR for Kubernetes service discovery and registration.
+func NewK8sDiscoveryRegister() (discoveryregistry.SvcDiscoveryRegistry, error) {
+
+ return &K8sDR{}, nil
+}
+
+// Register registers a service with Kubernetes.
+func (cli *K8sDR) Register(serviceName, host string, port int, opts ...grpc.DialOption) error {
+ if serviceName != config.Config.RpcRegisterName.OpenImMessageGatewayName {
+ cli.rpcRegisterAddr = serviceName
+ } else {
+ cli.rpcRegisterAddr = cli.getSelfHost(context.Background())
+ }
+
+ return nil
+}
+
+// UnRegister removes a service registration from Kubernetes.
+func (cli *K8sDR) UnRegister() error {
+
+ return nil
+}
+
+// CreateRpcRootNodes creates root nodes for RPC in Kubernetes.
+func (cli *K8sDR) CreateRpcRootNodes(serviceNames []string) error {
+
+ return nil
+}
+
+// RegisterConf2Registry registers a configuration to the registry.
+func (cli *K8sDR) RegisterConf2Registry(key string, conf []byte) error {
+
+ return nil
+}
+
+// GetConfFromRegistry retrieves a configuration from the registry.
+func (cli *K8sDR) GetConfFromRegistry(key string) ([]byte, error) {
+ return nil, nil
+}
+
+func (cli *K8sDR) getSelfHost(ctx context.Context) string {
+ port := 88
+ instance := "openimserver"
+ selfPodName := os.Getenv("MY_POD_NAME")
+ ns := os.Getenv("MY_POD_NAMESPACE")
+ statefuleIndex := 0
+ gatewayEnds := strings.Split(config.Config.RpcRegisterName.OpenImMessageGatewayName, ":")
+ if len(gatewayEnds) != 2 {
+ log.ZError(ctx, "msggateway RpcRegisterName is error:config.Config.RpcRegisterName.OpenImMessageGatewayName", errors.New("config error"))
+ } else {
+ port, _ = strconv.Atoi(gatewayEnds[1])
+ }
+ podInfo := strings.Split(selfPodName, "-")
+ instance = podInfo[0]
+ count := len(podInfo)
+ statefuleIndex, _ = strconv.Atoi(podInfo[count-1])
+ host := fmt.Sprintf("%s-openim-msggateway-%d.%s-openim-msggateway-headless.%s.svc.cluster.local:%d", instance, statefuleIndex, instance, ns, port)
+ return host
+}
+
+// GetConns returns a list of gRPC client connections for a given service.
+func (cli *K8sDR) GetConns(ctx context.Context, serviceName string, opts ...grpc.DialOption) ([]*grpc.ClientConn, error) {
+ if serviceName != config.Config.RpcRegisterName.OpenImMessageGatewayName {
+ conn, err := grpc.DialContext(ctx, serviceName, append(cli.options, opts...)...)
+ return []*grpc.ClientConn{conn}, err
+ }
+ var ret []*grpc.ClientConn
+ gatewayHosts := cli.getMsgGatewayHost(ctx)
+ for _, host := range gatewayHosts {
+ conn, err := grpc.DialContext(ctx, host, append(cli.options, opts...)...)
+ if err != nil {
+ return nil, err
+ }
+ ret = append(ret, conn)
+ }
+ return ret, nil
+}
+
+// like openimserver-openim-msggateway-0.openimserver-openim-msggateway-headless.openim-lin.svc.cluster.local:88
+func (cli *K8sDR) getMsgGatewayHost(ctx context.Context) []string {
+ port := 88
+ instance := "openimserver"
+ selfPodName := os.Getenv("MY_POD_NAME")
+ replicas := os.Getenv("MY_MSGGATEWAY_REPLICACOUNT")
+ ns := os.Getenv("MY_POD_NAMESPACE")
+ gatewayEnds := strings.Split(config.Config.RpcRegisterName.OpenImMessageGatewayName, ":")
+ if len(gatewayEnds) != 2 {
+ log.ZError(ctx, "msggateway RpcRegisterName is error:config.Config.RpcRegisterName.OpenImMessageGatewayName", errors.New("config error"))
+ } else {
+ port, _ = strconv.Atoi(gatewayEnds[1])
+ }
+ nReplicas, _ := strconv.Atoi(replicas)
+ podInfo := strings.Split(selfPodName, "-")
+ instance = podInfo[0]
+ var ret []string
+ for i := 0; i < nReplicas; i++ {
+ host := fmt.Sprintf("%s-openim-msggateway-%d.%s-openim-msggateway-headless.%s.svc.cluster.local:%d", instance, i, instance, ns, port)
+ ret = append(ret, host)
+ }
+ log.ZInfo(ctx, "getMsgGatewayHost", "instance", instance, "selfPodName", selfPodName, "replicas", replicas, "ns", ns, "ret", ret)
+
+ return ret
+}
+
+// GetConn returns a single gRPC client connection for a given service.
+func (cli *K8sDR) GetConn(ctx context.Context, serviceName string, opts ...grpc.DialOption) (*grpc.ClientConn, error) {
+ return grpc.DialContext(ctx, serviceName, append(cli.options, opts...)...)
+}
+
+// GetSelfConnTarget returns the connection target of the client itself.
+func (cli *K8sDR) GetSelfConnTarget() string {
+ return cli.rpcRegisterAddr
+}
+
+// AddOption adds gRPC dial options to the client.
+func (cli *K8sDR) AddOption(opts ...grpc.DialOption) {
+ cli.options = append(cli.options, opts...)
+}
+
+// CloseConn closes a given gRPC client connection.
+func (cli *K8sDR) CloseConn(conn *grpc.ClientConn) {
+ conn.Close()
+}
+
+// do not use this method for call rpc.
+func (cli *K8sDR) GetClientLocalConns() map[string][]*grpc.ClientConn {
+ fmt.Println("should not call this function!!!!!!!!!!!!!!!!!!!!!!!!!")
+
+ return nil
+}
+
+// Close closes the K8sDR client.
+func (cli *K8sDR) Close() {
+
+ // Close any open resources here (if applicable)
+ return
+}
diff --git a/pkg/common/discoveryregister/zookeeper/zookeeper.go b/pkg/common/discoveryregister/zookeeper/zookeeper.go
new file mode 100644
index 000000000..a4edffc43
--- /dev/null
+++ b/pkg/common/discoveryregister/zookeeper/zookeeper.go
@@ -0,0 +1,61 @@
+// Copyright © 2023 OpenIM. 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 zookeeper
+
+import (
+ "os"
+ "strings"
+ "time"
+
+ "github.com/OpenIMSDK/tools/discoveryregistry"
+ openkeeper "github.com/OpenIMSDK/tools/discoveryregistry/zookeeper"
+ "github.com/OpenIMSDK/tools/log"
+
+ "github.com/openimsdk/open-im-server/v3/pkg/common/config"
+)
+
+// NewZookeeperDiscoveryRegister creates a new instance of ZookeeperDR for Zookeeper service discovery and registration.
+func NewZookeeperDiscoveryRegister() (discoveryregistry.SvcDiscoveryRegistry, error) {
+ schema := getEnv("ZOOKEEPER_SCHEMA", config.Config.Zookeeper.Schema)
+ zkAddr := getZkAddrFromEnv(config.Config.Zookeeper.ZkAddr)
+ username := getEnv("ZOOKEEPER_USERNAME", config.Config.Zookeeper.Username)
+ password := getEnv("ZOOKEEPER_PASSWORD", config.Config.Zookeeper.Password)
+
+ return openkeeper.NewClient(
+ zkAddr,
+ schema,
+ openkeeper.WithFreq(time.Hour),
+ openkeeper.WithUserNameAndPassword(username, password),
+ openkeeper.WithRoundRobin(),
+ openkeeper.WithTimeout(10),
+ openkeeper.WithLogger(log.NewZkLogger()),
+ )
+}
+
+// getEnv returns the value of an environment variable if it exists, otherwise it returns the fallback value.
+func getEnv(key, fallback string) string {
+ if value, exists := os.LookupEnv(key); exists {
+ return value
+ }
+ return fallback
+}
+
+// getZkAddrFromEnv returns the value of an environment variable if it exists, otherwise it returns the fallback value.
+func getZkAddrFromEnv(fallback []string) []string {
+ if value, exists := os.LookupEnv("ZOOKEEPER_ADDRESS"); exists {
+ return strings.Split(value, ",")
+ }
+ return fallback
+}
diff --git a/pkg/common/ginprometheus/ginprometheus.go b/pkg/common/ginprometheus/ginprometheus.go
index a325595d6..f116fc23a 100644
--- a/pkg/common/ginprometheus/ginprometheus.go
+++ b/pkg/common/ginprometheus/ginprometheus.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 ginprometheus
import (
diff --git a/pkg/common/http/http_client.go b/pkg/common/http/http_client.go
index e1bc83d38..baad60459 100644
--- a/pkg/common/http/http_client.go
+++ b/pkg/common/http/http_client.go
@@ -127,7 +127,7 @@ func callBackPostReturn(ctx context.Context, url, command string, input interfac
log.ZWarn(ctx, "callback failed but continue", err, "url", url)
return nil
}
- return errs.ErrData.Wrap(err.Error())
+ return errs.ErrData.WithDetail(err.Error() + "response format error")
}
return output.Parse()
diff --git a/pkg/common/kafka/producer.go b/pkg/common/kafka/producer.go
index 1dad33f9c..9a06809b7 100644
--- a/pkg/common/kafka/producer.go
+++ b/pkg/common/kafka/producer.go
@@ -21,19 +21,18 @@ import (
"strings"
"time"
+ "github.com/IBM/sarama"
"github.com/OpenIMSDK/protocol/constant"
- log "github.com/OpenIMSDK/tools/log"
+ "github.com/OpenIMSDK/tools/log"
"github.com/OpenIMSDK/tools/mcontext"
"github.com/OpenIMSDK/tools/utils"
+ "google.golang.org/protobuf/proto"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
-
- "github.com/IBM/sarama"
- "google.golang.org/protobuf/proto"
)
const (
- maxRetry = 10 // number of retries
+ maxRetry = 10 // Maximum number of retries for producer creation
)
var errEmptyMsg = errors.New("binary msg is empty")
@@ -45,62 +44,85 @@ type Producer struct {
producer sarama.SyncProducer
}
-// NewKafkaProducer Initialize kafka producer.
+// NewKafkaProducer initializes a new Kafka producer.
func NewKafkaProducer(addr []string, topic string) *Producer {
- p := Producer{}
- p.config = sarama.NewConfig() // Instantiate a sarama Config
- p.config.Producer.Return.Successes = true // Whether to enable the successes channel to be notified after the message is sent successfully
+ p := Producer{
+ addr: addr,
+ topic: topic,
+ config: sarama.NewConfig(),
+ }
+
+ // Set producer return flags
+ p.config.Producer.Return.Successes = true
p.config.Producer.Return.Errors = true
- p.config.Producer.Partitioner = sarama.NewHashPartitioner // Set the hash-key automatic hash partition. When sending a message, you must specify the key value of the message. If there is no key, the partition will be selected randomly
- var producerAck = sarama.WaitForAll // default: WaitForAll
- switch strings.ToLower(config.Config.Kafka.ProducerAck) {
- case "no_response":
- producerAck = sarama.NoResponse
- case "wait_for_local":
- producerAck = sarama.WaitForLocal
- case "wait_for_all":
- producerAck = sarama.WaitForAll
- }
- p.config.Producer.RequiredAcks = producerAck
+ // Set partitioner strategy
+ p.config.Producer.Partitioner = sarama.NewHashPartitioner
- var compress = sarama.CompressionNone // default: no compress
- _ = compress.UnmarshalText(bytes.ToLower([]byte(config.Config.Kafka.CompressType)))
- p.config.Producer.Compression = compress
+ // Configure producer acknowledgement level
+ configureProducerAck(&p, config.Config.Kafka.ProducerAck)
+
+ // Configure message compression
+ configureCompression(&p, config.Config.Kafka.CompressType)
+
+ // Get Kafka configuration from environment variables or fallback to config file
+ kafkaUsername := getEnvOrConfig("KAFKA_USERNAME", config.Config.Kafka.Username)
+ kafkaPassword := getEnvOrConfig("KAFKA_PASSWORD", config.Config.Kafka.Password)
+ kafkaAddr := getEnvOrConfig("KAFKA_ADDRESS", addr[0]) // Assuming addr[0] contains address from config
- if config.Config.Kafka.Username != "" && config.Config.Kafka.Password != "" {
+ // Configure SASL authentication if credentials are provided
+ if kafkaUsername != "" && kafkaPassword != "" {
p.config.Net.SASL.Enable = true
- p.config.Net.SASL.User = config.Config.Kafka.Username
- p.config.Net.SASL.Password = config.Config.Kafka.Password
+ p.config.Net.SASL.User = kafkaUsername
+ p.config.Net.SASL.Password = kafkaPassword
}
- p.addr = addr
- p.topic = topic
+
+ // Set the Kafka address
+ p.addr = []string{kafkaAddr}
+
+ // Set up TLS configuration (if required)
SetupTLSConfig(p.config)
- var producer sarama.SyncProducer
+
+ // Create the producer with retries
var err error
for i := 0; i <= maxRetry; i++ {
- producer, err = sarama.NewSyncProducer(p.addr, p.config) // Initialize the client
+ p.producer, err = sarama.NewSyncProducer(p.addr, p.config)
if err == nil {
- p.producer = producer
return &p
}
- //TODO If the password is wrong, exit directly
- //if packetErr, ok := err.(*sarama.PacketEncodingError); ok {
- //if _, ok := packetErr.Err.(sarama.AuthenticationError); ok {
- // fmt.Println("Kafka password is wrong.")
- //}
- //} else {
- // fmt.Printf("Failed to create Kafka producer: %v\n", err)
- //}
- time.Sleep(time.Duration(1) * time.Second)
+ time.Sleep(1 * time.Second) // Wait before retrying
}
+
+ // Panic if unable to create producer after retries
if err != nil {
- panic(err.Error())
+ panic("Failed to create Kafka producer: " + err.Error())
}
- p.producer = producer
+
return &p
}
+// configureProducerAck configures the producer's acknowledgement level.
+func configureProducerAck(p *Producer, ackConfig string) {
+ switch strings.ToLower(ackConfig) {
+ case "no_response":
+ p.config.Producer.RequiredAcks = sarama.NoResponse
+ case "wait_for_local":
+ p.config.Producer.RequiredAcks = sarama.WaitForLocal
+ case "wait_for_all":
+ p.config.Producer.RequiredAcks = sarama.WaitForAll
+ default:
+ p.config.Producer.RequiredAcks = sarama.WaitForAll
+ }
+}
+
+// configureCompression configures the message compression type for the producer.
+func configureCompression(p *Producer, compressType string) {
+ var compress sarama.CompressionCodec = sarama.CompressionNone
+ compress.UnmarshalText(bytes.ToLower([]byte(compressType)))
+ p.config.Producer.Compression = compress
+}
+
+// GetMQHeaderWithContext extracts message queue headers from the context.
func GetMQHeaderWithContext(ctx context.Context) ([]sarama.RecordHeader, error) {
operationID, opUserID, platform, connID, err := mcontext.GetCtxInfos(ctx)
if err != nil {
@@ -111,22 +133,23 @@ func GetMQHeaderWithContext(ctx context.Context) ([]sarama.RecordHeader, error)
{Key: []byte(constant.OpUserID), Value: []byte(opUserID)},
{Key: []byte(constant.OpUserPlatform), Value: []byte(platform)},
{Key: []byte(constant.ConnID), Value: []byte(connID)},
- }, err
+ }, nil
}
+// GetContextWithMQHeader creates a context from message queue headers.
func GetContextWithMQHeader(header []*sarama.RecordHeader) context.Context {
var values []string
for _, recordHeader := range header {
values = append(values, string(recordHeader.Value))
}
- return mcontext.WithMustInfoCtx(values) // TODO
+ return mcontext.WithMustInfoCtx(values) // Attach extracted values to context
}
+// SendMessage sends a message to the Kafka topic configured in the Producer.
func (p *Producer) SendMessage(ctx context.Context, key string, msg proto.Message) (int32, int64, error) {
log.ZDebug(ctx, "SendMessage", "msg", msg, "topic", p.topic, "key", key)
- kMsg := &sarama.ProducerMessage{}
- kMsg.Topic = p.topic
- kMsg.Key = sarama.StringEncoder(key)
+
+ // Marshal the protobuf message
bMsg, err := proto.Marshal(msg)
if err != nil {
return 0, 0, utils.Wrap(err, "kafka proto Marshal err")
@@ -134,20 +157,33 @@ func (p *Producer) SendMessage(ctx context.Context, key string, msg proto.Messag
if len(bMsg) == 0 {
return 0, 0, utils.Wrap(errEmptyMsg, "")
}
- kMsg.Value = sarama.ByteEncoder(bMsg)
+
+ // Prepare Kafka message
+ kMsg := &sarama.ProducerMessage{
+ Topic: p.topic,
+ Key: sarama.StringEncoder(key),
+ Value: sarama.ByteEncoder(bMsg),
+ }
+
+ // Validate message key and value
if kMsg.Key.Length() == 0 || kMsg.Value.Length() == 0 {
return 0, 0, utils.Wrap(errEmptyMsg, "")
}
- kMsg.Metadata = ctx
+
+ // Attach context metadata as headers
header, err := GetMQHeaderWithContext(ctx)
if err != nil {
return 0, 0, utils.Wrap(err, "")
}
kMsg.Headers = header
+
+ // Send the message
partition, offset, err := p.producer.SendMessage(kMsg)
- log.ZDebug(ctx, "ByteEncoder SendMessage end", "key ", kMsg.Key, "key length", kMsg.Value.Length())
if err != nil {
log.ZWarn(ctx, "p.producer.SendMessage error", err)
+ return 0, 0, utils.Wrap(err, "")
}
- return partition, offset, utils.Wrap(err, "")
+
+ log.ZDebug(ctx, "ByteEncoder SendMessage end", "key", kMsg.Key, "key length", kMsg.Value.Length())
+ return partition, offset, nil
}
diff --git a/pkg/common/kafka/util.go b/pkg/common/kafka/util.go
index 722205865..da0c5349b 100644
--- a/pkg/common/kafka/util.go
+++ b/pkg/common/kafka/util.go
@@ -15,6 +15,8 @@
package kafka
import (
+ "os"
+
"github.com/IBM/sarama"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
@@ -33,3 +35,12 @@ func SetupTLSConfig(cfg *sarama.Config) {
)
}
}
+
+// getEnvOrConfig returns the value of the environment variable if it exists,
+// otherwise, it returns the value from the configuration file.
+func getEnvOrConfig(envName string, configValue string) string {
+ if value, exists := os.LookupEnv(envName); exists {
+ return value
+ }
+ return configValue
+}
diff --git a/pkg/common/prommetrics/gin_api.go b/pkg/common/prommetrics/gin_api.go
index 7cd82dad2..c5ef612a2 100644
--- a/pkg/common/prommetrics/gin_api.go
+++ b/pkg/common/prommetrics/gin_api.go
@@ -1,10 +1,24 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import ginProm "github.com/openimsdk/open-im-server/v3/pkg/common/ginprometheus"
/*
labels := prometheus.Labels{"label_one": "any", "label_two": "value"}
-ApiCustomCnt.MetricCollector.(*prometheus.CounterVec).With(labels).Inc()
+ApiCustomCnt.MetricCollector.(*prometheus.CounterVec).With(labels).Inc().
*/
var (
ApiCustomCnt = &ginProm.Metric{
diff --git a/pkg/common/prommetrics/grpc_auth.go b/pkg/common/prommetrics/grpc_auth.go
index e44c146be..30dd5f1b1 100644
--- a/pkg/common/prommetrics/grpc_auth.go
+++ b/pkg/common/prommetrics/grpc_auth.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/prommetrics/grpc_msg.go b/pkg/common/prommetrics/grpc_msg.go
index 88d4ef3ce..758879b90 100644
--- a/pkg/common/prommetrics/grpc_msg.go
+++ b/pkg/common/prommetrics/grpc_msg.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/prommetrics/grpc_msggateway.go b/pkg/common/prommetrics/grpc_msggateway.go
index bb62426e1..98d5a3267 100644
--- a/pkg/common/prommetrics/grpc_msggateway.go
+++ b/pkg/common/prommetrics/grpc_msggateway.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/prommetrics/grpc_push.go b/pkg/common/prommetrics/grpc_push.go
index aa5085c2c..0b6c3e76f 100644
--- a/pkg/common/prommetrics/grpc_push.go
+++ b/pkg/common/prommetrics/grpc_push.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/prommetrics/prommetrics.go b/pkg/common/prommetrics/prommetrics.go
index 26b02b16f..41719dd2d 100644
--- a/pkg/common/prommetrics/prommetrics.go
+++ b/pkg/common/prommetrics/prommetrics.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/prommetrics/prommetrics_test.go b/pkg/common/prommetrics/prommetrics_test.go
index babc5e410..1e48c63ba 100644
--- a/pkg/common/prommetrics/prommetrics_test.go
+++ b/pkg/common/prommetrics/prommetrics_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/prommetrics/transfer.go b/pkg/common/prommetrics/transfer.go
index 6b03870b5..197b6f7fc 100644
--- a/pkg/common/prommetrics/transfer.go
+++ b/pkg/common/prommetrics/transfer.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 prommetrics
import (
diff --git a/pkg/common/startrpc/start_test.go b/pkg/common/startrpc/start_test.go
index 171cdb1c2..481986e15 100644
--- a/pkg/common/startrpc/start_test.go
+++ b/pkg/common/startrpc/start_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 startrpc
import (
diff --git a/pkg/common/version/base.go b/pkg/common/version/base.go
index ac214269f..9a656e03a 100644
--- a/pkg/common/version/base.go
+++ b/pkg/common/version/base.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 version
// Base version information.
@@ -15,7 +29,7 @@ package version
// When releasing a new Kubernetes version, this file is updated by
// build/mark_new_version.sh to reflect the new version, and then a
// git annotated tag (using format vX.Y where X == Major version and Y
-// == Minor version) is created to point to the commit that updates
+// == Minor version) is created to point to the commit that updates.
var (
// TODO: Deprecate gitMajor and gitMinor, use only gitVersion
// instead. First step in deprecation, keep the fields but make
diff --git a/pkg/common/version/types.go b/pkg/common/version/types.go
index ee4664149..da9c1ed90 100644
--- a/pkg/common/version/types.go
+++ b/pkg/common/version/types.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 version
// Info contains versioning information.
diff --git a/pkg/common/version/version.go b/pkg/common/version/version.go
index b8ccfaf81..3b271b3f6 100644
--- a/pkg/common/version/version.go
+++ b/pkg/common/version/version.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 version
import (
@@ -25,7 +39,7 @@ func Get() Info {
}
}
-// GetClientVersion returns the git version of the OpenIM client repository
+// GetClientVersion returns the git version of the OpenIM client repository.
func GetClientVersion() (*OpenIMClientVersion, error) {
clientVersion, err := getClientVersion()
if err != nil {
@@ -52,7 +66,7 @@ func getClientVersion() (string, error) {
return ref.Hash().String(), nil
}
-// GetSingleVersion returns single version of sealer
+// GetSingleVersion returns single version of sealer.
func GetSingleVersion() string {
return gitVersion
}
diff --git a/pkg/rpcclient/grouphash/grouphash.go b/pkg/rpcclient/grouphash/grouphash.go
index b5570dccd..dee47ad44 100644
--- a/pkg/rpcclient/grouphash/grouphash.go
+++ b/pkg/rpcclient/grouphash/grouphash.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 grouphash
import (
diff --git a/scripts/check-all.sh b/scripts/check-all.sh
index 23e2119d4..a438ac26b 100755
--- a/scripts/check-all.sh
+++ b/scripts/check-all.sh
@@ -33,9 +33,8 @@ openim::log::info "\n# Begin to check all openim service"
# OpenIM status
# Elegant printing function
print_services_and_ports() {
- # 获取数组
- declare -g service_names=("${!1}")
- declare -g service_ports=("${!2}")
+ local -n service_names=$1
+ local -n service_ports=$2
echo "+-------------------------+----------+"
echo "| Service Name | Port |"
@@ -48,7 +47,6 @@ print_services_and_ports() {
echo "+-------------------------+----------+"
}
-
# Print out services and their ports
print_services_and_ports OPENIM_SERVER_NAME_TARGETS OPENIM_SERVER_PORT_TARGETS
@@ -91,4 +89,4 @@ else
echo "++++ Check all openim service ports successfully !"
fi
-set -e
\ No newline at end of file
+set -e
diff --git a/scripts/docker-start-all.sh b/scripts/docker-start-all.sh
index 6ad277815..3c83b02bb 100755
--- a/scripts/docker-start-all.sh
+++ b/scripts/docker-start-all.sh
@@ -28,6 +28,8 @@ openim::log::info "\n# Use Docker to start all openim service"
trap 'openim::util::onCtrlC' INT
+"${OPENIM_ROOT}"/scripts/init-config.sh --skip
+
"${OPENIM_ROOT}"/scripts/start-all.sh
sleep 5
diff --git a/scripts/githooks/pre-push.sh b/scripts/githooks/pre-push.sh
index 2985313b7..e341cf4f2 100644
--- a/scripts/githooks/pre-push.sh
+++ b/scripts/githooks/pre-push.sh
@@ -102,7 +102,7 @@ print_color "Deleted Files: ${deleted_files}" "${BACKGROUND_GREEN}"
if [[ ! $local_branch =~ $valid_branch_regex ]]
then
printError "There is something wrong with your branch name. Branch names in this project must adhere to this contract: $valid_branch_regex.
-Your commit will be rejected. You should rename your branch to a valid name(feat/name OR bug/name) and try again."
+Your commit will be rejected. You should rename your branch to a valid name(feat/name OR fix/name) and try again."
printError "For more on this, read on: https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694"
exit 1
fi
diff --git a/scripts/init-config.sh b/scripts/init-config.sh
index f20fc7e73..c75fc5502 100755
--- a/scripts/init-config.sh
+++ b/scripts/init-config.sh
@@ -13,64 +13,242 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# This script automatically initializes the various configuration files
-# Read: https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md
+# This script automatically initializes various configuration files and can generate example files.
set -o errexit
set -o nounset
set -o pipefail
+# Root directory of the OpenIM project
OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
+# Source initialization script
source "${OPENIM_ROOT}/scripts/lib/init.sh"
-# (en: Define a profile array that contains the name path of the profile to be generated.)
+# Default environment file
readonly ENV_FILE=${ENV_FILE:-"${OPENIM_ROOT}/scripts/install/environment.sh"}
-# (en: Defines an associative array where the keys are the template files and the values are the corresponding output files.)
+# Templates for configuration files
declare -A TEMPLATES=(
- ["${OPENIM_ROOT}/deployments/templates/env_template.yaml"]="${OPENIM_ROOT}/.env"
+ ["${OPENIM_ROOT}/deployments/templates/env-template.yaml"]="${OPENIM_ROOT}/.env"
["${OPENIM_ROOT}/deployments/templates/openim.yaml"]="${OPENIM_ROOT}/config/config.yaml"
["${OPENIM_ROOT}/deployments/templates/prometheus.yml"]="${OPENIM_ROOT}/config/prometheus.yml"
["${OPENIM_ROOT}/deployments/templates/alertmanager.yml"]="${OPENIM_ROOT}/config/alertmanager.yml"
)
-openim::log::info "Read more configuration information: https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/environment.md"
+# Templates for example files
+declare -A EXAMPLES=(
+ ["${OPENIM_ROOT}/deployments/templates/env-template.yaml"]="${OPENIM_ROOT}/config/templates/env.template"
+ ["${OPENIM_ROOT}/deployments/templates/openim.yaml"]="${OPENIM_ROOT}/config/templates/config.yaml.template"
+ ["${OPENIM_ROOT}/deployments/templates/prometheus.yml"]="${OPENIM_ROOT}/config/templates/prometheus.yml.template"
+ ["${OPENIM_ROOT}/deployments/templates/alertmanager.yml"]="${OPENIM_ROOT}/config/templates/alertmanager.yml.template"
+)
-for template in "${!TEMPLATES[@]}"; do
- if [[ ! -f "${template}" ]]; then
- openim::log::error_exit "Template file ${template} does not exist..."
- exit 1
- fi
-done
+# Templates for config Copy file
+declare -A COPY_TEMPLATES=(
+ ["${OPENIM_ROOT}/deployments/templates/email.tmpl"]="${OPENIM_ROOT}/config/email.tmpl"
+ ["${OPENIM_ROOT}/deployments/templates/instance-down-rules.yml"]="${OPENIM_ROOT}/config/instance-down-rules.yml"
+ ["${OPENIM_ROOT}/deployments/templates/notification.yaml"]="${OPENIM_ROOT}/config/notification.yaml"
+)
-for template in "${!TEMPLATES[@]}"; do
- IFS=';' read -ra OUTPUT_FILES <<< "${TEMPLATES[$template]}"
- for output_file in "${OUTPUT_FILES[@]}"; do
- if [[ -f "${output_file}" ]]; then
+# Templates for config Copy file
+declare -A COPY_EXAMPLES=(
+ ["${OPENIM_ROOT}/deployments/templates/email.tmpl"]="${OPENIM_ROOT}/config/templates/email.tmpl.template"
+ ["${OPENIM_ROOT}/deployments/templates/instance-down-rules.yml"]="${OPENIM_ROOT}/config/templates/instance-down-rules.yml.template"
+ ["${OPENIM_ROOT}/deployments/templates/notification.yaml"]="${OPENIM_ROOT}/config/templates/notification.yaml.template"
+)
+
+# Command-line options
+FORCE_OVERWRITE=false
+SKIP_EXISTING=false
+GENERATE_EXAMPLES=false
+CLEAN_CONFIG=false
+CLEAN_EXAMPLES=false
+
+# Function to display help information
+show_help() {
+ echo "Usage: $(basename "$0") [options]"
+ echo "Options:"
+ echo " -h, --help Show this help message"
+ echo " --force Overwrite existing files without prompt"
+ echo " --skip Skip generation if file exists"
+ echo " --examples Generate example files"
+ echo " --clean-config Clean all configuration files"
+ echo " --clean-examples Clean all example files"
+}
+
+# Function to generate and copy configuration files
+generate_config_files() {
+ # Handle TEMPLATES array
+ for template in "${!TEMPLATES[@]}"; do
+ local output_file="${TEMPLATES[$template]}"
+ process_file "$template" "$output_file" true
+ done
+
+ # Handle COPY_TEMPLATES array
+ for template in "${!COPY_TEMPLATES[@]}"; do
+ local output_file="${COPY_TEMPLATES[$template]}"
+ process_file "$template" "$output_file" false
+ done
+}
+
+# Function to generate example files
+generate_example_files() {
+ env_cmd="env -i"
+ for var in "${!env_vars[@]}"; do
+ env_cmd+=" $var='${env_vars[$var]}'"
+ done
+
+ # Processing EXAMPLES array
+ for template in "${!EXAMPLES[@]}"; do
+ local example_file="${EXAMPLES[$template]}"
+ process_file "$template" "$example_file" true
+ done
+
+ # Processing COPY_EXAMPLES array
+ for template in "${!COPY_EXAMPLES[@]}"; do
+ local example_file="${COPY_EXAMPLES[$template]}"
+ process_file "$template" "$example_file" false
+ done
+
+}
+
+# Function to process a single file, either by generating or copying
+process_file() {
+ local template=$1
+ local output_file=$2
+ local use_genconfig=$3
+
+ if [[ -f "${output_file}" ]]; then
+ if [[ "${FORCE_OVERWRITE}" == true ]]; then
+ openim::log::info "Force overwriting ${output_file}."
+ elif [[ "${SKIP_EXISTING}" == true ]]; then
+ openim::log::info "Skipping generation of ${output_file} as it already exists."
+ return
+ else
echo -n "File ${output_file} already exists. Overwrite? (Y/N): "
read -r -n 1 REPLY
- echo # Adds a line to wrap after user input
- if [[ $REPLY =~ ^[Yy]$ ]]; then
- openim::log::info "Overwriting ${output_file}. Previous configuration will be lost."
- else
+ echo
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
openim::log::info "Skipping generation of ${output_file}."
- continue
+ return
fi
fi
+ else
+ if [[ "${SKIP_EXISTING}" == true ]]; then
+ openim::log::info "Generating ${output_file} as it does not exist."
+ fi
+ fi
- openim::log::info "⌚ Working with template file: ${template} to ${output_file}..."
+ if [[ "$use_genconfig" == true ]]; then
+ openim::log::info "⌚ Working with template file: ${template} to generate ${output_file}..."
if [[ ! -f "${OPENIM_ROOT}/scripts/genconfig.sh" ]]; then
openim::log::error "genconfig.sh script not found"
exit 1
fi
- "${OPENIM_ROOT}/scripts/genconfig.sh" "${ENV_FILE}" "${template}" > "${output_file}" || {
- openim::log::error "Error processing template file ${template}"
+ if [[ -n "${env_cmd}" ]]; then
+ eval "$env_cmd ${OPENIM_ROOT}/scripts/genconfig.sh '${ENV_FILE}' '${template}' > '${output_file}'" || {
+ openim::log::error "Error processing template file ${template}"
+ exit 1
+ }
+ else
+ "${OPENIM_ROOT}/scripts/genconfig.sh" "${ENV_FILE}" "${template}" > "${output_file}" || {
+ openim::log::error "Error processing template file ${template}"
+ exit 1
+ }
+ fi
+ else
+ openim::log::info "📋 Copying ${template} to ${output_file}..."
+ cp "${template}" "${output_file}" || {
+ openim::log::error "Error copying template file ${template}"
exit 1
}
- sleep 0.5
+ fi
+
+ sleep 0.5
+}
+
+clean_config_files() {
+ local all_templates=("${TEMPLATES[@]}" "${COPY_TEMPLATES[@]}")
+
+ for output_file in "${all_templates[@]}"; do
+ if [[ -f "${output_file}" ]]; then
+ rm -f "${output_file}"
+ openim::log::info "Removed configuration file: ${output_file}"
+ fi
done
+}
+
+# Function to clean example files
+clean_example_files() {
+ # 合并 EXAMPLES 和 COPY_EXAMPLES 数组
+ local all_examples=("${EXAMPLES[@]}" "${COPY_EXAMPLES[@]}")
+
+ for example_file in "${all_examples[@]}"; do
+ if [[ -f "${example_file}" ]]; then
+ rm -f "${example_file}"
+ openim::log::info "Removed example file: ${example_file}"
+ fi
+ done
+}
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ -h|--help)
+ show_help
+ exit 0
+ ;;
+ --force)
+ FORCE_OVERWRITE=true
+ shift
+ ;;
+ --skip)
+ SKIP_EXISTING=true
+ shift
+ ;;
+ --examples)
+ GENERATE_EXAMPLES=true
+ shift
+ ;;
+ --clean-config)
+ CLEAN_CONFIG=true
+ shift
+ ;;
+ --clean-examples)
+ CLEAN_EXAMPLES=true
+ shift
+ ;;
+ *)
+ echo "Unknown option: $1"
+ show_help
+ exit 1
+ ;;
+ esac
done
+# Clean configuration files if --clean-config option is provided
+if [[ "${CLEAN_CONFIG}" == true ]]; then
+ clean_config_files
+fi
+
+# Clean example files if --clean-examples option is provided
+if [[ "${CLEAN_EXAMPLES}" == true ]]; then
+ clean_example_files
+fi
+
+# Generate configuration files if requested
+if [[ "${FORCE_OVERWRITE}" == true || "${SKIP_EXISTING}" == false ]] && [[ "${CLEAN_CONFIG}" == false ]]; then
+ generate_config_files
+fi
+
+# Generate configuration files if requested
+if [[ "${SKIP_EXISTING}" == true ]]; then
+ generate_config_files
+fi
+
+# Generate example files if --examples option is provided
+if [[ "${GENERATE_EXAMPLES}" == true ]] && [[ "${CLEAN_EXAMPLES}" == false ]]; then
+ generate_example_files
+fi
-openim::log::success "✨ All configuration files have been successfully generated!"
+openim::log::success "Configuration and example files operation complete!"
diff --git a/scripts/install/environment.sh b/scripts/install/environment.sh
index 643f621b6..3dd062af6 100755
--- a/scripts/install/environment.sh
+++ b/scripts/install/environment.sh
@@ -66,8 +66,8 @@ def "ENV_FILE" ""${OPENIM_ROOT}"/scripts/install/environment.sh"
###################### Docker compose ###################
# OPENIM AND CHAT
-def "CHAT_BRANCH" "main"
-def "SERVER_BRANCH" "main"
+def "CHAT_IMAGE_VERSION" "main"
+def "SERVER_IMAGE_VERSION" "main"
# Choose the appropriate image address, the default is GITHUB image,
# you can choose docker hub, for Chinese users can choose Ali Cloud
@@ -139,7 +139,7 @@ readonly API_OPENIM_PORT=${API_OPENIM_PORT:-'10002'}
def "API_LISTEN_IP" "0.0.0.0" # API的监听IP
###################### openim-chat 配置信息 ######################
-def "OPENIM_CHAT_DATA_DIR" "./openim-chat/${CHAT_BRANCH}"
+def "OPENIM_CHAT_DATA_DIR" "./openim-chat/${CHAT_IMAGE_VERSION}"
def "OPENIM_CHAT_ADDRESS" "${DOCKER_BRIDGE_GATEWAY}" # OpenIM服务地址
def "OPENIM_CHAT_API_PORT" "10008" # OpenIM API端口
def "CHAT_API_LISTEN_IP" "" # OpenIM API的监听IP
diff --git a/scripts/install/openim-api.sh b/scripts/install/openim-api.sh
index a40e23611..9f66d0ba0 100755
--- a/scripts/install/openim-api.sh
+++ b/scripts/install/openim-api.sh
@@ -66,7 +66,7 @@ function openim::api::start() {
for ((j = 0; j < ${#OPENIM_API_SERVICE_PORTS[@]}; j++)); do
openim::log::info "Starting ${OPENIM_API_SERVICE_LISTARIES[$i]} service, port: ${OPENIM_API_SERVICE_PORTS[j]}, binary root: ${OPENIM_OUTPUT_HOSTBIN}/${OPENIM_API_SERVICE_LISTARIES[$i]}"
openim::api::start_service "${OPENIM_API_SERVICE_LISTARIES[$i]}" "${OPENIM_API_PORT_LISTARIES[j]}"
- sleep 1
+ sleep 2
done
done
diff --git a/scripts/install/openim-rpc.sh b/scripts/install/openim-rpc.sh
index bd00ff9f2..b66004191 100755
--- a/scripts/install/openim-rpc.sh
+++ b/scripts/install/openim-rpc.sh
@@ -138,7 +138,7 @@ function openim::rpc::start() {
done
done
- sleep 0.5
+ sleep 1
openim::util::check_ports ${OPENIM_RPC_PORT_TARGETS[@]}
# openim::util::check_ports ${OPENIM_RPC_PROM_PORT_TARGETS[@]}
diff --git a/scripts/install/test.sh b/scripts/install/test.sh
index 049dc19c8..93a39f298 100755
--- a/scripts/install/test.sh
+++ b/scripts/install/test.sh
@@ -70,14 +70,16 @@ function openim::test::auth() {
#################################### Auth Module ####################################
-# Define a function to get a token (Admin Token)
+# Define a function to get a token for a specific user
openim::test::get_token() {
+ local user_id="${1:-openIM123456}" # Default user ID if not provided
token_response=$(${CCURL} "${OperationID}" "${Header}" ${INSECURE_OPENIMAPI}/auth/user_token \
- -d'{"secret": "'"$SECRET"'","platformID": 1,"userID": "openIM123456"}')
+ -d'{"secret": "'"$SECRET"'","platformID": 1,"userID": "'$user_id'"}')
token=$(echo $token_response | grep -Po 'token[" :]+\K[^"]+')
echo "$token"
}
+
Header="-HContent-Type: application/json"
OperationID="-HoperationID: 1646445464564"
Token="-Htoken: $(openim::test::get_token)"
@@ -530,6 +532,36 @@ EOF
openim::test::check_error "$response"
}
+# Updates the pin status of multiple friends.
+openim::test::update_pin_status() {
+ local ownerUserID="${1}"
+ shift # Shift the arguments to skip the first one (ownerUserID)
+ local isPinned="${1}"
+ shift # Shift the arguments to skip the isPinned argument
+
+ # Constructing the list of friendUserIDs
+ local friendUserIDsArray=()
+ for friendUserID in "$@"; do
+ friendUserIDsArray+=("\"${friendUserID}\"")
+ done
+ local friendUserIDs=$(IFS=,; echo "${friendUserIDsArray[*]}")
+
+ local request_body=$(cat < /dev/null 2>&1; then
+ info=$(ss -ltnp | grep ":$port" || true)
+ else
+ info=$(netstat -ltnp | grep ":$port" || true)
+ fi
+
# If there's no process information, it means the process associated with the port is not running.
if [[ -z $info ]]; then
not_started+=($port)
@@ -364,6 +368,18 @@ openim::util::check_ports() {
# openim::util::check_process_names nginx mysql redis
# The function returns a status of 1 if any of the processes is not running.
openim::util::check_process_names() {
+ # Function to get the port of a process
+ get_port() {
+ local pid=$1
+ if command -v ss > /dev/null 2>&1; then
+ # used ss comment
+ ss -ltnp 2>/dev/null | grep $pid | awk '{print $4}' | cut -d ':' -f2
+ else
+ # used netstat comment replace ss
+ netstat -ltnp 2>/dev/null | grep $pid | awk '{print $4}' | sed 's/.*://'
+ fi
+ }
+
# Arrays to collect details of processes
local not_started=()
local started=()
@@ -382,7 +398,7 @@ openim::util::check_process_names() {
for pid in "${pids[@]}"; do
local command=$(ps -p $pid -o cmd=)
local start_time=$(ps -p $pid -o lstart=)
- local port=$(ss -ltnp 2>/dev/null | grep $pid | awk '{print $4}' | cut -d ':' -f2)
+ local port=$(get_port $pid)
# Check if port information was found for the PID
if [[ -z $port ]]; then
@@ -419,6 +435,7 @@ openim::util::check_process_names() {
return 0
fi
}
+
# openim::util::check_process_names docker-pr
# The `openim::util::stop_services_on_ports` function stops services running on specified ports.
diff --git a/test/e2e/api/token/token.go b/test/e2e/api/token/token.go
index 4c578e8f7..88af72058 100644
--- a/test/e2e/api/token/token.go
+++ b/test/e2e/api/token/token.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 token
import (
@@ -9,7 +23,7 @@ import (
"net/http"
)
-// API endpoints and other constants
+// API endpoints and other constants.
const (
APIHost = "http://127.0.0.1:10002"
UserTokenURL = APIHost + "/auth/user_token"
@@ -18,27 +32,27 @@ const (
OperationID = "1646445464564"
)
-// UserTokenRequest represents a request to get a user token
+// UserTokenRequest represents a request to get a user token.
type UserTokenRequest struct {
Secret string `json:"secret"`
PlatformID int `json:"platformID"`
UserID string `json:"userID"`
}
-// UserTokenResponse represents a response containing a user token
+// UserTokenResponse represents a response containing a user token.
type UserTokenResponse struct {
Token string `json:"token"`
ErrCode int `json:"errCode"`
}
-// User represents user data for registration
+// User represents user data for registration.
type User struct {
UserID string `json:"userID"`
Nickname string `json:"nickname"`
FaceURL string `json:"faceURL"`
}
-// UserRegisterRequest represents a request to register a user
+// UserRegisterRequest represents a request to register a user.
type UserRegisterRequest struct {
Secret string `json:"secret"`
Users []User `json:"users"`
@@ -58,7 +72,7 @@ func main() {
}
}
-// GetUserToken requests a user token from the API
+// GetUserToken requests a user token from the API.
func GetUserToken(userID string) (string, error) {
reqBody := UserTokenRequest{
Secret: SecretKey,
@@ -88,7 +102,7 @@ func GetUserToken(userID string) (string, error) {
return tokenResp.Token, nil
}
-// RegisterUser registers a new user using the API
+// RegisterUser registers a new user using the API.
func RegisterUser(token, userID, nickname, faceURL string) error {
user := User{
UserID: userID,
diff --git a/test/e2e/api/user/curd.go b/test/e2e/api/user/curd.go
index c0380b235..1b56492b3 100644
--- a/test/e2e/api/user/curd.go
+++ b/test/e2e/api/user/curd.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 user
import (
@@ -7,18 +21,18 @@ import (
"github.com/openimsdk/open-im-server/v3/test/e2e/framework/config"
)
-// UserInfoRequest represents a request to get or update user information
+// UserInfoRequest represents a request to get or update user information.
type UserInfoRequest struct {
UserIDs []string `json:"userIDs,omitempty"`
UserInfo *gettoken.User `json:"userInfo,omitempty"`
}
-// GetUsersOnlineStatusRequest represents a request to get users' online status
+// GetUsersOnlineStatusRequest represents a request to get users' online status.
type GetUsersOnlineStatusRequest struct {
UserIDs []string `json:"userIDs"`
}
-// GetUsersInfo retrieves detailed information for a list of user IDs
+// GetUsersInfo retrieves detailed information for a list of user IDs.
func GetUsersInfo(token string, userIDs []string) error {
url := fmt.Sprintf("http://%s:%s/user/get_users_info", config.LoadConfig().APIHost, config.LoadConfig().APIPort)
@@ -29,7 +43,7 @@ func GetUsersInfo(token string, userIDs []string) error {
return sendPostRequestWithToken(url, token, requestBody)
}
-// UpdateUserInfo updates the information for a user
+// UpdateUserInfo updates the information for a user.
func UpdateUserInfo(token, userID, nickname, faceURL string) error {
url := fmt.Sprintf("http://%s:%s/user/update_user_info", config.LoadConfig().APIHost, config.LoadConfig().APIPort)
@@ -44,7 +58,7 @@ func UpdateUserInfo(token, userID, nickname, faceURL string) error {
return sendPostRequestWithToken(url, token, requestBody)
}
-// GetUsersOnlineStatus retrieves the online status for a list of user IDs
+// GetUsersOnlineStatus retrieves the online status for a list of user IDs.
func GetUsersOnlineStatus(token string, userIDs []string) error {
url := fmt.Sprintf("http://%s:%s/user/get_users_online_status", config.LoadConfig().APIHost, config.LoadConfig().APIPort)
diff --git a/test/e2e/api/user/user.go b/test/e2e/api/user/user.go
index 9facf76ac..fd8144acd 100644
--- a/test/e2e/api/user/user.go
+++ b/test/e2e/api/user/user.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 user
import (
@@ -11,29 +25,29 @@ import (
"github.com/openimsdk/open-im-server/v3/test/e2e/framework/config"
)
-// ForceLogoutRequest represents a request to force a user logout
+// ForceLogoutRequest represents a request to force a user logout.
type ForceLogoutRequest struct {
PlatformID int `json:"platformID"`
UserID string `json:"userID"`
}
-// CheckUserAccountRequest represents a request to check a user account
+// CheckUserAccountRequest represents a request to check a user account.
type CheckUserAccountRequest struct {
CheckUserIDs []string `json:"checkUserIDs"`
}
-// GetUsersRequest represents a request to get a list of users
+// GetUsersRequest represents a request to get a list of users.
type GetUsersRequest struct {
Pagination Pagination `json:"pagination"`
}
-// Pagination specifies the page number and number of items per page
+// Pagination specifies the page number and number of items per page.
type Pagination struct {
PageNumber int `json:"pageNumber"`
ShowNumber int `json:"showNumber"`
}
-// ForceLogout forces a user to log out
+// ForceLogout forces a user to log out.
func ForceLogout(token, userID string, platformID int) error {
url := fmt.Sprintf("http://%s:%s/auth/force_logout", config.LoadConfig().APIHost, config.LoadConfig().APIPort)
@@ -45,7 +59,7 @@ func ForceLogout(token, userID string, platformID int) error {
return sendPostRequestWithToken(url, token, requestBody)
}
-// CheckUserAccount checks if the user accounts exist
+// CheckUserAccount checks if the user accounts exist.
func CheckUserAccount(token string, userIDs []string) error {
url := fmt.Sprintf("http://%s:%s/user/account_check", config.LoadConfig().APIHost, config.LoadConfig().APIPort)
@@ -56,7 +70,7 @@ func CheckUserAccount(token string, userIDs []string) error {
return sendPostRequestWithToken(url, token, requestBody)
}
-// GetUsers retrieves a list of users with pagination
+// GetUsers retrieves a list of users with pagination.
func GetUsers(token string, pageNumber, showNumber int) error {
url := fmt.Sprintf("http://%s:%s/user/account_check", config.LoadConfig().APIHost, config.LoadConfig().APIPort)
@@ -70,7 +84,7 @@ func GetUsers(token string, pageNumber, showNumber int) error {
return sendPostRequestWithToken(url, token, requestBody)
}
-// sendPostRequestWithToken sends a POST request with a token in the header
+// sendPostRequestWithToken sends a POST request with a token in the header.
func sendPostRequestWithToken(url, token string, body any) error {
reqBytes, err := json.Marshal(body)
if err != nil {
diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go
index d1d6c5509..a3d3b1bcf 100644
--- a/test/e2e/e2e.go
+++ b/test/e2e/e2e.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 e2e
import (
diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go
index 8fe810789..a6496679c 100644
--- a/test/e2e/e2e_test.go
+++ b/test/e2e/e2e_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 e2e
import (
diff --git a/test/e2e/framework/config/config.go b/test/e2e/framework/config/config.go
index ed3c6a258..14074fec1 100644
--- a/test/e2e/framework/config/config.go
+++ b/test/e2e/framework/config/config.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 config
import (
diff --git a/test/e2e/framework/config/config_test.go b/test/e2e/framework/config/config_test.go
index c411df31e..b7259bf37 100644
--- a/test/e2e/framework/config/config_test.go
+++ b/test/e2e/framework/config/config_test.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 config
import (
diff --git a/test/e2e/framework/ginkgowrapper/ginkgowrapper.go b/test/e2e/framework/ginkgowrapper/ginkgowrapper.go
index 16779440b..814d393bc 100644
--- a/test/e2e/framework/ginkgowrapper/ginkgowrapper.go
+++ b/test/e2e/framework/ginkgowrapper/ginkgowrapper.go
@@ -1 +1,15 @@
+// Copyright © 2023 OpenIM. 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 ginkgowrapper
diff --git a/test/e2e/framework/ginkgowrapper/ginkgowrapper_test.go b/test/e2e/framework/ginkgowrapper/ginkgowrapper_test.go
index 16779440b..814d393bc 100644
--- a/test/e2e/framework/ginkgowrapper/ginkgowrapper_test.go
+++ b/test/e2e/framework/ginkgowrapper/ginkgowrapper_test.go
@@ -1 +1,15 @@
+// Copyright © 2023 OpenIM. 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 ginkgowrapper
diff --git a/test/e2e/framework/helpers/chat/chat.go b/test/e2e/framework/helpers/chat/chat.go
index 4fca28f2a..a4ead528b 100644
--- a/test/e2e/framework/helpers/chat/chat.go
+++ b/test/e2e/framework/helpers/chat/chat.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 main
import (
@@ -10,7 +24,7 @@ import (
)
var (
- // The default template version
+ // The default template version.
defaultTemplateVersion = "v1.3.0"
)
@@ -84,7 +98,7 @@ func main() {
select {}
}
-// getLatestVersion fetches the latest version number from a given URL
+// getLatestVersion fetches the latest version number from a given URL.
func getLatestVersion(url string) (string, error) {
resp, err := http.Get(url)
if err != nil {
@@ -102,7 +116,7 @@ func getLatestVersion(url string) (string, error) {
return latestVersion, nil
}
-// downloadAndExtract downloads a file from a URL and extracts it to a destination directory
+// downloadAndExtract downloads a file from a URL and extracts it to a destination directory.
func downloadAndExtract(url, destDir string) error {
resp, err := http.Get(url)
if err != nil {
@@ -141,7 +155,7 @@ func downloadAndExtract(url, destDir string) error {
return cmd.Run()
}
-// startProcess starts a process and prints any errors encountered
+// startProcess starts a process and prints any errors encountered.
func startProcess(cmdPath string) {
cmd := exec.Command(cmdPath)
cmd.Stdout = os.Stdout
diff --git a/tools/component/component.go b/tools/component/component.go
index 140313c30..28ea7a2fe 100644
--- a/tools/component/component.go
+++ b/tools/component/component.go
@@ -16,7 +16,6 @@ package main
import (
"context"
- "database/sql"
"flag"
"fmt"
"net"
@@ -31,15 +30,11 @@ import (
"github.com/IBM/sarama"
"github.com/OpenIMSDK/tools/errs"
- "github.com/OpenIMSDK/tools/utils"
"github.com/go-zookeeper/zk"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
- "gorm.io/driver/mysql"
- "gorm.io/gorm"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
- "github.com/openimsdk/open-im-server/v3/pkg/common/kafka"
"github.com/minio/minio-go/v7/pkg/credentials"
)
@@ -53,6 +48,12 @@ const (
configErrCode = 6001
)
+const (
+ colorRed = 31
+ colorGreen = 32
+ colorYellow = 33
+)
+
var (
cfgPath = flag.String("c", defaultCfgPath, "Path to the configuration file")
@@ -71,7 +72,7 @@ func initCfg() error {
type checkFunc struct {
name string
- function func() error
+ function func() (string, error)
}
func main() {
@@ -100,13 +101,13 @@ func main() {
allSuccess := true
for _, check := range checks {
- err := check.function()
+ str, err := check.function()
if err != nil {
- errorPrint(fmt.Sprintf("Starting %s failed: %v", check.name, err))
+ errorPrint(fmt.Sprintf("Starting %s failed, %v", check.name, err))
allSuccess = false
break
} else {
- successPrint(fmt.Sprintf("%s starts successfully", check.name))
+ successPrint(fmt.Sprintf("%s connected successfully, %s", check.name, str))
}
}
@@ -132,204 +133,255 @@ func exactIP(urll string) string {
return host
}
-func checkMysql() error {
- if config.Config.Mysql == nil {
- return nil
+// Helper function to get environment variable or default value
+func getEnv(key, fallback string) string {
+ if value, exists := os.LookupEnv(key); exists {
+ return value
}
- var sqlDB *sql.DB
- defer func() {
- if sqlDB != nil {
- sqlDB.Close()
- }
- }()
- dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local",
- config.Config.Mysql.Username, config.Config.Mysql.Password, config.Config.Mysql.Address[0], "mysql")
- db, err := gorm.Open(mysql.Open(dsn), nil)
+ return fallback
+}
+
+// checkMongo checks the MongoDB connection
+func checkMongo() (string, error) {
+ // Use environment variables or fallback to config
+ uri := getEnv("MONGO_URI", buildMongoURI())
+
+ client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
+ str := "ths addr is:" + strings.Join(config.Config.Mongo.Address, ",")
if err != nil {
- return errs.Wrap(err)
- } else {
- sqlDB, err = db.DB()
- err = sqlDB.Ping()
- if err != nil {
- return errs.Wrap(err)
- }
+ return "", errs.Wrap(errStr(err, str))
}
+ defer client.Disconnect(context.TODO())
- return nil
+ if err = client.Ping(context.TODO(), nil); err != nil {
+ return "", errs.Wrap(errStr(err, str))
+ }
+
+ return str, nil
}
-func checkMongo() error {
- var client *mongo.Client
- uri := "mongodb://sample.host:27017/?maxPoolSize=20&w=majority"
- defer func() {
- if client != nil {
- client.Disconnect(context.TODO())
- }
- }()
- if config.Config.Mongo.Uri != "" {
- uri = config.Config.Mongo.Uri
- } else {
- mongodbHosts := ""
- for i, v := range config.Config.Mongo.Address {
- if i == len(config.Config.Mongo.Address)-1 {
- mongodbHosts += v
- } else {
- mongodbHosts += v + ","
- }
- }
- if config.Config.Mongo.Password != "" && config.Config.Mongo.Username != "" {
- uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin",
- config.Config.Mongo.Username, config.Config.Mongo.Password, mongodbHosts,
- config.Config.Mongo.Database, config.Config.Mongo.MaxPoolSize)
- } else {
- uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin",
- mongodbHosts, config.Config.Mongo.Database,
- config.Config.Mongo.MaxPoolSize)
- }
+// buildMongoURI constructs the MongoDB URI using configuration settings
+func buildMongoURI() string {
+ // Fallback to config if environment variables are not set
+ username := config.Config.Mongo.Username
+ password := config.Config.Mongo.Password
+ database := config.Config.Mongo.Database
+ maxPoolSize := config.Config.Mongo.MaxPoolSize
+
+ mongodbHosts := strings.Join(config.Config.Mongo.Address, ",")
+
+ if username != "" && password != "" {
+ return fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin",
+ username, password, mongodbHosts, database, maxPoolSize)
}
- client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
+ return fmt.Sprintf("mongodb://%s/%s?maxPoolSize=%d&authSource=admin",
+ mongodbHosts, database, maxPoolSize)
+}
+
+// checkMinio checks the MinIO connection
+func checkMinio() (string, error) {
+ // Check if MinIO is enabled
+ if config.Config.Object.Enable != "minio" {
+ return "", nil
+ }
+
+ // Prioritize environment variables
+ endpoint := getEnv("MINIO_ENDPOINT", config.Config.Object.Minio.Endpoint)
+ accessKeyID := getEnv("MINIO_ACCESS_KEY_ID", config.Config.Object.Minio.AccessKeyID)
+ secretAccessKey := getEnv("MINIO_SECRET_ACCESS_KEY", config.Config.Object.Minio.SecretAccessKey)
+ useSSL := getEnv("MINIO_USE_SSL", "false") // Assuming SSL is not used by default
+
+ if endpoint == "" || accessKeyID == "" || secretAccessKey == "" {
+ return "", ErrConfig.Wrap("MinIO configuration missing")
+ }
+
+ // Parse endpoint URL to determine if SSL is enabled
+ u, err := url.Parse(endpoint)
if err != nil {
- return errs.Wrap(err)
- } else {
- err = client.Ping(context.TODO(), nil)
- if err != nil {
- return errs.Wrap(err)
- }
+ str := "the endpoint is:" + endpoint
+ return "", errs.Wrap(errStr(err, str))
+ }
+ secure := u.Scheme == "https" || useSSL == "true"
+
+ // Initialize MinIO client
+ minioClient, err := minio.New(u.Host, &minio.Options{
+ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+ Secure: secure,
+ })
+ str := "ths addr is:" + u.Host
+ if err != nil {
+ strs := fmt.Sprintf("%v;host:%s,accessKeyID:%s,secretAccessKey:%s,Secure:%v", err, u.Host, accessKeyID, secretAccessKey, secure)
+ return "", errs.Wrap(err, strs)
}
- return nil
-}
+ // Perform health check
+ cancel, err := minioClient.HealthCheck(time.Duration(minioHealthCheckDuration) * time.Second)
+ if err != nil {
+ return "", errs.Wrap(errStr(err, str))
+ }
+ defer cancel()
-func checkMinio() error {
- if config.Config.Object.Enable == "minio" {
- conf := config.Config.Object.Minio
- u, _ := url.Parse(conf.Endpoint)
- minioClient, err := minio.New(u.Host, &minio.Options{
- Creds: credentials.NewStaticV4(conf.AccessKeyID, conf.SecretAccessKey, ""),
- Secure: u.Scheme == "https",
- })
- if err != nil {
- return errs.Wrap(err)
- }
+ if minioClient.IsOffline() {
+ str := fmt.Sprintf("Minio server is offline;%s", str)
+ return "", ErrComponentStart.Wrap(str)
+ }
- cancel, err := minioClient.HealthCheck(time.Duration(minioHealthCheckDuration) * time.Second)
- defer func() {
- if cancel != nil {
- cancel()
- }
- }()
- if err != nil {
- return errs.Wrap(err)
- } else {
- if minioClient.IsOffline() {
- return ErrComponentStart.Wrap("Minio server is offline")
- }
- }
- if exactIP(config.Config.Object.ApiURL) == "127.0.0.1" || exactIP(config.Config.Object.Minio.SignEndpoint) == "127.0.0.1" {
- return ErrConfig.Wrap("apiURL or Minio SignEndpoint endpoint contain 127.0.0.1")
- }
+ // Check for localhost in API URL and Minio SignEndpoint
+ if exactIP(config.Config.Object.ApiURL) == "127.0.0.1" || exactIP(config.Config.Object.Minio.SignEndpoint) == "127.0.0.1" {
+ return "", ErrConfig.Wrap("apiURL or Minio SignEndpoint endpoint contain 127.0.0.1")
}
- return nil
+ return str, nil
}
-func checkRedis() error {
+// checkRedis checks the Redis connection
+func checkRedis() (string, error) {
+ // Prioritize environment variables
+ address := getEnv("REDIS_ADDRESS", strings.Join(config.Config.Redis.Address, ","))
+ username := getEnv("REDIS_USERNAME", config.Config.Redis.Username)
+ password := getEnv("REDIS_PASSWORD", config.Config.Redis.Password)
+
+ // Split address to handle multiple addresses for cluster setup
+ redisAddresses := strings.Split(address, ",")
+
var redisClient redis.UniversalClient
- defer func() {
- if redisClient != nil {
- redisClient.Close()
- }
- }()
- if len(config.Config.Redis.Address) > 1 {
+ if len(redisAddresses) > 1 {
+ // Use cluster client for multiple addresses
redisClient = redis.NewClusterClient(&redis.ClusterOptions{
- Addrs: config.Config.Redis.Address,
- Username: config.Config.Redis.Username,
- Password: config.Config.Redis.Password,
+ Addrs: redisAddresses,
+ Username: username,
+ Password: password,
})
} else {
+ // Use regular client for single address
redisClient = redis.NewClient(&redis.Options{
- Addr: config.Config.Redis.Address[0],
- Username: config.Config.Redis.Username,
- Password: config.Config.Redis.Password,
+ Addr: redisAddresses[0],
+ Username: username,
+ Password: password,
})
}
+ defer redisClient.Close()
+
+ // Ping Redis to check connectivity
_, err := redisClient.Ping(context.Background()).Result()
+ str := "the addr is:" + strings.Join(redisAddresses, ",")
if err != nil {
- return errs.Wrap(err)
+ return "", errs.Wrap(errStr(err, str))
}
- return nil
+ return str, nil
}
-func checkZookeeper() error {
- var c *zk.Conn
- defer func() {
- if c != nil {
- c.Close()
- }
- }()
- c, _, err := zk.Connect(config.Config.Zookeeper.ZkAddr, time.Second)
+// checkZookeeper checks the Zookeeper connection
+func checkZookeeper() (string, error) {
+ // Prioritize environment variables
+ schema := getEnv("ZOOKEEPER_SCHEMA", "digest")
+ address := getEnv("ZOOKEEPER_ADDRESS", strings.Join(config.Config.Zookeeper.ZkAddr, ","))
+ username := getEnv("ZOOKEEPER_USERNAME", config.Config.Zookeeper.Username)
+ password := getEnv("ZOOKEEPER_PASSWORD", config.Config.Zookeeper.Password)
+
+ // Split addresses to handle multiple Zookeeper nodes
+ zookeeperAddresses := strings.Split(address, ",")
+
+ // Connect to Zookeeper
+ str := "the addr is:" + address
+ c, _, err := zk.Connect(zookeeperAddresses, time.Second) // Adjust the timeout as necessary
if err != nil {
- return errs.Wrap(err)
- } else {
- if config.Config.Zookeeper.Username != "" && config.Config.Zookeeper.Password != "" {
- if err := c.AddAuth("digest", []byte(config.Config.Zookeeper.Username+":"+config.Config.Zookeeper.Password)); err != nil {
- return errs.Wrap(err)
- }
- }
- _, _, err = c.Get("/")
- if err != nil {
- return errs.Wrap(err)
+ return "", errs.Wrap(errStr(err, str))
+ }
+ defer c.Close()
+
+ // Set authentication if username and password are provided
+ if username != "" && password != "" {
+ if err := c.AddAuth(schema, []byte(username+":"+password)); err != nil {
+ return "", errs.Wrap(errStr(err, str))
}
}
- return nil
+ // Check if Zookeeper is reachable
+ _, _, err = c.Get("/")
+ if err != nil {
+ return "", errs.Wrap(err, str)
+ }
+
+ return str, nil
}
-func checkKafka() error {
- var kafkaClient sarama.Client
- defer func() {
- if kafkaClient != nil {
- kafkaClient.Close()
- }
- }()
+// checkKafka checks the Kafka connection
+func checkKafka() (string, error) {
+ // Prioritize environment variables
+ username := getEnv("KAFKA_USERNAME", config.Config.Kafka.Username)
+ password := getEnv("KAFKA_PASSWORD", config.Config.Kafka.Password)
+ address := getEnv("KAFKA_ADDRESS", strings.Join(config.Config.Kafka.Addr, ","))
+
+ // Split addresses to handle multiple Kafka brokers
+ kafkaAddresses := strings.Split(address, ",")
+
+ // Configure Kafka client
cfg := sarama.NewConfig()
- if config.Config.Kafka.Username != "" && config.Config.Kafka.Password != "" {
+ if username != "" && password != "" {
cfg.Net.SASL.Enable = true
- cfg.Net.SASL.User = config.Config.Kafka.Username
- cfg.Net.SASL.Password = config.Config.Kafka.Password
+ cfg.Net.SASL.User = username
+ cfg.Net.SASL.Password = password
}
- kafka.SetupTLSConfig(cfg)
- kafkaClient, err := sarama.NewClient(config.Config.Kafka.Addr, cfg)
+ // Additional Kafka setup (e.g., TLS configuration) can be added here
+ // kafka.SetupTLSConfig(cfg)
+
+ // Create Kafka client
+ str := "the addr is:" + address
+ kafkaClient, err := sarama.NewClient(kafkaAddresses, cfg)
if err != nil {
- return errs.Wrap(err)
- } else {
- topics, err := kafkaClient.Topics()
- if err != nil {
- return err
- }
- if !utils.IsContain(config.Config.Kafka.MsgToMongo.Topic, topics) {
- return ErrComponentStart.Wrap(fmt.Sprintf("kafka doesn't contain topic:%v", config.Config.Kafka.MsgToMongo.Topic))
- }
- if !utils.IsContain(config.Config.Kafka.MsgToPush.Topic, topics) {
- return ErrComponentStart.Wrap(fmt.Sprintf("kafka doesn't contain topic:%v", config.Config.Kafka.MsgToPush.Topic))
+ return "", errs.Wrap(errStr(err, str))
+ }
+ defer kafkaClient.Close()
+
+ // Verify if necessary topics exist
+ topics, err := kafkaClient.Topics()
+ if err != nil {
+ return "", errs.Wrap(err)
+ }
+
+ requiredTopics := []string{
+ config.Config.Kafka.MsgToMongo.Topic,
+ config.Config.Kafka.MsgToPush.Topic,
+ config.Config.Kafka.LatestMsgToRedis.Topic,
+ }
+
+ for _, requiredTopic := range requiredTopics {
+ if !isTopicPresent(requiredTopic, topics) {
+ return "", ErrComponentStart.Wrap(fmt.Sprintf("Kafka doesn't contain topic: %v", requiredTopic))
}
- if !utils.IsContain(config.Config.Kafka.LatestMsgToRedis.Topic, topics) {
- return ErrComponentStart.Wrap(fmt.Sprintf("kafka doesn't contain topic:%v", config.Config.Kafka.LatestMsgToRedis.Topic))
+ }
+
+ return str, nil
+}
+
+// isTopicPresent checks if a topic is present in the list of topics
+func isTopicPresent(topic string, topics []string) bool {
+ for _, t := range topics {
+ if t == topic {
+ return true
}
}
+ return false
+}
- return nil
+func colorPrint(colorCode int, format string, a ...interface{}) {
+ fmt.Printf("\x1b[%dm%s\x1b[0m\n", colorCode, fmt.Sprintf(format, a...))
}
func errorPrint(s string) {
- fmt.Printf("\x1b[%dm%v\x1b[0m\n", 31, s)
+ colorPrint(colorRed, "%v", s)
}
func successPrint(s string) {
- fmt.Printf("\x1b[%dm%v\x1b[0m\n", 32, s)
+ colorPrint(colorGreen, "%v", s)
}
func warningPrint(s string) {
- fmt.Printf("\x1b[%dmWarning: But %v\x1b[0m\n", 33, s)
+ colorPrint(colorYellow, "Warning: But %v", s)
+}
+
+func errStr(err error, str string) error {
+ return fmt.Errorf("%v;%s", err, str)
}
diff --git a/tools/data-conversion/chat/cmd/conversion-chat/chat.go b/tools/data-conversion/chat/cmd/conversion-chat/chat.go
index 77c62ee1f..0fc49c782 100644
--- a/tools/data-conversion/chat/cmd/conversion-chat/chat.go
+++ b/tools/data-conversion/chat/cmd/conversion-chat/chat.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 main
import (
diff --git a/tools/data-conversion/chat/conversion/conversion.go b/tools/data-conversion/chat/conversion/conversion.go
index 6032a4569..084fff59c 100644
--- a/tools/data-conversion/chat/conversion/conversion.go
+++ b/tools/data-conversion/chat/conversion/conversion.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 conversion
import (
diff --git a/tools/data-conversion/chat/v2/admin.go b/tools/data-conversion/chat/v2/admin.go
index 7bc1b6c1b..fec11ff5b 100644
--- a/tools/data-conversion/chat/v2/admin.go
+++ b/tools/data-conversion/chat/v2/admin.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 v2
import (
diff --git a/tools/data-conversion/chat/v2/chat.go b/tools/data-conversion/chat/v2/chat.go
index 6690e110b..15cc4797f 100644
--- a/tools/data-conversion/chat/v2/chat.go
+++ b/tools/data-conversion/chat/v2/chat.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 v2
import (
diff --git a/tools/data-conversion/go.mod b/tools/data-conversion/go.mod
index b0d7aea13..37d1776c2 100644
--- a/tools/data-conversion/go.mod
+++ b/tools/data-conversion/go.mod
@@ -3,16 +3,16 @@ module github.com/openimsdk/open-im-server/v3/tools/data-conversion
go 1.19
require (
- github.com/IBM/sarama v1.41.2
- github.com/OpenIMSDK/protocol v0.0.23
- github.com/OpenIMSDK/tools v0.0.14
+ github.com/IBM/sarama v1.42.1
+ github.com/OpenIMSDK/protocol v0.0.33
+ github.com/OpenIMSDK/tools v0.0.20
github.com/golang/protobuf v1.5.3
- github.com/openimsdk/open-im-server/v3 v3.3.2
- golang.org/x/net v0.17.0
- google.golang.org/grpc v1.57.0
+ github.com/openimsdk/open-im-server/v3 v3.4.0
+ golang.org/x/net v0.19.0
+ google.golang.org/grpc v1.60.0
google.golang.org/protobuf v1.31.0
- gorm.io/driver/mysql v1.5.1
- gorm.io/gorm v1.25.4
+ gorm.io/driver/mysql v1.5.2
+ gorm.io/gorm v1.25.5
)
require (
@@ -28,7 +28,7 @@ require (
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.15.3 // indirect
+ github.com/go-playground/validator/v10 v10.15.5 // indirect
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
@@ -63,10 +63,10 @@ require (
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/arch v0.3.0 // indirect
- golang.org/x/crypto v0.14.0 // indirect
- golang.org/x/image v0.12.0 // indirect
- golang.org/x/sys v0.13.0 // indirect
- golang.org/x/text v0.13.0 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect
+ golang.org/x/crypto v0.16.0 // indirect
+ golang.org/x/image v0.13.0 // indirect
+ golang.org/x/sys v0.15.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/tools/data-conversion/go.sum b/tools/data-conversion/go.sum
index 9223f6e36..66f85785b 100644
--- a/tools/data-conversion/go.sum
+++ b/tools/data-conversion/go.sum
@@ -1,9 +1,9 @@
-github.com/IBM/sarama v1.41.2 h1:ZDBZfGPHAD4uuAtSv4U22fRZBgst0eEwGFzLj0fb85c=
-github.com/IBM/sarama v1.41.2/go.mod h1:xdpu7sd6OE1uxNdjYTSKUfY8FaKkJES9/+EyjSgiGQk=
-github.com/OpenIMSDK/protocol v0.0.23 h1:L545aRQez6Ro+AaJB1Z6Mz7ojnDtp41WqASxYveCkcE=
-github.com/OpenIMSDK/protocol v0.0.23/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y=
-github.com/OpenIMSDK/tools v0.0.14 h1:WLof/+WxyPyRST+QkoTKubYCiV73uCLiL8pgnpH/yKQ=
-github.com/OpenIMSDK/tools v0.0.14/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI=
+github.com/IBM/sarama v1.42.1 h1:wugyWa15TDEHh2kvq2gAy1IHLjEjuYOYgXz/ruC/OSQ=
+github.com/IBM/sarama v1.42.1/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ=
+github.com/OpenIMSDK/protocol v0.0.33 h1:T07KWD0jt7IRlrYRujCa+eXmfgcSi8sRgLL8t2ZlHQA=
+github.com/OpenIMSDK/protocol v0.0.33/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y=
+github.com/OpenIMSDK/tools v0.0.20 h1:zBTjQZRJ5lR1FIzP9mtWyAvh5dKsmJXQugi4p8X/97k=
+github.com/OpenIMSDK/tools v0.0.20/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
@@ -34,8 +34,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.15.3 h1:S+sSpunYjNPDuXkWbK+x+bA7iXiW296KG4dL3X7xUZo=
-github.com/go-playground/validator/v10 v10.15.3/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24=
+github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
@@ -47,7 +47,7 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
@@ -103,8 +103,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
-github.com/openimsdk/open-im-server/v3 v3.3.2 h1:uK6glaidrnWlYXFSwzOEq7fXS6jT1OyesUJENZJeptI=
-github.com/openimsdk/open-im-server/v3 v3.3.2/go.mod h1:rqKiCkjav5P7tQmyqaixnMJcayWlM4XtXmwG+cZNw78=
+github.com/openimsdk/open-im-server/v3 v3.4.0 h1:e7nslaWEHYc5xD1A3zHtnhbIWgfgtJSnPGHIqwjARaE=
+github.com/openimsdk/open-im-server/v3 v3.4.0/go.mod h1:HKqjLZSMjD7ec59VV694Yfqnj9SIVotzDSPWgAei2Tg=
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
@@ -146,24 +146,22 @@ golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
-golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
-golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
-golang.org/x/image v0.12.0 h1:w13vZbU4o5rKOFFR8y7M+c4A5jXDC0uXTdHYRP8X2DQ=
-golang.org/x/image v0.12.0/go.mod h1:Lu90jvHG7GfemOIcldsh9A2hS01ocl6oNO7ype5mEnk=
+golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
+golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/image v0.13.0 h1:3cge/F/QTkNLauhf2QoE9zp+7sr+ZcL4HnoZmdwg9sg=
+golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
+golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
+golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -171,8 +169,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
-golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -180,18 +178,17 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
-golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 h1:wukfNtZmZUurLN/atp2hiIeTKn7QJWIQdHzqmsOnAOk=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
-google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw=
-google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a h1:a2MQQVoTo96JC9PMGtGBymLp7+/RzpFc2yX/9WfFg1c=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0=
+google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k=
+google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
@@ -202,9 +199,9 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
-gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
-gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
-gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw=
-gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=
+gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=
+gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
+gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/tools/data-conversion/openim/cmd/conversion-msg/conversion-msg.go b/tools/data-conversion/openim/cmd/conversion-msg/conversion-msg.go
index 338fbf111..f2b9623a6 100644
--- a/tools/data-conversion/openim/cmd/conversion-msg/conversion-msg.go
+++ b/tools/data-conversion/openim/cmd/conversion-msg/conversion-msg.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 main
import (
diff --git a/tools/data-conversion/openim/mysql/cmd.go b/tools/data-conversion/openim/mysql/cmd.go
index 924b0a206..f5a23facb 100644
--- a/tools/data-conversion/openim/mysql/cmd.go
+++ b/tools/data-conversion/openim/mysql/cmd.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 mysql
import (
diff --git a/tools/data-conversion/openim/mysql/conversion/conversion.go b/tools/data-conversion/openim/mysql/conversion/conversion.go
index 54cf90edf..f371654df 100644
--- a/tools/data-conversion/openim/mysql/conversion/conversion.go
+++ b/tools/data-conversion/openim/mysql/conversion/conversion.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 conversion
import (
diff --git a/tools/data-conversion/openim/mysql/v2/model_struct.go b/tools/data-conversion/openim/mysql/v2/model_struct.go
index 9da33f2a5..f05b84977 100644
--- a/tools/data-conversion/openim/mysql/v2/model_struct.go
+++ b/tools/data-conversion/openim/mysql/v2/model_struct.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 db
import "time"
diff --git a/tools/data-conversion/openim/mysql/v3/log.go b/tools/data-conversion/openim/mysql/v3/log.go
index 5904a790e..22198ca7c 100644
--- a/tools/data-conversion/openim/mysql/v3/log.go
+++ b/tools/data-conversion/openim/mysql/v3/log.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 relation
import (
diff --git a/tools/data-conversion/openim/proto/msg/msg.proto b/tools/data-conversion/openim/proto/msg/msg.proto
index d2fe5337e..3149a7337 100644
--- a/tools/data-conversion/openim/proto/msg/msg.proto
+++ b/tools/data-conversion/openim/proto/msg/msg.proto
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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.
+
syntax = "proto3";
import "Open-IM-Server/pkg/proto/sdk_ws/ws.proto";
import "Open-IM-Server/pkg/proto/sdk_ws/wrappers.proto";
diff --git a/tools/data-conversion/openim/proto/sdk_ws/ws.proto b/tools/data-conversion/openim/proto/sdk_ws/ws.proto
index c8ef680c9..95b956b0e 100644
--- a/tools/data-conversion/openim/proto/sdk_ws/ws.proto
+++ b/tools/data-conversion/openim/proto/sdk_ws/ws.proto
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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.
+
syntax = "proto3";
import "Open-IM-Server/pkg/proto/sdk_ws/wrappers.proto";
option go_package = "Open_IM/pkg/proto/sdk_ws;server_api_params";
diff --git a/tools/data-conversion/utils/find_insert.go b/tools/data-conversion/utils/find_insert.go
index 4789cd554..150820fce 100644
--- a/tools/data-conversion/utils/find_insert.go
+++ b/tools/data-conversion/utils/find_insert.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 utils
import (
diff --git a/tools/data-conversion/utils/time.go b/tools/data-conversion/utils/time.go
index e2dac4bb8..9077a3d88 100644
--- a/tools/data-conversion/utils/time.go
+++ b/tools/data-conversion/utils/time.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 utils
import "time"
diff --git a/tools/infra/infra.go b/tools/infra/infra.go
index f8d8c7522..c14b92fa3 100644
--- a/tools/infra/infra.go
+++ b/tools/infra/infra.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 main
import (
diff --git a/tools/up35/go.mod b/tools/up35/go.mod
index 5ae3907bf..23163a4dc 100644
--- a/tools/up35/go.mod
+++ b/tools/up35/go.mod
@@ -1,51 +1,3 @@
module github.com/openimsdk/open-im-server/v3/tools/up35
go 1.19
-
-require (
- github.com/go-sql-driver/mysql v1.7.1
- github.com/openimsdk/open-im-server/v3 v3.5.0
- github.com/openimsdk/open-im-server/v3/tools/data-conversion v0.0.0-00010101000000-000000000000
- go.mongodb.org/mongo-driver v1.12.1
- gopkg.in/yaml.v3 v3.0.1
- gorm.io/driver/mysql v1.5.1
- gorm.io/gorm v1.25.4
-)
-
-require (
- github.com/OpenIMSDK/protocol v0.0.31 // indirect
- github.com/OpenIMSDK/tools v0.0.18 // indirect
- github.com/bwmarrin/snowflake v0.3.0 // indirect
- github.com/golang/protobuf v1.5.3 // indirect
- github.com/golang/snappy v0.0.4 // indirect
- github.com/jinzhu/copier v0.4.0 // indirect
- github.com/jinzhu/inflection v1.0.0 // indirect
- github.com/jinzhu/now v1.1.5 // indirect
- github.com/klauspost/compress v1.16.7 // indirect
- github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
- github.com/lestrrat-go/strftime v1.0.6 // indirect
- github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
- github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
- github.com/pkg/errors v0.9.1 // indirect
- github.com/xdg-go/pbkdf2 v1.0.0 // indirect
- github.com/xdg-go/scram v1.1.2 // indirect
- github.com/xdg-go/stringprep v1.0.4 // indirect
- github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
- go.uber.org/atomic v1.7.0 // indirect
- go.uber.org/multierr v1.6.0 // indirect
- go.uber.org/zap v1.24.0 // indirect
- golang.org/x/crypto v0.14.0 // indirect
- golang.org/x/image v0.13.0 // indirect
- golang.org/x/net v0.17.0 // indirect
- golang.org/x/sync v0.4.0 // indirect
- golang.org/x/sys v0.14.0 // indirect
- golang.org/x/text v0.13.0 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect
- google.golang.org/grpc v1.59.0 // indirect
- google.golang.org/protobuf v1.31.0 // indirect
-)
-
-replace (
- github.com/openimsdk/open-im-server/v3 => ./../../../open-im-server
- github.com/openimsdk/open-im-server/v3/tools/data-conversion => ./../data-conversion
-)
diff --git a/tools/up35/pkg/convert.go b/tools/up35/pkg/convert.go
new file mode 100644
index 000000000..24d3a2781
--- /dev/null
+++ b/tools/up35/pkg/convert.go
@@ -0,0 +1,242 @@
+// Copyright © 2023 OpenIM. 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 pkg
+
+import (
+ "time"
+
+ mongoModel "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation"
+ mysqlModel "github.com/openimsdk/open-im-server/v3/tools/data-conversion/openim/mysql/v3"
+ mongoModelRtc "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/table"
+ mysqlModelRtc "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mysql"
+)
+
+type convert struct{}
+
+func (convert) User(v mysqlModel.UserModel) mongoModel.UserModel {
+ return mongoModel.UserModel{
+ UserID: v.UserID,
+ Nickname: v.Nickname,
+ FaceURL: v.FaceURL,
+ Ex: v.Ex,
+ AppMangerLevel: v.AppMangerLevel,
+ GlobalRecvMsgOpt: v.GlobalRecvMsgOpt,
+ CreateTime: v.CreateTime,
+ }
+}
+
+func (convert) Friend(v mysqlModel.FriendModel) mongoModel.FriendModel {
+ return mongoModel.FriendModel{
+ OwnerUserID: v.OwnerUserID,
+ FriendUserID: v.FriendUserID,
+ Remark: v.Remark,
+ CreateTime: v.CreateTime,
+ AddSource: v.AddSource,
+ OperatorUserID: v.OperatorUserID,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) FriendRequest(v mysqlModel.FriendRequestModel) mongoModel.FriendRequestModel {
+ return mongoModel.FriendRequestModel{
+ FromUserID: v.FromUserID,
+ ToUserID: v.ToUserID,
+ HandleResult: v.HandleResult,
+ ReqMsg: v.ReqMsg,
+ CreateTime: v.CreateTime,
+ HandlerUserID: v.HandlerUserID,
+ HandleMsg: v.HandleMsg,
+ HandleTime: v.HandleTime,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) Black(v mysqlModel.BlackModel) mongoModel.BlackModel {
+ return mongoModel.BlackModel{
+ OwnerUserID: v.OwnerUserID,
+ BlockUserID: v.BlockUserID,
+ CreateTime: v.CreateTime,
+ AddSource: v.AddSource,
+ OperatorUserID: v.OperatorUserID,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) Group(v mysqlModel.GroupModel) mongoModel.GroupModel {
+ return mongoModel.GroupModel{
+ GroupID: v.GroupID,
+ GroupName: v.GroupName,
+ Notification: v.Notification,
+ Introduction: v.Introduction,
+ FaceURL: v.FaceURL,
+ CreateTime: v.CreateTime,
+ Ex: v.Ex,
+ Status: v.Status,
+ CreatorUserID: v.CreatorUserID,
+ GroupType: v.GroupType,
+ NeedVerification: v.NeedVerification,
+ LookMemberInfo: v.LookMemberInfo,
+ ApplyMemberFriend: v.ApplyMemberFriend,
+ NotificationUpdateTime: v.NotificationUpdateTime,
+ NotificationUserID: v.NotificationUserID,
+ }
+}
+
+func (convert) GroupMember(v mysqlModel.GroupMemberModel) mongoModel.GroupMemberModel {
+ return mongoModel.GroupMemberModel{
+ GroupID: v.GroupID,
+ UserID: v.UserID,
+ Nickname: v.Nickname,
+ FaceURL: v.FaceURL,
+ RoleLevel: v.RoleLevel,
+ JoinTime: v.JoinTime,
+ JoinSource: v.JoinSource,
+ InviterUserID: v.InviterUserID,
+ OperatorUserID: v.OperatorUserID,
+ MuteEndTime: v.MuteEndTime,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) GroupRequest(v mysqlModel.GroupRequestModel) mongoModel.GroupRequestModel {
+ return mongoModel.GroupRequestModel{
+ UserID: v.UserID,
+ GroupID: v.GroupID,
+ HandleResult: v.HandleResult,
+ ReqMsg: v.ReqMsg,
+ HandledMsg: v.HandledMsg,
+ ReqTime: v.ReqTime,
+ HandleUserID: v.HandleUserID,
+ HandledTime: v.HandledTime,
+ JoinSource: v.JoinSource,
+ InviterUserID: v.InviterUserID,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) Conversation(v mysqlModel.ConversationModel) mongoModel.ConversationModel {
+ return mongoModel.ConversationModel{
+ OwnerUserID: v.OwnerUserID,
+ ConversationID: v.ConversationID,
+ ConversationType: v.ConversationType,
+ UserID: v.UserID,
+ GroupID: v.GroupID,
+ RecvMsgOpt: v.RecvMsgOpt,
+ IsPinned: v.IsPinned,
+ IsPrivateChat: v.IsPrivateChat,
+ BurnDuration: v.BurnDuration,
+ GroupAtType: v.GroupAtType,
+ AttachedInfo: v.AttachedInfo,
+ Ex: v.Ex,
+ MaxSeq: v.MaxSeq,
+ MinSeq: v.MinSeq,
+ CreateTime: v.CreateTime,
+ IsMsgDestruct: v.IsMsgDestruct,
+ MsgDestructTime: v.MsgDestructTime,
+ LatestMsgDestructTime: v.LatestMsgDestructTime,
+ }
+}
+
+func (convert) Object(engine string) func(v mysqlModel.ObjectModel) mongoModel.ObjectModel {
+ return func(v mysqlModel.ObjectModel) mongoModel.ObjectModel {
+ return mongoModel.ObjectModel{
+ Name: v.Name,
+ UserID: v.UserID,
+ Hash: v.Hash,
+ Engine: engine,
+ Key: v.Key,
+ Size: v.Size,
+ ContentType: v.ContentType,
+ Group: v.Cause,
+ CreateTime: v.CreateTime,
+ }
+ }
+}
+
+func (convert) Log(v mysqlModel.Log) mongoModel.LogModel {
+ return mongoModel.LogModel{
+ LogID: v.LogID,
+ Platform: v.Platform,
+ UserID: v.UserID,
+ CreateTime: v.CreateTime,
+ Url: v.Url,
+ FileName: v.FileName,
+ SystemType: v.SystemType,
+ Version: v.Version,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) SignalModel(v mysqlModelRtc.SignalModel) mongoModelRtc.SignalModel {
+ return mongoModelRtc.SignalModel{
+ SID: v.SID,
+ InviterUserID: v.InviterUserID,
+ CustomData: v.CustomData,
+ GroupID: v.GroupID,
+ RoomID: v.RoomID,
+ Timeout: v.Timeout,
+ MediaType: v.MediaType,
+ PlatformID: v.PlatformID,
+ SessionType: v.SessionType,
+ InitiateTime: v.InitiateTime,
+ EndTime: v.EndTime,
+ FileURL: v.FileURL,
+ Title: v.Title,
+ Desc: v.Desc,
+ Ex: v.Ex,
+ IOSPushSound: v.IOSPushSound,
+ IOSBadgeCount: v.IOSBadgeCount,
+ SignalInfo: v.SignalInfo,
+ }
+}
+
+func (convert) SignalInvitationModel(v mysqlModelRtc.SignalInvitationModel) mongoModelRtc.SignalInvitationModel {
+ return mongoModelRtc.SignalInvitationModel{
+ SID: v.SID,
+ UserID: v.UserID,
+ Status: v.Status,
+ InitiateTime: v.InitiateTime,
+ HandleTime: v.HandleTime,
+ }
+}
+
+func (convert) Meeting(v mysqlModelRtc.MeetingInfo) mongoModelRtc.MeetingInfo {
+ return mongoModelRtc.MeetingInfo{
+ RoomID: v.RoomID,
+ MeetingName: v.MeetingName,
+ HostUserID: v.HostUserID,
+ Status: v.Status,
+ StartTime: time.Unix(v.StartTime, 0),
+ EndTime: time.Unix(v.EndTime, 0),
+ CreateTime: v.CreateTime,
+ Ex: v.Ex,
+ }
+}
+
+func (convert) MeetingInvitationInfo(v mysqlModelRtc.MeetingInvitationInfo) mongoModelRtc.MeetingInvitationInfo {
+ return mongoModelRtc.MeetingInvitationInfo{
+ RoomID: v.RoomID,
+ UserID: v.UserID,
+ CreateTime: v.CreateTime,
+ }
+}
+
+func (convert) MeetingVideoRecord(v mysqlModelRtc.MeetingVideoRecord) mongoModelRtc.MeetingVideoRecord {
+ return mongoModelRtc.MeetingVideoRecord{
+ RoomID: v.RoomID,
+ FileURL: v.FileURL,
+ CreateTime: v.CreateTime,
+ }
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/mgo/meeting.go b/tools/up35/pkg/internal/rtc/mongo/mgo/meeting.go
new file mode 100644
index 000000000..fd0f2818b
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/mgo/meeting.go
@@ -0,0 +1,102 @@
+// Copyright © 2023 OpenIM. 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 mgo
+
+import (
+ "context"
+ "time"
+
+ "github.com/OpenIMSDK/tools/mgoutil"
+ "github.com/OpenIMSDK/tools/pagination"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+ "go.mongodb.org/mongo-driver/mongo/options"
+
+ "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/table"
+)
+
+func NewMeeting(db *mongo.Database) (table.MeetingInterface, error) {
+ coll := db.Collection("meeting")
+ _, err := coll.Indexes().CreateMany(context.Background(), []mongo.IndexModel{
+ {
+ Keys: bson.D{
+ {Key: "room_id", Value: 1},
+ },
+ Options: options.Index().SetUnique(true),
+ },
+ {
+ Keys: bson.D{
+ {Key: "host_user_id", Value: 1},
+ },
+ },
+ {
+ Keys: bson.D{
+ {Key: "create_time", Value: -1},
+ },
+ },
+ })
+ if err != nil {
+ return nil, err
+ }
+ return &meeting{coll: coll}, nil
+}
+
+type meeting struct {
+ coll *mongo.Collection
+}
+
+func (x *meeting) Find(ctx context.Context, roomIDs []string) ([]*table.MeetingInfo, error) {
+ return mgoutil.Find[*table.MeetingInfo](ctx, x.coll, bson.M{"room_id": bson.M{"$in": roomIDs}})
+}
+
+func (x *meeting) CreateMeetingInfo(ctx context.Context, meetingInfo *table.MeetingInfo) error {
+ return mgoutil.InsertMany(ctx, x.coll, []*table.MeetingInfo{meetingInfo})
+}
+
+func (x *meeting) UpdateMeetingInfo(ctx context.Context, roomID string, update map[string]any) error {
+ if len(update) == 0 {
+ return nil
+ }
+ return mgoutil.UpdateOne(ctx, x.coll, bson.M{"room_id": roomID}, bson.M{"$set": update}, false)
+}
+
+func (x *meeting) GetUnCompleteMeetingIDList(ctx context.Context, roomIDs []string) ([]string, error) {
+ if len(roomIDs) == 0 {
+ return nil, nil
+ }
+ return mgoutil.Find[string](ctx, x.coll, bson.M{"room_id": bson.M{"$in": roomIDs}, "status": 0}, options.Find().SetProjection(bson.M{"_id": 0, "room_id": 1}))
+}
+
+func (x *meeting) Delete(ctx context.Context, roomIDs []string) error {
+ return mgoutil.DeleteMany(ctx, x.coll, bson.M{"room_id": bson.M{"$in": roomIDs}})
+}
+
+func (x *meeting) GetMeetingRecords(ctx context.Context, hostUserID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []*table.MeetingInfo, error) {
+ var and []bson.M
+ if hostUserID != "" {
+ and = append(and, bson.M{"host_user_id": hostUserID})
+ }
+ if !startTime.IsZero() {
+ and = append(and, bson.M{"create_time": bson.M{"$gte": startTime}})
+ }
+ if !endTime.IsZero() {
+ and = append(and, bson.M{"create_time": bson.M{"$lte": endTime}})
+ }
+ filter := bson.M{}
+ if len(and) > 0 {
+ filter["$and"] = and
+ }
+ return mgoutil.FindPage[*table.MeetingInfo](ctx, x.coll, filter, pagination, options.Find().SetSort(bson.M{"create_time": -1}))
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/mgo/meeting_invitation.go b/tools/up35/pkg/internal/rtc/mongo/mgo/meeting_invitation.go
new file mode 100644
index 000000000..9926748bf
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/mgo/meeting_invitation.go
@@ -0,0 +1,97 @@
+// Copyright © 2023 OpenIM. 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 mgo
+
+import (
+ "context"
+ "time"
+
+ "github.com/OpenIMSDK/tools/mgoutil"
+ "github.com/OpenIMSDK/tools/pagination"
+ "github.com/OpenIMSDK/tools/utils"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+ "go.mongodb.org/mongo-driver/mongo/options"
+
+ "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/table"
+)
+
+func NewMeetingInvitation(db *mongo.Database) (table.MeetingInvitationInterface, error) {
+ coll := db.Collection("meeting_invitation")
+ _, err := coll.Indexes().CreateMany(context.Background(), []mongo.IndexModel{
+ {
+ Keys: bson.D{
+ {Key: "room_id", Value: 1},
+ {Key: "user_id", Value: 1},
+ },
+ Options: options.Index().SetUnique(true),
+ },
+ {
+ Keys: bson.D{
+ {Key: "create_time", Value: -1},
+ },
+ },
+ })
+ if err != nil {
+ return nil, err
+ }
+ return &meetingInvitation{coll: coll}, nil
+}
+
+type meetingInvitation struct {
+ coll *mongo.Collection
+}
+
+func (x *meetingInvitation) FindUserIDs(ctx context.Context, roomID string) ([]string, error) {
+ return mgoutil.Find[string](ctx, x.coll, bson.M{"room_id": roomID}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1}))
+}
+
+func (x *meetingInvitation) CreateMeetingInvitationInfo(ctx context.Context, roomID string, inviteeUserIDs []string) error {
+ now := time.Now()
+ return mgoutil.InsertMany(ctx, x.coll, utils.Slice(inviteeUserIDs, func(userID string) *table.MeetingInvitationInfo {
+ return &table.MeetingInvitationInfo{
+ RoomID: roomID,
+ UserID: userID,
+ CreateTime: now,
+ }
+ }))
+}
+
+func (x *meetingInvitation) GetUserInvitedMeetingIDs(ctx context.Context, userID string) (meetingIDs []string, err error) {
+ fiveDaysAgo := time.Now().AddDate(0, 0, -5)
+ return mgoutil.Find[string](
+ ctx,
+ x.coll,
+ bson.M{"user_id": userID, "create_time": bson.M{"$gte": fiveDaysAgo}},
+ options.Find().SetSort(bson.M{"create_time": -1}).SetProjection(bson.M{"_id": 0, "room_id": 1}),
+ )
+}
+
+func (x *meetingInvitation) Delete(ctx context.Context, roomIDs []string) error {
+ return mgoutil.DeleteMany(ctx, x.coll, bson.M{"room_id": bson.M{"$in": roomIDs}})
+}
+
+func (x *meetingInvitation) GetMeetingRecords(ctx context.Context, joinedUserID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []string, error) {
+ var and []bson.M
+ and = append(and, bson.M{"user_id": joinedUserID})
+ if !startTime.IsZero() {
+ and = append(and, bson.M{"create_time": bson.M{"$gte": startTime}})
+ }
+ if !endTime.IsZero() {
+ and = append(and, bson.M{"create_time": bson.M{"$lte": endTime}})
+ }
+ opt := options.Find().SetSort(bson.M{"create_time": -1}).SetProjection(bson.M{"_id": 0, "room_id": 1})
+ return mgoutil.FindPage[string](ctx, x.coll, bson.M{"$and": and}, pagination, opt)
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/mgo/meeting_record.go b/tools/up35/pkg/internal/rtc/mongo/mgo/meeting_record.go
new file mode 100644
index 000000000..4e9dc5e0f
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/mgo/meeting_record.go
@@ -0,0 +1,48 @@
+// Copyright © 2023 OpenIM. 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 mgo
+
+import (
+ "context"
+
+ "github.com/OpenIMSDK/tools/mgoutil"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+
+ "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/table"
+)
+
+func NewMeetingRecord(db *mongo.Database) (table.MeetingRecordInterface, error) {
+ coll := db.Collection("meeting_record")
+ _, err := coll.Indexes().CreateMany(context.Background(), []mongo.IndexModel{
+ {
+ Keys: bson.D{
+ {Key: "room_id", Value: 1},
+ },
+ },
+ })
+ if err != nil {
+ return nil, err
+ }
+ return &meetingRecord{coll: coll}, nil
+}
+
+type meetingRecord struct {
+ coll *mongo.Collection
+}
+
+func (x *meetingRecord) CreateMeetingVideoRecord(ctx context.Context, meetingVideoRecord *table.MeetingVideoRecord) error {
+ return mgoutil.InsertMany(ctx, x.coll, []*table.MeetingVideoRecord{meetingVideoRecord})
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/mgo/signal.go b/tools/up35/pkg/internal/rtc/mongo/mgo/signal.go
new file mode 100644
index 000000000..47fd3fb02
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/mgo/signal.go
@@ -0,0 +1,105 @@
+// Copyright © 2023 OpenIM. 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 mgo
+
+import (
+ "context"
+ "time"
+
+ "github.com/OpenIMSDK/tools/mgoutil"
+ "github.com/OpenIMSDK/tools/pagination"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+ "go.mongodb.org/mongo-driver/mongo/options"
+
+ "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/table"
+)
+
+func NewSignal(db *mongo.Database) (table.SignalInterface, error) {
+ coll := db.Collection("signal")
+ _, err := coll.Indexes().CreateMany(context.Background(), []mongo.IndexModel{
+ {
+ Keys: bson.D{
+ {Key: "sid", Value: 1},
+ },
+ Options: options.Index().SetUnique(true),
+ },
+ {
+ Keys: bson.D{
+ {Key: "inviter_user_id", Value: 1},
+ },
+ },
+ {
+ Keys: bson.D{
+ {Key: "initiate_time", Value: -1},
+ },
+ },
+ })
+ if err != nil {
+ return nil, err
+ }
+ return &signal{coll: coll}, nil
+}
+
+type signal struct {
+ coll *mongo.Collection
+}
+
+func (x *signal) Find(ctx context.Context, sids []string) ([]*table.SignalModel, error) {
+ return mgoutil.Find[*table.SignalModel](ctx, x.coll, bson.M{"sid": bson.M{"$in": sids}})
+}
+
+func (x *signal) CreateSignal(ctx context.Context, signalModel *table.SignalModel) error {
+ return mgoutil.InsertMany(ctx, x.coll, []*table.SignalModel{signalModel})
+}
+
+func (x *signal) Update(ctx context.Context, sid string, update map[string]any) error {
+ if len(update) == 0 {
+ return nil
+ }
+ return mgoutil.UpdateOne(ctx, x.coll, bson.M{"sid": sid}, bson.M{"$set": update}, false)
+}
+
+func (x *signal) UpdateSignalFileURL(ctx context.Context, sID, fileURL string) error {
+ return x.Update(ctx, sID, map[string]any{"file_url": fileURL})
+}
+
+func (x *signal) UpdateSignalEndTime(ctx context.Context, sID string, endTime time.Time) error {
+ return x.Update(ctx, sID, map[string]any{"end_time": endTime})
+}
+
+func (x *signal) Delete(ctx context.Context, sids []string) error {
+ if len(sids) == 0 {
+ return nil
+ }
+ return mgoutil.DeleteMany(ctx, x.coll, bson.M{"sid": bson.M{"$in": sids}})
+}
+
+func (x *signal) PageSignal(ctx context.Context, sesstionType int32, sendID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []*table.SignalModel, error) {
+ var and []bson.M
+ if !startTime.IsZero() {
+ and = append(and, bson.M{"initiate_time": bson.M{"$gte": startTime}})
+ }
+ if !endTime.IsZero() {
+ and = append(and, bson.M{"initiate_time": bson.M{"$lte": endTime}})
+ }
+ if sesstionType != 0 {
+ and = append(and, bson.M{"sesstion_type": sesstionType})
+ }
+ if sendID != "" {
+ and = append(and, bson.M{"inviter_user_id": sendID})
+ }
+ return mgoutil.FindPage[*table.SignalModel](ctx, x.coll, bson.M{"$and": and}, pagination, options.Find().SetSort(bson.M{"initiate_time": -1}))
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/mgo/signal_invitation.go b/tools/up35/pkg/internal/rtc/mongo/mgo/signal_invitation.go
new file mode 100644
index 000000000..1f76381e9
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/mgo/signal_invitation.go
@@ -0,0 +1,94 @@
+// Copyright © 2023 OpenIM. 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 mgo
+
+import (
+ "context"
+ "time"
+
+ "github.com/OpenIMSDK/tools/mgoutil"
+ "github.com/OpenIMSDK/tools/pagination"
+ "github.com/OpenIMSDK/tools/utils"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+ "go.mongodb.org/mongo-driver/mongo/options"
+
+ "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/table"
+)
+
+func NewSignalInvitation(db *mongo.Database) (table.SignalInvitationInterface, error) {
+ coll := db.Collection("signal_invitation")
+ _, err := coll.Indexes().CreateMany(context.Background(), []mongo.IndexModel{
+ {
+ Keys: bson.D{
+ {Key: "sid", Value: 1},
+ {Key: "user_id", Value: 1},
+ },
+ Options: options.Index().SetUnique(true),
+ },
+ {
+ Keys: bson.D{
+ {Key: "initiate_time", Value: -1},
+ },
+ },
+ })
+ if err != nil {
+ return nil, err
+ }
+ return &signalInvitation{coll: coll}, nil
+}
+
+type signalInvitation struct {
+ coll *mongo.Collection
+}
+
+func (x *signalInvitation) Find(ctx context.Context, sid string) ([]*table.SignalInvitationModel, error) {
+ return mgoutil.Find[*table.SignalInvitationModel](ctx, x.coll, bson.M{"sid": sid})
+}
+
+func (x *signalInvitation) CreateSignalInvitation(ctx context.Context, sid string, inviteeUserIDs []string) error {
+ now := time.Now()
+ return mgoutil.InsertMany(ctx, x.coll, utils.Slice(inviteeUserIDs, func(userID string) *table.SignalInvitationModel {
+ return &table.SignalInvitationModel{
+ UserID: userID,
+ SID: sid,
+ InitiateTime: now,
+ HandleTime: time.Unix(0, 0),
+ }
+ }))
+}
+
+func (x *signalInvitation) HandleSignalInvitation(ctx context.Context, sID, InviteeUserID string, status int32) error {
+ return mgoutil.UpdateOne(ctx, x.coll, bson.M{"sid": sID, "user_id": InviteeUserID}, bson.M{"$set": bson.M{"status": status, "handle_time": time.Now()}}, true)
+}
+
+func (x *signalInvitation) PageSID(ctx context.Context, recvID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []string, error) {
+ var and []bson.M
+ and = append(and, bson.M{"user_id": recvID})
+ if !startTime.IsZero() {
+ and = append(and, bson.M{"initiate_time": bson.M{"$gte": startTime}})
+ }
+ if !endTime.IsZero() {
+ and = append(and, bson.M{"initiate_time": bson.M{"$lte": endTime}})
+ }
+ return mgoutil.FindPage[string](ctx, x.coll, bson.M{"$and": and}, pagination, options.Find().SetProjection(bson.M{"_id": 0, "sid": 1}).SetSort(bson.M{"initiate_time": -1}))
+}
+
+func (x *signalInvitation) Delete(ctx context.Context, sids []string) error {
+ if len(sids) == 0 {
+ return nil
+ }
+ return mgoutil.DeleteMany(ctx, x.coll, bson.M{"sid": bson.M{"$in": sids}})
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/table/meeting.go b/tools/up35/pkg/internal/rtc/mongo/table/meeting.go
new file mode 100644
index 000000000..6ff387bbb
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/table/meeting.go
@@ -0,0 +1,66 @@
+// Copyright © 2023 OpenIM. 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 table
+
+import (
+ "context"
+ "time"
+
+ "github.com/OpenIMSDK/tools/pagination"
+)
+
+type MeetingInfo struct {
+ RoomID string `bson:"room_id"`
+ MeetingName string `bson:"meeting_name"`
+ HostUserID string `bson:"host_user_id"`
+ Status int64 `bson:"status"`
+ StartTime time.Time `bson:"start_time"`
+ EndTime time.Time `bson:"end_time"`
+ CreateTime time.Time `bson:"create_time"`
+ Ex string `bson:"ex"`
+}
+
+type MeetingInterface interface {
+ Find(ctx context.Context, roomIDs []string) ([]*MeetingInfo, error)
+ CreateMeetingInfo(ctx context.Context, meetingInfo *MeetingInfo) error
+ UpdateMeetingInfo(ctx context.Context, roomID string, update map[string]any) error
+ GetUnCompleteMeetingIDList(ctx context.Context, roomIDs []string) ([]string, error)
+ Delete(ctx context.Context, roomIDs []string) error
+ GetMeetingRecords(ctx context.Context, hostUserID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []*MeetingInfo, error)
+}
+
+type MeetingInvitationInfo struct {
+ RoomID string `bson:"room_id"`
+ UserID string `bson:"user_id"`
+ CreateTime time.Time `bson:"create_time"`
+}
+
+type MeetingInvitationInterface interface {
+ FindUserIDs(ctx context.Context, roomID string) ([]string, error)
+ CreateMeetingInvitationInfo(ctx context.Context, roomID string, inviteeUserIDs []string) error
+ GetUserInvitedMeetingIDs(ctx context.Context, userID string) (meetingIDs []string, err error)
+ Delete(ctx context.Context, roomIDs []string) error
+ GetMeetingRecords(ctx context.Context, joinedUserID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []string, error)
+}
+
+type MeetingVideoRecord struct {
+ RoomID string `bson:"room_id"`
+ FileURL string `bson:"file_url"`
+ CreateTime time.Time `bson:"create_time"`
+}
+
+type MeetingRecordInterface interface {
+ CreateMeetingVideoRecord(ctx context.Context, meetingVideoRecord *MeetingVideoRecord) error
+}
diff --git a/tools/up35/pkg/internal/rtc/mongo/table/signal.go b/tools/up35/pkg/internal/rtc/mongo/table/signal.go
new file mode 100644
index 000000000..8d8aa96ed
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mongo/table/signal.go
@@ -0,0 +1,88 @@
+// Copyright © 2023 OpenIM. 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 table
+
+import (
+ "context"
+ "time"
+
+ "github.com/OpenIMSDK/tools/errs"
+ "github.com/OpenIMSDK/tools/pagination"
+ "github.com/redis/go-redis/v9"
+ "go.mongodb.org/mongo-driver/mongo"
+)
+
+type SignalModel struct {
+ SID string `bson:"sid"`
+ InviterUserID string `bson:"inviter_user_id"`
+ CustomData string `bson:"custom_data"`
+ GroupID string `bson:"group_id"`
+ RoomID string `bson:"room_id"`
+ Timeout int32 `bson:"timeout"`
+ MediaType string `bson:"media_type"`
+ PlatformID int32 `bson:"platform_id"`
+ SessionType int32 `bson:"session_type"`
+ InitiateTime time.Time `bson:"initiate_time"`
+ EndTime time.Time `bson:"end_time"`
+ FileURL string `bson:"file_url"`
+
+ Title string `bson:"title"`
+ Desc string `bson:"desc"`
+ Ex string `bson:"ex"`
+ IOSPushSound string `bson:"ios_push_sound"`
+ IOSBadgeCount bool `bson:"ios_badge_count"`
+ SignalInfo string `bson:"signal_info"`
+}
+
+type SignalInterface interface {
+ Find(ctx context.Context, sids []string) ([]*SignalModel, error)
+ CreateSignal(ctx context.Context, signalModel *SignalModel) error
+ Update(ctx context.Context, sid string, update map[string]any) error
+ UpdateSignalFileURL(ctx context.Context, sID, fileURL string) error
+ UpdateSignalEndTime(ctx context.Context, sID string, endTime time.Time) error
+ Delete(ctx context.Context, sids []string) error
+ PageSignal(ctx context.Context, sesstionType int32, sendID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []*SignalModel, error)
+}
+
+type SignalInvitationModel struct {
+ SID string `bson:"sid"`
+ UserID string `bson:"user_id"`
+ Status int32 `bson:"status"`
+ InitiateTime time.Time `bson:"initiate_time"`
+ HandleTime time.Time `bson:"handle_time"`
+}
+
+type SignalInvitationInterface interface {
+ Find(ctx context.Context, sid string) ([]*SignalInvitationModel, error)
+ CreateSignalInvitation(ctx context.Context, sid string, inviteeUserIDs []string) error
+ HandleSignalInvitation(ctx context.Context, sID, InviteeUserID string, status int32) error
+ PageSID(ctx context.Context, recvID string, startTime, endTime time.Time, pagination pagination.Pagination) (int64, []string, error)
+ Delete(ctx context.Context, sids []string) error
+}
+
+func IsNotFound(err error) bool {
+ if err == nil {
+ return false
+ }
+ err = errs.Unwrap(err)
+ return err == mongo.ErrNoDocuments || err == redis.Nil
+}
+
+func IsDuplicate(err error) bool {
+ if err == nil {
+ return false
+ }
+ return mongo.IsDuplicateKeyError(errs.Unwrap(err))
+}
diff --git a/tools/up35/pkg/internal/rtc/mysql/meeting.go b/tools/up35/pkg/internal/rtc/mysql/meeting.go
new file mode 100644
index 000000000..71515c3b7
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mysql/meeting.go
@@ -0,0 +1,54 @@
+// Copyright © 2023 OpenIM. 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 relation
+
+import (
+ "time"
+)
+
+type MeetingInfo struct {
+ RoomID string `gorm:"column:room_id;primary_key;size:128;index:room_id;index:status,priority:1"`
+ MeetingName string `gorm:"column:meeting_name;size:64"`
+ HostUserID string `gorm:"column:host_user_id;size:64;index:host_user_id"`
+ Status int64 `gorm:"column:status;index:status,priority:2"`
+ StartTime int64 `gorm:"column:start_time"`
+ EndTime int64 `gorm:"column:end_time"`
+ CreateTime time.Time `gorm:"column:create_time"`
+ Ex string `gorm:"column:ex;size:1024"`
+}
+
+func (MeetingInfo) TableName() string {
+ return "meeting"
+}
+
+type MeetingInvitationInfo struct {
+ RoomID string `gorm:"column:room_id;primary_key;size:128"`
+ UserID string `gorm:"column:user_id;primary_key;size:64;index:user_id"`
+ CreateTime time.Time `gorm:"column:create_time"`
+}
+
+func (MeetingInvitationInfo) TableName() string {
+ return "meeting_invitation"
+}
+
+type MeetingVideoRecord struct {
+ RoomID string `gorm:"column:room_id;size:128"`
+ FileURL string `gorm:"column:file_url"`
+ CreateTime time.Time `gorm:"column:create_time"`
+}
+
+func (MeetingVideoRecord) TableName() string {
+ return "meeting_video_record"
+}
diff --git a/tools/up35/pkg/internal/rtc/mysql/signal.go b/tools/up35/pkg/internal/rtc/mysql/signal.go
new file mode 100644
index 000000000..c546360a4
--- /dev/null
+++ b/tools/up35/pkg/internal/rtc/mysql/signal.go
@@ -0,0 +1,57 @@
+// Copyright © 2023 OpenIM. 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 relation
+
+import (
+ "time"
+)
+
+type SignalModel struct {
+ SID string `gorm:"column:sid;type:char(128);primary_key"`
+ InviterUserID string `gorm:"column:inviter_user_id;type:char(64);index:inviter_user_id_index"`
+ CustomData string `gorm:"column:custom_data;type:text"`
+ GroupID string `gorm:"column:group_id;type:char(64)"`
+ RoomID string `gorm:"column:room_id;primary_key;type:char(128)"`
+ Timeout int32 `gorm:"column:timeout"`
+ MediaType string `gorm:"column:media_type;type:char(64)"`
+ PlatformID int32 `gorm:"column:platform_id"`
+ SessionType int32 `gorm:"column:sesstion_type"`
+ InitiateTime time.Time `gorm:"column:initiate_time"`
+ EndTime time.Time `gorm:"column:end_time"`
+ FileURL string `gorm:"column:file_url" json:"-"`
+
+ Title string `gorm:"column:title;size:128"`
+ Desc string `gorm:"column:desc;size:1024"`
+ Ex string `gorm:"column:ex;size:1024"`
+ IOSPushSound string `gorm:"column:ios_push_sound"`
+ IOSBadgeCount bool `gorm:"column:ios_badge_count"`
+ SignalInfo string `gorm:"column:signal_info;size:1024"`
+}
+
+func (SignalModel) TableName() string {
+ return "signal"
+}
+
+type SignalInvitationModel struct {
+ UserID string `gorm:"column:user_id;primary_key"`
+ SID string `gorm:"column:sid;type:char(128);primary_key"`
+ Status int32 `gorm:"column:status"`
+ InitiateTime time.Time `gorm:"column:initiate_time;primary_key"`
+ HandleTime time.Time `gorm:"column:handle_time"`
+}
+
+func (SignalInvitationModel) TableName() string {
+ return "signal_invitation"
+}
diff --git a/tools/up35/pkg/pkg.go b/tools/up35/pkg/pkg.go
new file mode 100644
index 000000000..6d16817ec
--- /dev/null
+++ b/tools/up35/pkg/pkg.go
@@ -0,0 +1,221 @@
+// Copyright © 2023 OpenIM. 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 pkg
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "log"
+ "os"
+ "reflect"
+ "strconv"
+
+ "gopkg.in/yaml.v3"
+
+ "github.com/go-sql-driver/mysql"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+ "go.mongodb.org/mongo-driver/mongo/options"
+ gormMysql "gorm.io/driver/mysql"
+ "gorm.io/gorm"
+ "gorm.io/gorm/logger"
+
+ "github.com/openimsdk/open-im-server/v3/pkg/common/config"
+ "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo"
+ "github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation"
+ rtcMgo "github.com/openimsdk/open-im-server/v3/tools/up35/pkg/internal/rtc/mongo/mgo"
+)
+
+const (
+ versionTable = "dataver"
+ versionKey = "data_version"
+ versionValue = 35
+)
+
+func InitConfig(path string) error {
+ data, err := os.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ return yaml.Unmarshal(data, &config.Config)
+}
+
+func GetMysql() (*gorm.DB, error) {
+ conf := config.Config.Mysql
+ mysqlDSN := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", conf.Username, conf.Password, conf.Address[0], conf.Database)
+ return gorm.Open(gormMysql.Open(mysqlDSN), &gorm.Config{Logger: logger.Discard})
+}
+
+func GetMongo() (*mongo.Database, error) {
+ mgo, err := unrelation.NewMongo()
+ if err != nil {
+ return nil, err
+ }
+ return mgo.GetDatabase(), nil
+}
+
+func Main(path string) error {
+ if err := InitConfig(path); err != nil {
+ return err
+ }
+ if config.Config.Mysql == nil {
+ return nil
+ }
+ mongoDB, err := GetMongo()
+ if err != nil {
+ return err
+ }
+ var version struct {
+ Key string `bson:"key"`
+ Value string `bson:"value"`
+ }
+ switch mongoDB.Collection(versionTable).FindOne(context.Background(), bson.M{"key": versionKey}).Decode(&version) {
+ case nil:
+ if ver, _ := strconv.Atoi(version.Value); ver >= versionValue {
+ return nil
+ }
+ case mongo.ErrNoDocuments:
+ default:
+ return err
+ }
+ mysqlDB, err := GetMysql()
+ if err != nil {
+ if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == 1049 {
+ if err := SetMongoDataVersion(mongoDB, version.Value); err != nil {
+ return err
+ }
+ return nil // database not exist
+ }
+ return err
+ }
+
+ var c convert
+ var tasks []func() error
+ tasks = append(tasks,
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewUserMongo, c.User) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewFriendMongo, c.Friend) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewFriendRequestMongo, c.FriendRequest) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewBlackMongo, c.Black) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupMongo, c.Group) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupMember, c.GroupMember) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupRequestMgo, c.GroupRequest) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewConversationMongo, c.Conversation) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewS3Mongo, c.Object(config.Config.Object.Enable)) },
+ func() error { return NewTask(mysqlDB, mongoDB, mgo.NewLogMongo, c.Log) },
+
+ func() error { return NewTask(mysqlDB, mongoDB, rtcMgo.NewSignal, c.SignalModel) },
+ func() error { return NewTask(mysqlDB, mongoDB, rtcMgo.NewSignalInvitation, c.SignalInvitationModel) },
+ func() error { return NewTask(mysqlDB, mongoDB, rtcMgo.NewMeeting, c.Meeting) },
+ func() error { return NewTask(mysqlDB, mongoDB, rtcMgo.NewMeetingInvitation, c.MeetingInvitationInfo) },
+ func() error { return NewTask(mysqlDB, mongoDB, rtcMgo.NewMeetingRecord, c.MeetingVideoRecord) },
+ )
+
+ for _, task := range tasks {
+ if err := task(); err != nil {
+ return err
+ }
+ }
+
+ if err := SetMongoDataVersion(mongoDB, version.Value); err != nil {
+ return err
+ }
+ return nil
+}
+
+func SetMongoDataVersion(db *mongo.Database, curver string) error {
+ filter := bson.M{"key": versionKey, "value": curver}
+ update := bson.M{"$set": bson.M{"key": versionKey, "value": strconv.Itoa(versionValue)}}
+ _, err := db.Collection(versionTable).UpdateOne(context.Background(), filter, update, options.Update().SetUpsert(true))
+ return err
+}
+
+// NewTask A mysql table B mongodb model C mongodb table
+func NewTask[A interface{ TableName() string }, B any, C any](gormDB *gorm.DB, mongoDB *mongo.Database, mongoDBInit func(db *mongo.Database) (B, error), convert func(v A) C) error {
+ obj, err := mongoDBInit(mongoDB)
+ if err != nil {
+ return err
+ }
+ var zero A
+ tableName := zero.TableName()
+ coll, err := getColl(obj)
+ if err != nil {
+ return fmt.Errorf("get mongo collection %s failed, err: %w", tableName, err)
+ }
+ var count int
+ defer func() {
+ log.Printf("completed convert %s total %d\n", tableName, count)
+ }()
+ const batch = 100
+ for page := 0; ; page++ {
+ res := make([]A, 0, batch)
+ if err := gormDB.Limit(batch).Offset(page * batch).Find(&res).Error; err != nil {
+ if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == 1146 {
+ return nil // table not exist
+ }
+ return fmt.Errorf("find mysql table %s failed, err: %w", tableName, err)
+ }
+ if len(res) == 0 {
+ return nil
+ }
+ temp := make([]any, len(res))
+ for i := range res {
+ temp[i] = convert(res[i])
+ }
+ if err := insertMany(coll, temp); err != nil {
+ return fmt.Errorf("insert mongo table %s failed, err: %w", tableName, err)
+ }
+ count += len(res)
+ if len(res) < batch {
+ return nil
+ }
+ log.Printf("current convert %s completed %d\n", tableName, count)
+ }
+}
+
+func insertMany(coll *mongo.Collection, objs []any) error {
+ if _, err := coll.InsertMany(context.Background(), objs); err != nil {
+ if !mongo.IsDuplicateKeyError(err) {
+ return err
+ }
+ }
+ for i := range objs {
+ _, err := coll.InsertOne(context.Background(), objs[i])
+ switch {
+ case err == nil:
+ case mongo.IsDuplicateKeyError(err):
+ default:
+ return err
+ }
+ }
+ return nil
+}
+
+func getColl(obj any) (_ *mongo.Collection, err error) {
+ defer func() {
+ if e := recover(); e != nil {
+ err = fmt.Errorf("not found %+v", e)
+ }
+ }()
+ stu := reflect.ValueOf(obj).Elem()
+ typ := reflect.TypeOf(&mongo.Collection{}).String()
+ for i := 0; i < stu.NumField(); i++ {
+ field := stu.Field(i)
+ if field.Type().String() == typ {
+ return (*mongo.Collection)(field.UnsafePointer()), nil
+ }
+ }
+ return nil, errors.New("not found")
+}
diff --git a/tools/up35/up35.go b/tools/up35/up35.go
index 5d4740fca..63b6ec2c2 100644
--- a/tools/up35/up35.go
+++ b/tools/up35/up35.go
@@ -1,367 +1,34 @@
+// Copyright © 2023 OpenIM. 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 main
import (
- "context"
- "errors"
"flag"
- "fmt"
- "github.com/go-sql-driver/mysql"
- "github.com/openimsdk/open-im-server/v3/pkg/common/config"
- "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo"
- mongoModel "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation"
- "github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation"
- mysqlModel "github.com/openimsdk/open-im-server/v3/tools/data-conversion/openim/mysql/v3"
- "go.mongodb.org/mongo-driver/bson"
- "go.mongodb.org/mongo-driver/mongo"
- "go.mongodb.org/mongo-driver/mongo/options"
- "gopkg.in/yaml.v3"
- gormMysql "gorm.io/driver/mysql"
- "gorm.io/gorm"
- "gorm.io/gorm/logger"
"log"
"os"
- "reflect"
- "strconv"
-)
-const (
- versionTable = "dataver"
- versionKey = "data_version"
- versionValue = 35
+ "github.com/openimsdk/open-im-server/v3/tools/up35/pkg"
)
func main() {
var path string
flag.StringVar(&path, "c", "", "path config file")
flag.Parse()
- if err := Main(path); err != nil {
+ if err := pkg.Main(path); err != nil {
log.Fatal(err)
return
}
os.Exit(0)
}
-
-func InitConfig(path string) error {
- data, err := os.ReadFile(path)
- if err != nil {
- return err
- }
- return yaml.Unmarshal(data, &config.Config)
-}
-
-func GetMysql() (*gorm.DB, error) {
- conf := config.Config.Mysql
- mysqlDSN := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", conf.Username, conf.Password, conf.Address[0], conf.Database)
- return gorm.Open(gormMysql.Open(mysqlDSN), &gorm.Config{Logger: logger.Discard})
-}
-
-func GetMongo() (*mongo.Database, error) {
- mgo, err := unrelation.NewMongo()
- if err != nil {
- return nil, err
- }
- return mgo.GetDatabase(), nil
-}
-
-func Main(path string) error {
- if err := InitConfig(path); err != nil {
- return err
- }
- if config.Config.Mysql == nil {
- return nil
- }
- mongoDB, err := GetMongo()
- if err != nil {
- return err
- }
- var version struct {
- Key string `bson:"key"`
- Value string `bson:"value"`
- }
- switch mongoDB.Collection(versionTable).FindOne(context.Background(), bson.M{"key": versionKey}).Decode(&version) {
- case nil:
- if ver, _ := strconv.Atoi(version.Value); ver >= versionValue {
- return nil
- }
- case mongo.ErrNoDocuments:
- default:
- return err
- }
- mysqlDB, err := GetMysql()
- if err != nil {
- if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == 1049 {
- if err := SetMongoDataVersion(mongoDB, version.Value); err != nil {
- return err
- }
- return nil // database not exist
- }
- return err
- }
-
- var c convert
- var tasks []func() error
- tasks = append(tasks,
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewUserMongo, c.User) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewFriendMongo, c.Friend) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewFriendRequestMongo, c.FriendRequest) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewBlackMongo, c.Black) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupMongo, c.Group) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupMember, c.GroupMember) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupRequestMgo, c.GroupRequest) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewConversationMongo, c.Conversation) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewS3Mongo, c.Object(config.Config.Object.Enable)) },
- func() error { return NewTask(mysqlDB, mongoDB, mgo.NewLogMongo, c.Log) },
- )
-
- for _, task := range tasks {
- if err := task(); err != nil {
- return err
- }
- }
-
- if err := SetMongoDataVersion(mongoDB, version.Value); err != nil {
- return err
- }
- return nil
-}
-
-func SetMongoDataVersion(db *mongo.Database, curver string) error {
- filter := bson.M{"key": versionKey, "value": curver}
- update := bson.M{"$set": bson.M{"key": versionKey, "value": strconv.Itoa(versionValue)}}
- _, err := db.Collection(versionTable).UpdateOne(context.Background(), filter, update, options.Update().SetUpsert(true))
- return err
-}
-
-// NewTask A mysql table B mongodb model C mongodb table
-func NewTask[A interface{ TableName() string }, B any, C any](gormDB *gorm.DB, mongoDB *mongo.Database, mongoDBInit func(db *mongo.Database) (B, error), convert func(v A) C) error {
- obj, err := mongoDBInit(mongoDB)
- if err != nil {
- return err
- }
- var zero A
- tableName := zero.TableName()
- coll, err := getColl(obj)
- if err != nil {
- return fmt.Errorf("get mongo collection %s failed, err: %w", tableName, err)
- }
- var count int
- defer func() {
- log.Printf("completed convert %s total %d\n", tableName, count)
- }()
- const batch = 100
- for page := 0; ; page++ {
- res := make([]A, 0, batch)
- if err := gormDB.Limit(batch).Offset(page * batch).Find(&res).Error; err != nil {
- if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == 1146 {
- return nil // table not exist
- }
- return fmt.Errorf("find mysql table %s failed, err: %w", tableName, err)
- }
- if len(res) == 0 {
- return nil
- }
- temp := make([]any, len(res))
- for i := range res {
- temp[i] = convert(res[i])
- }
- if err := insertMany(coll, temp); err != nil {
- return fmt.Errorf("insert mongo table %s failed, err: %w", tableName, err)
- }
- count += len(res)
- if len(res) < batch {
- return nil
- }
- log.Printf("current convert %s completed %d\n", tableName, count)
- }
-}
-
-func insertMany(coll *mongo.Collection, objs []any) error {
- if _, err := coll.InsertMany(context.Background(), objs); err != nil {
- if !mongo.IsDuplicateKeyError(err) {
- return err
- }
- }
- for i := range objs {
- _, err := coll.InsertOne(context.Background(), objs[i])
- switch {
- case err == nil:
- case mongo.IsDuplicateKeyError(err):
- default:
- return err
- }
- }
- return nil
-}
-
-func getColl(obj any) (_ *mongo.Collection, err error) {
- defer func() {
- if e := recover(); e != nil {
- err = fmt.Errorf("not found %+v", e)
- }
- }()
- stu := reflect.ValueOf(obj).Elem()
- typ := reflect.TypeOf(&mongo.Collection{}).String()
- for i := 0; i < stu.NumField(); i++ {
- field := stu.Field(i)
- if field.Type().String() == typ {
- return (*mongo.Collection)(field.UnsafePointer()), nil
- }
- }
- return nil, errors.New("not found")
-}
-
-type convert struct{}
-
-func (convert) User(v mysqlModel.UserModel) mongoModel.UserModel {
- return mongoModel.UserModel{
- UserID: v.UserID,
- Nickname: v.Nickname,
- FaceURL: v.FaceURL,
- Ex: v.Ex,
- AppMangerLevel: v.AppMangerLevel,
- GlobalRecvMsgOpt: v.GlobalRecvMsgOpt,
- CreateTime: v.CreateTime,
- }
-}
-
-func (convert) Friend(v mysqlModel.FriendModel) mongoModel.FriendModel {
- return mongoModel.FriendModel{
- OwnerUserID: v.OwnerUserID,
- FriendUserID: v.FriendUserID,
- Remark: v.Remark,
- CreateTime: v.CreateTime,
- AddSource: v.AddSource,
- OperatorUserID: v.OperatorUserID,
- Ex: v.Ex,
- }
-}
-
-func (convert) FriendRequest(v mysqlModel.FriendRequestModel) mongoModel.FriendRequestModel {
- return mongoModel.FriendRequestModel{
- FromUserID: v.FromUserID,
- ToUserID: v.ToUserID,
- HandleResult: v.HandleResult,
- ReqMsg: v.ReqMsg,
- CreateTime: v.CreateTime,
- HandlerUserID: v.HandlerUserID,
- HandleMsg: v.HandleMsg,
- HandleTime: v.HandleTime,
- Ex: v.Ex,
- }
-}
-
-func (convert) Black(v mysqlModel.BlackModel) mongoModel.BlackModel {
- return mongoModel.BlackModel{
- OwnerUserID: v.OwnerUserID,
- BlockUserID: v.BlockUserID,
- CreateTime: v.CreateTime,
- AddSource: v.AddSource,
- OperatorUserID: v.OperatorUserID,
- Ex: v.Ex,
- }
-}
-
-func (convert) Group(v mysqlModel.GroupModel) mongoModel.GroupModel {
- return mongoModel.GroupModel{
- GroupID: v.GroupID,
- GroupName: v.GroupName,
- Notification: v.Notification,
- Introduction: v.Introduction,
- FaceURL: v.FaceURL,
- CreateTime: v.CreateTime,
- Ex: v.Ex,
- Status: v.Status,
- CreatorUserID: v.CreatorUserID,
- GroupType: v.GroupType,
- NeedVerification: v.NeedVerification,
- LookMemberInfo: v.LookMemberInfo,
- ApplyMemberFriend: v.ApplyMemberFriend,
- NotificationUpdateTime: v.NotificationUpdateTime,
- NotificationUserID: v.NotificationUserID,
- }
-}
-
-func (convert) GroupMember(v mysqlModel.GroupMemberModel) mongoModel.GroupMemberModel {
- return mongoModel.GroupMemberModel{
- GroupID: v.GroupID,
- UserID: v.UserID,
- Nickname: v.Nickname,
- FaceURL: v.FaceURL,
- RoleLevel: v.RoleLevel,
- JoinTime: v.JoinTime,
- JoinSource: v.JoinSource,
- InviterUserID: v.InviterUserID,
- OperatorUserID: v.OperatorUserID,
- MuteEndTime: v.MuteEndTime,
- Ex: v.Ex,
- }
-}
-
-func (convert) GroupRequest(v mysqlModel.GroupRequestModel) mongoModel.GroupRequestModel {
- return mongoModel.GroupRequestModel{
- UserID: v.UserID,
- GroupID: v.GroupID,
- HandleResult: v.HandleResult,
- ReqMsg: v.ReqMsg,
- HandledMsg: v.HandledMsg,
- ReqTime: v.ReqTime,
- HandleUserID: v.HandleUserID,
- HandledTime: v.HandledTime,
- JoinSource: v.JoinSource,
- InviterUserID: v.InviterUserID,
- Ex: v.Ex,
- }
-}
-
-func (convert) Conversation(v mysqlModel.ConversationModel) mongoModel.ConversationModel {
- return mongoModel.ConversationModel{
- OwnerUserID: v.OwnerUserID,
- ConversationID: v.ConversationID,
- ConversationType: v.ConversationType,
- UserID: v.UserID,
- GroupID: v.GroupID,
- RecvMsgOpt: v.RecvMsgOpt,
- IsPinned: v.IsPinned,
- IsPrivateChat: v.IsPrivateChat,
- BurnDuration: v.BurnDuration,
- GroupAtType: v.GroupAtType,
- AttachedInfo: v.AttachedInfo,
- Ex: v.Ex,
- MaxSeq: v.MaxSeq,
- MinSeq: v.MinSeq,
- CreateTime: v.CreateTime,
- IsMsgDestruct: v.IsMsgDestruct,
- MsgDestructTime: v.MsgDestructTime,
- LatestMsgDestructTime: v.LatestMsgDestructTime,
- }
-}
-
-func (convert) Object(engine string) func(v mysqlModel.ObjectModel) mongoModel.ObjectModel {
- return func(v mysqlModel.ObjectModel) mongoModel.ObjectModel {
- return mongoModel.ObjectModel{
- Name: v.Name,
- UserID: v.UserID,
- Hash: v.Hash,
- Engine: engine,
- Key: v.Key,
- Size: v.Size,
- ContentType: v.ContentType,
- Group: v.Cause,
- CreateTime: v.CreateTime,
- }
- }
-}
-
-func (convert) Log(v mysqlModel.Log) mongoModel.LogModel {
- return mongoModel.LogModel{
- LogID: v.LogID,
- Platform: v.Platform,
- UserID: v.UserID,
- CreateTime: v.CreateTime,
- Url: v.Url,
- FileName: v.FileName,
- SystemType: v.SystemType,
- Version: v.Version,
- Ex: v.Ex,
- }
-}
diff --git a/tools/url2im/main.go b/tools/url2im/main.go
index ee159b5e8..8d6151b09 100644
--- a/tools/url2im/main.go
+++ b/tools/url2im/main.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 main
import (
diff --git a/tools/url2im/pkg/api.go b/tools/url2im/pkg/api.go
index 1fc3813bb..7575b078a 100644
--- a/tools/url2im/pkg/api.go
+++ b/tools/url2im/pkg/api.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import (
diff --git a/tools/url2im/pkg/buffer.go b/tools/url2im/pkg/buffer.go
index 8ccc5c52f..b4c104652 100644
--- a/tools/url2im/pkg/buffer.go
+++ b/tools/url2im/pkg/buffer.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import (
diff --git a/tools/url2im/pkg/config.go b/tools/url2im/pkg/config.go
index 020395262..740e748cb 100644
--- a/tools/url2im/pkg/config.go
+++ b/tools/url2im/pkg/config.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import "time"
diff --git a/tools/url2im/pkg/http.go b/tools/url2im/pkg/http.go
index 32e128524..50fb30c7b 100644
--- a/tools/url2im/pkg/http.go
+++ b/tools/url2im/pkg/http.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import "net/http"
diff --git a/tools/url2im/pkg/manage.go b/tools/url2im/pkg/manage.go
index a68078f85..70c6713fc 100644
--- a/tools/url2im/pkg/manage.go
+++ b/tools/url2im/pkg/manage.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import (
diff --git a/tools/url2im/pkg/md5.go b/tools/url2im/pkg/md5.go
index 0db5ba000..26b8d47a2 100644
--- a/tools/url2im/pkg/md5.go
+++ b/tools/url2im/pkg/md5.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import (
diff --git a/tools/url2im/pkg/progress.go b/tools/url2im/pkg/progress.go
index 2d6ef3891..5f30495c6 100644
--- a/tools/url2im/pkg/progress.go
+++ b/tools/url2im/pkg/progress.go
@@ -1,3 +1,17 @@
+// Copyright © 2023 OpenIM. 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 pkg
import (