From 135dc7b359c5cc3c28c0909d2723404cbb20925c Mon Sep 17 00:00:00 2001
From: Xinwei Xiong <86140903+cubxxw@users.noreply.github.com>
Date: Wed, 12 Jul 2023 20:46:34 +0800
Subject: [PATCH 1/9] feat: add scripts (#515)
* feat: add scripts
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* build: Infrastructure, openimv3.0.0
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add code (#519)
---------
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
---
.github/workflows/golangci-link.yml | 2 +-
.golangci.yml | 722 +++++++++++++++++++++++++---
CHANGELOG/CHANGELOG-3.0.md | 83 +---
CHANGELOG/CHANGELOG.md | 8 +
internal/rpc/user/user.go | 3 +-
scripts/githooks/pre-commit | 2 +-
scripts/stop_all.sh | 1 -
7 files changed, 685 insertions(+), 136 deletions(-)
diff --git a/.github/workflows/golangci-link.yml b/.github/workflows/golangci-link.yml
index c5fdd7b1b..f3664c1bc 100644
--- a/.github/workflows/golangci-link.yml
+++ b/.github/workflows/golangci-link.yml
@@ -45,7 +45,7 @@ jobs:
# args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0
# Optional: show only new issues if it's a pull request. The default value is `false`.
- only-new-issues: true
+ # only-new-issues: true
# Optional:The mode to install golangci-lint. It can be 'binary' or 'goinstall'.
install-mode: "goinstall"
\ No newline at end of file
diff --git a/.golangci.yml b/.golangci.yml
index 8326afe12..ef7c1f811 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -1,10 +1,27 @@
+# Copyright © 2023 OpenIMSDK 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.
+
+# This file contains all available configuration options
+# with their default values.
+
# options for analysis running
run:
# default concurrency is a available CPU number
concurrency: 4
# timeout for analysis, e.g. 30s, 5m, default is 1m
- timeout: 1m
+ timeout: 5m
# exit code when at least one issue was found, default is 1
issues-exit-code: 1
@@ -12,10 +29,36 @@ run:
# include test files or not, default is true
tests: true
+ # list of build tags, all linters use it. Default is empty list.
+ build-tags:
+ - mytag
+
+ # which dirs to skip: issues from them won't be reported;
+ # can use regexp here: generated.*, regexp is applied on full path;
+ # default value is empty list, but default dirs are skipped independently
+ # from this option's value (see skip-dirs-use-default).
+ # "/" will be replaced by current OS file path separator to properly work
+ # on Windows.
+ skip-dirs:
+ - util
+ - .*~
+ - api/swagger/docs
+ - server/docs
+
# default is true. Enables skipping of directories:
# vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
skip-dirs-use-default: true
+ # which files to skip: they will be analyzed, but issues from them
+ # won't be reported. Default value is empty list, but there is
+ # no need to include all autogenerated files, we confidently recognize
+ # autogenerated files. If it's not please let us know.
+ # "/" will be replaced by current OS file path separator to properly work
+ # on Windows.
+ skip-files:
+ - ".*\\.my\\.go$"
+ - _test.go
+
# by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules":
# If invoked with -mod=readonly, the go command is disallowed from the implicit
# automatic updating of go.mod described above. Instead, it fails when any changes
@@ -30,6 +73,7 @@ run:
# If false (default) - golangci-lint acquires file lock on start.
allow-parallel-runners: true
+
# output configuration options
output:
# colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number"
@@ -44,9 +88,26 @@ output:
# make issues output unique by line, default is true
uniq-by-line: true
+ # add a prefix to the output file references; default is no prefix
+ path-prefix: ""
+
+ # sorts results by: filepath, line and column
+ sort-results: true
# all available settings of specific linters
linters-settings:
+ bidichk:
+ # The following configurations check for all mentioned invisible unicode
+ # runes. It can be omitted because all runes are enabled by default.
+ left-to-right-embedding: true
+ right-to-left-embedding: true
+ pop-directional-formatting: true
+ left-to-right-override: true
+ right-to-left-override: true
+ left-to-right-isolate: true
+ right-to-left-isolate: true
+ first-strong-isolate: true
+ pop-directional-isolate: true
dogsled:
# checks assignments with too many blank identifiers; default is 2
max-blank-identifiers: 2
@@ -62,47 +123,217 @@ linters-settings:
# default is false: such cases aren't reported by default.
check-blank: false
+ # [deprecated] comma-separated list of pairs of the form pkg:regex
+ # the regex is used to ignore names within pkg. (default "fmt:.*").
+ # see https://github.com/kisielk/errcheck#the-deprecated-method for details
+ #ignore: GenMarkdownTree,os:.*,BindPFlags,WriteTo,Help
+ #ignore: (os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv
+
# path to a file containing a list of functions to exclude from checking
# see https://github.com/kisielk/errcheck#excluding-functions for details
#exclude: errcheck.txt
+
+ errorlint:
+ # Check whether fmt.Errorf uses the %w verb for formatting errors. See the readme for caveats
+ errorf: true
+ # Check for plain type assertions and type switches
+ asserts: true
+ # Check for plain error comparisons
+ comparison: true
+
exhaustive:
+ # check switch statements in generated files also
+ check-generated: false
# indicates that switch statements are to be considered exhaustive if a
# 'default' case is present, even if all enum members aren't listed in the
# switch
default-signifies-exhaustive: false
+ # enum members matching the supplied regex do not have to be listed in
+ # switch statements to satisfy exhaustiveness
+ ignore-enum-members: ""
+ # consider enums only in package scopes, not in inner scopes
+ package-scope-only: false
+ exhaustivestruct:
+ struct-patterns:
+ - '*.Test'
+ - '*.Test2'
+ - '*.Embedded'
+ - '*.External'
+
+ # forbidigo:
+ # # Forbid the following identifiers (identifiers are written using regexp):
+ # forbid:
+ # - ^print.*$
+ # - 'fmt\.Print.*'
+ # - fmt.Println.* # too much log noise
+ # - ginkgo\\.F.* # these are used just for local development
+ # # Exclude godoc examples from forbidigo checks. Default is true.
+ # exclude_godoc_examples: false
funlen:
lines: 150
- statements: 40
+ statements: 50
+ gci:
+ # put imports beginning with prefix after 3rd-party packages;
+ # only support one prefix
+ # if not set, use goimports.local-prefixes
+ prefix: github.com/OpenIMSDK/OpenKF
gocognit:
# minimal code complexity to report, 30 by default (but we recommend 10-20)
min-complexity: 30
- nestif:
- # minimal complexity of if statements to report, 5 by default
- min-complexity: 4
goconst:
# minimal length of string constant, 3 by default
- min-len: 5
+ min-len: 3
# minimal occurrences count to trigger, 3 by default
- min-occurrences: 5
+ min-occurrences: 3
+ # ignore test files, false by default
+ ignore-tests: false
+ # look for existing constants matching the values, true by default
+ match-constant: true
+ # search also for duplicated numbers, false by default
+ numbers: false
+ # minimum value, only works with goconst.numbers, 3 by default
+ min: 3
+ # maximum value, only works with goconst.numbers, 3 by default
+ max: 3
+ # ignore when constant is not used as function argument, true by default
+ ignore-calls: true
+
+ gocritic:
+ # Which checks should be enabled; can't be combined with 'disabled-checks';
+ # See https://go-critic.github.io/overview#checks-overview
+ # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run`
+ # By default list of stable checks is used.
+ enabled-checks:
+ #- rangeValCopy
+ - nestingreduce
+ - truncatecmp
+ - unnamedresult
+ - ruleguard
+
+ # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty
+ disabled-checks:
+ - regexpMust
+ - ifElseChain
+ #- exitAfterDefer
+
+ # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.
+ # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags".
+ enabled-tags:
+ - performance
+ disabled-tags:
+ - experimental
+
+ # Settings passed to gocritic.
+ # The settings key is the name of a supported gocritic checker.
+ # The list of supported checkers can be find in https://go-critic.github.io/overview.
+ settings:
+ captLocal: # must be valid enabled check name
+ # whether to restrict checker to params only (default true)
+ paramsOnly: true
+ elseif:
+ # whether to skip balanced if-else pairs (default true)
+ skipBalanced: true
+ hugeParam:
+ # size in bytes that makes the warning trigger (default 80)
+ sizeThreshold: 80
+ nestingReduce:
+ # min number of statements inside a branch to trigger a warning (default 5)
+ bodyWidth: 5
+ rangeExprCopy:
+ # size in bytes that makes the warning trigger (default 512)
+ sizeThreshold: 512
+ # whether to check test functions (default true)
+ skipTestFuncs: true
+ rangeValCopy:
+ # size in bytes that makes the warning trigger (default 128)
+ sizeThreshold: 32
+ # whether to check test functions (default true)
+ skipTestFuncs: true
+ ruleguard:
+ # path to a gorules file for the ruleguard checker
+ rules: ''
+ truncateCmp:
+ # whether to skip int/uint/uintptr types (default true)
+ skipArchDependent: true
+ underef:
+ # whether to skip (*x).method() calls where x is a pointer receiver (default true)
+ skipRecvDeref: true
+ unnamedResult:
+ # whether to check exported functions
+ checkExported: true
gocyclo:
# minimal code complexity to report, 30 by default (but we recommend 10-20)
min-complexity: 30
+ cyclop:
+ # the maximal code complexity to report
+ max-complexity: 50
+ # the maximal average package complexity. If it's higher than 0.0 (float) the check is enabled (default 0.0)
+ package-average: 0.0
+ # should ignore tests (default false)
+ skip-tests: false
godot:
- # check all top-level comments, not only declarations
- check-all: false
+ # comments to be checked: `declarations`, `toplevel`, or `all`
+ scope: declarations
+ # list of regexps for excluding particular comment lines from check
+ exclude:
+ # example: exclude comments which contain numbers
+ # - '[0-9]+'
+ # check that each sentence starts with a capital letter
+ capital: false
godox:
# report any comments starting with keywords, this is useful for TODO or FIXME comments that
# might be left in the code accidentally and should be resolved before merging
keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting
+ #- TODO
+ - BUG
+ - FIXME
+ #- NOTE
- OPTIMIZE # marks code that should be optimized before merging
- HACK # marks hack-arounds that should be removed before merging
gofmt:
# simplify code: gofmt with `-s` option, true by default
simplify: true
+
+ gofumpt:
+ # Select the Go version to target. The default is `1.18`.
+ lang-version: "1.20"
+
+ # Choose whether or not to use the extra rules that are disabled
+ # by default
+ extra-rules: false
+
+ goheader:
+ values:
+ const:
+ # define here const type values in format k:v, for example:
+ # COMPANY: MY COMPANY
+ regexp:
+ # define here regexp type values, for example
+ # AUTHOR: .*@mycompany\.com
+ template: # |-
+ # put here copyright header template for source code files, for example:
+ # Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.
+ #
+ # {{ AUTHOR }} {{ COMPANY }} {{ YEAR }}
+ # SPDX-License-Identifier: Apache-2.0
+
+ # 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.
+ template-path:
+ # also as alternative of directive 'template' you may put the path to file with the template source
goimports:
# put imports beginning with prefix after 3rd-party packages;
# it's a comma-separated list of prefixes
- local-prefixes: github.com/org/project
+ local-prefixes: github.com/OpenIMSDK/OpenKF
golint:
# minimal confidence for issues, default is 0.8
min-confidence: 0.9
@@ -111,16 +342,91 @@ linters-settings:
mnd:
# the list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.
checks: argument,case,condition,operation,return,assign
+ # ignored-numbers: 1000
+ # ignored-files: magic_.*.go
+ # ignored-functions: math.*
+ gomoddirectives:
+ # Allow local `replace` directives. Default is false.
+ replace-local: true
+ # List of allowed `replace` directives. Default is empty.
+ replace-allow-list:
+ - google.golang.org/grpc
+
+ # Allow to not explain why the version has been retracted in the `retract` directives. Default is false.
+ retract-allow-no-explanation: false
+ # Forbid the use of the `exclude` directives. Default is false.
+ exclude-forbidden: false
gomodguard:
allowed:
- modules: # List of allowed modules
+ modules:
+ - gorm.io/gen # List of allowed modules
+ - gorm.io/gorm
+ - gorm.io/driver/mysql
+ - k8s.io/klog
# - gopkg.in/yaml.v2
domains: # List of allowed module domains
- # - golang.org
+ - google.golang.org
+ - gopkg.in
+ - golang.org
+ - github.com
+ - go.uber.org
+ - go.etcd.io
+ blocked:
+ versions:
+ - github.com/MakeNowJust/heredoc:
+ version: "> 2.0.9"
+ reason: "use the latest version"
+ local_replace_directives: false # Set to true to raise lint issues for packages that are loaded from a local path via replace directive
+
+ gosec:
+ # To select a subset of rules to run.
+ # Available rules: https://github.com/securego/gosec#available-rules
+ includes:
+ - G401
+ - G306
+ - G101
+ # To specify a set of rules to explicitly exclude.
+ # Available rules: https://github.com/securego/gosec#available-rules
+ excludes:
+ - G204
+ # Exclude generated files
+ exclude-generated: true
+ # Filter out the issues with a lower severity than the given value. Valid options are: low, medium, high.
+ severity: "low"
+ # Filter out the issues with a lower confidence than the given value. Valid options are: low, medium, high.
+ confidence: "low"
+ # To specify the configuration of rules.
+ # The configuration of rules is not fully documented by gosec:
+ # https://github.com/securego/gosec#configuration
+ # https://github.com/securego/gosec/blob/569328eade2ccbad4ce2d0f21ee158ab5356a5cf/rules/rulelist.go#L60-L102
+ config:
+ G306: "0600"
+ G101:
+ pattern: "(?i)example"
+ ignore_entropy: false
+ entropy_threshold: "80.0"
+ per_char_threshold: "3.0"
+ truncate: "32"
+
+ gosimple:
+ # Select the Go version to target. The default is '1.13'.
+ go: "1.20"
+ # https://staticcheck.io/docs/options#checks
+ checks: [ "all" ]
+
govet:
# report about shadowed variables
check-shadowing: true
+ # settings per analyzer
+ settings:
+ printf: # analyzer name, run `go tool vet help` to see all analyzers
+ funcs: # run `go tool vet help printf` to see available settings for `printf` analyzer
+ - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof
+ - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf
+ - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf
+ - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf
+
# enable or disable analyzers by name
enable:
- atomicalign
@@ -128,17 +434,69 @@ linters-settings:
disable:
- shadow
disable-all: false
- depguard:
- list-type: blacklist
- include-go-root: false
- packages:
- packages-with-error-message:
+ # depguard:
+ # list-type: blacklist
+ # include-go-root: false
+ # packages:
+ # - github.com/Sirupsen/logrus
+ # packages-with-error-message:
+ # # specify an error message to output when a blacklisted package is used
+ # - github.com/Sirupsen/logrus: "logging is allowed only by logutils.Log"
+ ifshort:
+ # Maximum length of variable declaration measured in number of lines, after which linter won't suggest using short syntax.
+ # Has higher priority than max-decl-chars.
+ max-decl-lines: 1
+ # Maximum length of variable declaration measured in number of characters, after which linter won't suggest using short syntax.
+ max-decl-chars: 30
+
+ importas:
+ # if set to `true`, force to use alias.
+ no-unaliased: true
+ # List of aliases
+ alias:
+ # using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package
+ - pkg: knative.dev/serving/pkg/apis/serving/v1
+ alias: servingv1
+ # using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package
+ - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1
+ alias: autoscalingv1alpha1
+ # You can specify the package path by regular expression,
+ # and alias by regular expression expansion syntax like below.
+ # see https://github.com/julz/importas#use-regular-expression for details
+ - pkg: knative.dev/serving/pkg/apis/(\w+)/(v[\w\d]+)
+ alias: $1$2
+ # using `jwt` alias for `github.com/appleboy/gin-jwt/v2` package
+ jwt: github.com/appleboy/gin-jwt/v2
+
+ ireturn:
+ # ireturn allows using `allow` and `reject` settings at the same time.
+ # Both settings are lists of the keywords and regular expressions matched to interface or package names.
+ # keywords:
+ # - `empty` for `interface{}`
+ # - `error` for errors
+ # - `stdlib` for standard library
+ # - `anon` for anonymous interfaces
+
+ # By default, it allows using errors, empty interfaces, anonymous interfaces,
+ # and interfaces provided by the standard library.
+ allow:
+ - anon
+ - error
+ - empty
+ - stdlib
+ # You can specify idiomatic endings for interface
+ - (or|er)$
+
+ # Reject patterns
+ reject:
+ - github.com\/user\/package\/v4\.Type
+
lll:
# max line length, lines longer will be reported. Default is 120.
# '\t' is counted as 1 character by default, and can be changed with the tab-width option
- line-length: 120
+ line-length: 240
# tab width in spaces. Default to 1.
- tab-width: 1
+ tab-width: 4
maligned:
# print struct with more effective memory layout or not, false by default
suggest-new: true
@@ -152,26 +510,137 @@ linters-settings:
nakedret:
# make an issue if func has more lines of code than this setting and it has naked returns; default is 30
max-func-lines: 30
- prealloc:
- # XXX: we don't recommend using this linter before doing performance profiling.
- # For most programs usage of prealloc will be a premature optimization.
- # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.
- # True by default.
- simple: true
- range-loops: true # Report preallocation suggestions on range loops, true by default
- for-loops: false # Report preallocation suggestions on for loops, false by default
+ nestif:
+ # minimal complexity of if statements to report, 5 by default
+ min-complexity: 4
+
+ nilnil:
+ # By default, nilnil checks all returned types below.
+ checked-types:
+ - ptr
+ - func
+ - iface
+ - map
+ - chan
+
+ nlreturn:
+ # size of the block (including return statement that is still "OK")
+ # so no return split required.
+ block-size: 1
+
nolintlint:
- # Enable to ensure that nolint directives are all used. Default is true.
+ # Disable to ensure that all nolint directives actually have an effect. Default is true.
allow-unused: false
# Disable to ensure that nolint directives don't have a leading space. Default is true.
allow-leading-space: true
# Exclude following linters from requiring an explanation. Default is [].
- allow-no-explanation: []
+ allow-no-explanation: [ ]
# Enable to require an explanation of nonzero length after each nolint directive. Default is false.
- require-explanation: true
+ require-explanation: false
# Enable to require nolint directives to mention the specific linter being suppressed. Default is false.
require-specific: true
+
+ prealloc:
+ # XXX: we don't recommend using this linter before doing performance profiling.
+ # For most programs usage of prealloc will be a premature optimization.
+
+ # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.
+ # True by default.
+ simple: true
+ range-loops: true # Report preallocation suggestions on range loops, true by default
+ for-loops: false # Report preallocation suggestions on for loops, false by default
+
+ promlinter:
+ # Promlinter cannot infer all metrics name in static analysis.
+ # Enable strict mode will also include the errors caused by failing to parse the args.
+ strict: false
+ # Please refer to https://github.com/yeya24/promlinter#usage for detailed usage.
+ disabled-linters:
+ # - "Help"
+ # - "MetricUnits"
+ # - "Counter"
+ # - "HistogramSummaryReserved"
+ # - "MetricTypeInName"
+ # - "ReservedChars"
+ # - "CamelCase"
+ # - "lintUnitAbbreviations"
+
+ predeclared:
+ # comma-separated list of predeclared identifiers to not report on
+ ignore: ""
+ # include method names and field names (i.e., qualified names) in checks
+ q: false
+ rowserrcheck:
+ packages:
+ - github.com/jmoiron/sqlx
+ revive:
+ # see https://github.com/mgechev/revive#available-rules for details.
+ ignore-generated-header: true
+ severity: warning
+ rules:
+ - name: indent-error-flow
+ severity: warning
+ staticcheck:
+ # Select the Go version to target. The default is '1.13'.
+ go: "1.16"
+ # https://staticcheck.io/docs/options#checks
+ checks: [ "all" ]
+
+ stylecheck:
+ # Select the Go version to target. The default is '1.13'.
+ go: "1.16"
+
+ # https://staticcheck.io/docs/options#checks
+ checks: [ "all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022" ]
+ # https://staticcheck.io/docs/options#dot_import_whitelist
+ dot-import-whitelist:
+ - fmt
+ # https://staticcheck.io/docs/options#initialisms
+ initialisms: [ "ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "QPS", "RAM", "RPC", "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "GID", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", "XSS" ]
+ # https://staticcheck.io/docs/options#http_status_code_whitelist
+ http-status-code-whitelist: [ "200", "400", "404", "500" ]
+
+
+ tagliatelle:
+ # check the struck tag name case
+ case:
+ # use the struct field name to check the name of the struct tag
+ use-field-name: true
+ rules:
+ # any struct tag type can be used.
+ # support string case: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower`
+ json: camel
+ yaml: camel
+ xml: camel
+ bson: camel
+ avro: snake
+ mapstructure: kebab
+
+ testpackage:
+ # regexp pattern to skip files
+ skip-regexp: (id|export|internal)_test\.go
+ thelper:
+ # The following configurations enable all checks. It can be omitted because all checks are enabled by default.
+ # You can enable only required checks deleting unnecessary checks.
+ test:
+ first: true
+ name: true
+ begin: true
+ benchmark:
+ first: true
+ name: true
+ begin: true
+ tb:
+ first: true
+ name: true
+ begin: true
+
+ tenv:
+ # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.
+ # By default, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked.
+ all: false
+
unparam:
# Inspect exported functions, default is false. Set to true if no external program/library imports your code.
# XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:
@@ -187,6 +656,24 @@ linters-settings:
whitespace:
multi-if: false # Enforces newlines (or comments) after every multi-line if statement
multi-func: false # Enforces newlines (or comments) after every multi-line function signature
+
+ wrapcheck:
+ # An array of strings that specify substrings of signatures to ignore.
+ # If this set, it will override the default set of ignored signatures.
+ # See https://github.com/tomarrell/wrapcheck#configuration for more information.
+ ignoreSigs:
+ - .Errorf(
+ - errors.New(
+ - errors.Unwrap(
+ - .Wrap(
+ - .Wrapf(
+ - .WithMessage(
+ - .WithMessagef(
+ - .WithStack(
+ ignorePackageGlobs:
+ - encoding/*
+ - github.com/pkg/*
+
wsl:
# If true append is only allowed to be cuddled if appending value is
# matching variables, fields or types on line above. Default is true.
@@ -194,6 +681,8 @@ linters-settings:
# Allow calls and assignments to be cuddled as long as the lines have any
# matching variables, fields or types. Default is true.
allow-assign-and-call: true
+ # Allow assignments to be cuddled with anything. Default is false.
+ allow-assign-and-anything: false
# Allow multiline assignments to be cuddled. Default is true.
allow-multiline-assign: true
# Allow declarations (var) to be cuddled.
@@ -206,65 +695,181 @@ linters-settings:
force-err-cuddling: false
# Allow leading comments to be separated with empty liens
allow-separated-leading-comment: false
+ makezero:
+ # Allow only slices initialized with a length of zero. Default is false.
+ always: false
+
+
+ # The custom section can be used to define linter plugins to be loaded at runtime. See README doc
+ # for more info.
+ #custom:
+ # Each custom linter should have a unique name.
+ #example:
+ # The path to the plugin *.so. Can be absolute or local. Required for each custom linter
+ #path: /path/to/example.so
+ # The description of the linter. Optional, just for documentation purposes.
+ #description: This is an example usage of a plugin linter.
+ # Intended to point to the repo location of the linter. Optional, just for documentation purposes.
+ #original-url: github.com/golangci/example-linter
linters:
# please, do not use `enable-all`: it's deprecated and will be removed soon.
# inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint
+ # enable-all: true
disable-all: true
enable:
+ - typecheck
+ - asciicheck
- bodyclose
+ - cyclop
- deadcode
- - depguard
+ # - depguard
- dogsled
- dupl
+ - durationcheck
- errcheck
+ - errorlint
+ - exhaustive
+ - exportloopref
+ # - forbidigo
- funlen
- - gochecknoinits
+ # - gci
+ # - gochecknoinits
+ - gocognit
- goconst
- - gocritic
- gocyclo
+ - godot
+ - godox
- gofmt
+ - gofumpt
+ - goheader
- goimports
- - golint
+ - gomoddirectives
+ - gomodguard
- goprintffuncname
- gosec
- gosimple
- govet
+ - ifshort
+ - importas
- ineffassign
- - interfacer
- lll
+ - makezero
- misspell
- nakedret
+ - nestif
+ - nilerr
+ - nlreturn
+ - noctx
- nolintlint
+ - paralleltest
+ - prealloc
+ - predeclared
+ - promlinter
+ - revive
- rowserrcheck
- - scopelint
+ - sqlclosecheck
- staticcheck
- structcheck
- stylecheck
- - typecheck
+ - thelper
+ - tparallel
- unconvert
- unparam
- unused
- varcheck
+ - wastedassign
- whitespace
- - asciicheck
- - gocognit
- - godot
- - godox
- - maligned
- - nestif
- - prealloc
- - gomodguard
- # don't enable:
- #- goerr113
- #- wsl
- #- testpackage
- #- exhaustive (TODO: enable after next release; current release at time of writing is v1.27)
- #- gochecknoglobals
- #- gomnd
+ - bidichk
+ - wastedassign
+ - golint
+ - execinquery
+ - nosprintfhostport
+ - grouper
+ - decorder
+ - errchkjson
+ - maintidx
+ #- containedctx
+ #- tagliatelle
+ #- nonamedreturns
+ #- nilnil
+ #- tenv
+ #- varnamelen
+ #- contextcheck
+ #- errname
+ #- ForceTypeAssert
+ #- nilassign
+ fast: false
issues:
+ # List of regexps of issue texts to exclude, empty list by default.
+ # But independently from this option we use default exclude patterns,
+ # it can be disabled by `exclude-use-default: false`. To list all
+ # excluded by default patterns execute `golangci-lint run --help`
+ exclude:
+ - tools/.*
+ - test/.*
+ - third_party/.*
+
# Excluding configuration per-path, per-linter, per-text and per-source
+ exclude-rules:
+ - linters:
+ - golint
+ path: (internal/api/.*)\.go # exclude golint for internal/api/... files
+
+ - linters:
+ - revive
+ path: (log/.*)\.go
+
+ - linters:
+ - wrapcheck
+ path: (cmd/.*|pkg/.*)\.go
+
+ - linters:
+ - typecheck
+ #path: (pkg/storage/.*)\.go
+ path: (internal/.*|pkg/.*)\.go
+
+ - path: (cmd/.*|test/.*|tools/.*|internal/pump/pumps/.*)\.go
+ linters:
+ - forbidigo
+
+ - path: (cmd/[a-z]*/.*|store/.*)\.go
+ linters:
+ - dupl
+
+ - linters:
+ - gocritic
+ text: (hugeParam:|rangeValCopy:)
+
+ - path: (cmd/[a-z]*/.*)\.go
+ linters:
+ - lll
+
+ - path: (validator/.*|code/.*|validator/.*|watcher/watcher/.*)
+ linters:
+ - gochecknoinits
+
+ - path: (internal/.*/options|internal/pump|pkg/log/options.go|internal/authzserver|tools/)
+ linters:
+ - tagliatelle
+
+ - path: (pkg/app/.*)\.go
+ linters:
+ - deadcode
+ - unused
+ - varcheck
+ - forbidigo
+
+ # Exclude some staticcheck messages
+ - linters:
+ - staticcheck
+ text: "SA9003:"
+
+ # Exclude lll issues for long lines with go:generate
+ - linters:
+ - lll
+ source: "^//go:generate "
# Independently from option `exclude` we use default exclude patterns,
# it can be disabled by this option. To list all
@@ -300,24 +905,27 @@ issues:
# Show only new issues created in git patch with set file path.
#new-from-patch: path/to/patch/file
+ # Fix found issues (if it's supported by the linter)
+ fix: true
+
severity:
# Default value is empty string.
- # Set the default severity for issues. If severity rules are defined and the issues
- # do not match or no severity is provided to the rule this will be the default
- # severity applied. Severities should match the supported severity names of the
+ # Set the default severity for issues. If severity rules are defined and the issues
+ # do not match or no severity is provided to the rule this will be the default
+ # severity applied. Severities should match the supported severity names of the
# selected out format.
# - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity
# - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#severity
# - Github: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
default-severity: error
- # The default value is false.
+ # The default value is false.
# If set to true severity-rules regular expressions become case sensitive.
case-sensitive: false
# Default value is empty list.
# When a list of severity rules are provided, severity information will be added to lint
- # issues. Severity rules have the same filtering capability as exclude rules except you
+ # issues. Severity rules have the same filtering capability as exclude rules except you
# are allowed to specify one matcher per severity rule.
# Only affects out formats that support setting severity information.
rules:
diff --git a/CHANGELOG/CHANGELOG-3.0.md b/CHANGELOG/CHANGELOG-3.0.md
index 72cc56bbf..cf1aa4b62 100644
--- a/CHANGELOG/CHANGELOG-3.0.md
+++ b/CHANGELOG/CHANGELOG-3.0.md
@@ -1,23 +1,9 @@
# Version logging for OpenIM
-**3.0 Major refactoring**
-
-
- [Version logging for OpenIM](#version-logging-for-openim)
- - [\[v3.0\]](#v30)
- - [v3.0.0 - 2023-07-10](#v300---2023-07-10)
- - [v2.9.0+1.839643f - 2023-07-07](#v2901839643f---2023-07-07)
- - [v2.9.0+2.35f07fe - 2023-07-06](#v290235f07fe---2023-07-06)
- - [v2.9.0+1.b5072b1 - 2023-07-05](#v2901b5072b1---2023-07-05)
- - [v2.9.0+3.2667a3a - 2023-07-05](#v29032667a3a---2023-07-05)
- - [v2.9.0+7.04818ca - 2023-07-05](#v290704818ca---2023-07-05)
+ - [Unreleased](#unreleased)
- [v2.9.0 - 2023-07-04](#v290---2023-07-04)
- - [v0.0.0+1.3714b4f - 2023-07-04](#v00013714b4f---2023-07-04)
- - [v0.0.0+635.8b92c90 - 2023-07-04](#v0006358b92c90---2023-07-04)
- - [v0.0.0+1.78a6d03 - 2023-07-04](#v000178a6d03---2023-07-04)
- - [v0.0.0+2.e057c18 - 2023-07-04](#v0002e057c18---2023-07-04)
- - [v0.0.0+630.b55ac4a - 2023-07-04](#v000630b55ac4a---2023-07-04)
- [Reverts](#reverts)
- [Pull Requests](#pull-requests)
- [v2.3.3 - 2022-09-18](#v233---2022-09-18)
@@ -32,17 +18,15 @@
- [v2.0.9 - 2022-04-29](#v209---2022-04-29)
- [Reverts](#reverts-1)
- [Pull Requests](#pull-requests-2)
- - [v2.0.8 - 2022-04-24](#v208---2022-04-24)
- - [Pull Requests](#pull-requests-3)
- [v2.0.7 - 2022-04-08](#v207---2022-04-08)
- - [Pull Requests](#pull-requests-4)
+ - [Pull Requests](#pull-requests-3)
- [v2.0.6 - 2022-04-01](#v206---2022-04-01)
- - [Pull Requests](#pull-requests-5)
+ - [Pull Requests](#pull-requests-4)
- [v2.0.5 - 2022-03-24](#v205---2022-03-24)
- [v2.04 - 2022-03-18](#v204---2022-03-18)
- [v2.0.3 - 2022-03-11](#v203---2022-03-11)
- [v2.0.2 - 2022-03-04](#v202---2022-03-04)
- - [Pull Requests](#pull-requests-6)
+ - [Pull Requests](#pull-requests-5)
- [v2.0.1 - 2022-02-25](#v201---2022-02-25)
- [v2.0.0 - 2022-02-23](#v200---2022-02-23)
- [v1.0.7 - 2021-12-17](#v107---2021-12-17)
@@ -54,48 +38,14 @@
- [v1.0.0 - 2021-10-28](#v100---2021-10-28)
- [Reverts](#reverts-2)
-
-## [v3.0]
-
-
-
-## [v3.0.0] - 2023-07-10
-
-
-## [v2.9.0+1.839643f] - 2023-07-07
+## [Unreleased]
-
-## [v2.9.0+2.35f07fe] - 2023-07-06
-
-
-## [v2.9.0+1.b5072b1] - 2023-07-05
-
-
-## [v2.9.0+3.2667a3a] - 2023-07-05
-
-
-## [v2.9.0+7.04818ca] - 2023-07-05
## [v2.9.0] - 2023-07-04
-
-
-## [v0.0.0+1.3714b4f] - 2023-07-04
-
-
-## [v0.0.0+635.8b92c90] - 2023-07-04
-
-
-## [v0.0.0+1.78a6d03] - 2023-07-04
-
-
-## [v0.0.0+2.e057c18] - 2023-07-04
-
-
-## [v0.0.0+630.b55ac4a] - 2023-07-04
### Reverts
- update etcd to v3.5.2 ([#206](https://github.com/OpenIMSDK/Open-IM-Server/issues/206))
@@ -144,11 +94,6 @@
- Merge branch 'tuoyun'
- Merge branch 'tuoyun'
- Merge branch 'tuoyun'
-
-
-
-## [v2.0.8] - 2022-04-24
-### Pull Requests
- Merge branch 'tuoyun'
- Merge branch 'tuoyun'
@@ -216,19 +161,8 @@
- update
-[Unreleased]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v3.0.0...HEAD
-[v3.0.0]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0+1.839643f...v3.0.0
-[v2.9.0+1.839643f]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0+2.35f07fe...v2.9.0+1.839643f
-[v2.9.0+2.35f07fe]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0+1.b5072b1...v2.9.0+2.35f07fe
-[v2.9.0+1.b5072b1]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0+3.2667a3a...v2.9.0+1.b5072b1
-[v2.9.0+3.2667a3a]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0+7.04818ca...v2.9.0+3.2667a3a
-[v2.9.0+7.04818ca]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0...v2.9.0+7.04818ca
-[v2.9.0]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v0.0.0+1.3714b4f...v2.9.0
-[v0.0.0+1.3714b4f]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v0.0.0+635.8b92c90...v0.0.0+1.3714b4f
-[v0.0.0+635.8b92c90]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v0.0.0+1.78a6d03...v0.0.0+635.8b92c90
-[v0.0.0+1.78a6d03]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v0.0.0+2.e057c18...v0.0.0+1.78a6d03
-[v0.0.0+2.e057c18]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v0.0.0+630.b55ac4a...v0.0.0+2.e057c18
-[v0.0.0+630.b55ac4a]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.3.3...v0.0.0+630.b55ac4a
+[Unreleased]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.9.0...HEAD
+[v2.9.0]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.3.3...v2.9.0
[v2.3.3]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.3.2...v2.3.3
[v2.3.2]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.3.0-rc2...v2.3.2
[v2.3.0-rc2]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.3.0-rc1...v2.3.0-rc2
@@ -237,8 +171,7 @@
[v2.2.0]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.1.0...v2.2.0
[v2.1.0]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.10...v2.1.0
[v2.0.10]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.9...v2.0.10
-[v2.0.9]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.8...v2.0.9
-[v2.0.8]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.7...v2.0.8
+[v2.0.9]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.7...v2.0.9
[v2.0.7]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.6...v2.0.7
[v2.0.6]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.0.5...v2.0.6
[v2.0.5]: https://github.com/OpenIMSDK/Open-IM-Server/compare/v2.04...v2.0.5
diff --git a/CHANGELOG/CHANGELOG.md b/CHANGELOG/CHANGELOG.md
index 39ed572db..3307c2068 100644
--- a/CHANGELOG/CHANGELOG.md
+++ b/CHANGELOG/CHANGELOG.md
@@ -18,6 +18,14 @@ git commit -am "release 2.0.0"
git tag 2.0.0
```
+| Query | Description | Example |
+| -------------- | ---------------------------------------------- | --------------------------- |
+| `..` | Commit contained in `` tags from ``. | `$ git-chglog 1.0.0..2.0.0` |
+| `..` | Commit from the `` to the latest tag. | `$ git-chglog 1.0.0..` |
+| `..` | Commit from the oldest tag to ``. | `$ git-chglog ..2.0.0` |
+| `` | Commit contained in ``. | `$ git-chglog 1.0.0` |
+
+
## Release version logs
+ [OpenIM CHANGELOG-V1.0](CHANGELOG-1.0.md)
diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go
index 4619db4ce..0914e9d1d 100644
--- a/internal/rpc/user/user.go
+++ b/internal/rpc/user/user.go
@@ -3,10 +3,11 @@ package user
import (
"context"
"errors"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"strings"
"time"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
diff --git a/scripts/githooks/pre-commit b/scripts/githooks/pre-commit
index 8fbee166c..c14d1a967 100644
--- a/scripts/githooks/pre-commit
+++ b/scripts/githooks/pre-commit
@@ -26,7 +26,7 @@
LC_ALL=C
local_branch="$(git rev-parse --abbrev-ref HEAD)"
-valid_branch_regex="^(main|master|develop)$|(feature|feat|openim|release|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$"
+valid_branch_regex="^(main|master|develop|release)$|(feature|feat|openim|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$"
YELLOW="\e[93m"
GREEN="\e[32m"
diff --git a/scripts/stop_all.sh b/scripts/stop_all.sh
index f413d2a66..8bd5aaf34 100755
--- a/scripts/stop_all.sh
+++ b/scripts/stop_all.sh
@@ -20,7 +20,6 @@ OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
#Include shell font styles and some basic information
source $OPENIM_ROOT/scripts/style_info.sh
source $OPENIM_ROOT/scripts/path_info.sh
-source $OPENIM_ROOT/scripts/function.sh
bin_dir="$BIN_DIR"
logs_dir="$OPENIM_ROOT/logs"
From 95ec99daf0d20ec39311f7bbaac4f384e3596a47 Mon Sep 17 00:00:00 2001
From: skiffer-git <44203734@qq.com>
Date: Wed, 12 Jul 2023 21:33:11 +0800
Subject: [PATCH 2/9] fix bug ContentType is wrong range for Check
---
pkg/common/constant/constant.go | 27 ++++++++++++++-------------
pkg/proto/sdkws/sdkws.go | 6 +++---
2 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go
index 72cc34af8..f1abdcf64 100644
--- a/pkg/common/constant/constant.go
+++ b/pkg/common/constant/constant.go
@@ -4,19 +4,20 @@ const (
///ContentType
//UserRelated
- Text = 101
- Picture = 102
- Voice = 103
- Video = 104
- File = 105
- AtText = 106
- Merger = 107
- Card = 108
- Location = 109
- Custom = 110
- Revoke = 111
- Typing = 113
- Quote = 114
+ ContentTypeBegin = 100
+ Text = 101
+ Picture = 102
+ Voice = 103
+ Video = 104
+ File = 105
+ AtText = 106
+ Merger = 107
+ Card = 108
+ Location = 109
+ Custom = 110
+ Revoke = 111
+ Typing = 113
+ Quote = 114
AdvancedText = 117
diff --git a/pkg/proto/sdkws/sdkws.go b/pkg/proto/sdkws/sdkws.go
index 094cb823b..19bf7f968 100644
--- a/pkg/proto/sdkws/sdkws.go
+++ b/pkg/proto/sdkws/sdkws.go
@@ -12,10 +12,10 @@ func (x *MsgData) Check() error {
if x.Content == nil {
return errs.ErrArgs.Wrap("content is empty")
}
- if x.ContentType < 101 || x.ContentType > 203 {
- return errs.ErrArgs.Wrap("content is empty")
+ if x.ContentType <= constant.ContentTypeBegin || x.ContentType >= constant.NotificationEnd {
+ return errs.ErrArgs.Wrap("content type is invalid")
}
- if x.SessionType < 1 || x.SessionType > 4 {
+ if x.SessionType < constant.SingleChatType || x.SessionType > constant.NotificationChatType {
return errs.ErrArgs.Wrap("sessionType is invalid")
}
if x.SessionType == constant.SingleChatType || x.SessionType == constant.NotificationChatType {
From b46f3410ad663738d1b691a17ca8d093d84d9cfb Mon Sep 17 00:00:00 2001
From: skiffer-git <44203734@qq.com>
Date: Wed, 12 Jul 2023 22:07:25 +0800
Subject: [PATCH 3/9] Add feature: Replace apiURL (in config.yaml) with an
external IP address
---
.env | 1 +
install_im_server.sh | 4 ++++
scripts/init_pwd.sh | 2 ++
3 files changed, 7 insertions(+)
diff --git a/.env b/.env
index 75f9707da..048662d97 100644
--- a/.env
+++ b/.env
@@ -1,4 +1,5 @@
USER=root
PASSWORD=openIM123
MINIO_ENDPOINT=http://127.0.0.1:10005
+API_URL=http://127.0.0.1:10002/object/
DATA_DIR=./
diff --git a/install_im_server.sh b/install_im_server.sh
index b08597e80..c526d43db 100644
--- a/install_im_server.sh
+++ b/install_im_server.sh
@@ -9,6 +9,10 @@ source .env
echo $MINIO_ENDPOINT
# Replace local IP address with the public IP address in .env file
+if [ $API_URL == "http://127.0.0.1:10002/object/" ]; then
+ sed -i "s/127.0.0.1/${internet_ip}/" .env
+fi
+
if [ $MINIO_ENDPOINT == "http://127.0.0.1:10005" ]; then
sed -i "s/127.0.0.1/${internet_ip}/" .env
fi
diff --git a/scripts/init_pwd.sh b/scripts/init_pwd.sh
index 25ee559a3..a3ce6048a 100755
--- a/scripts/init_pwd.sh
+++ b/scripts/init_pwd.sh
@@ -51,6 +51,8 @@ sed -i '/redis:/,/password:/s/password: .*/password: '${PASSWORD}'/' $config_fil
sed -i "/minio:/,/isDistributedMod:/ s/accessKeyID:.*/accessKeyID: $USER/" $config_file
sed -i "/minio:/,/isDistributedMod:/ s/secretAccessKey:.*/secretAccessKey: $PASSWORD/" $config_file
sed -i '/minio:/,/endpoint:/s|endpoint: .*|endpoint: '${MINIO_ENDPOINT}'|' $config_file
+sed -i '/object:/,/apiURL:/s|apiURL: .*|apiURL: '${API_URL}'|' $config_file
+
# Replace secret for token
sed -i "s/secret: .*/secret: $PASSWORD/" $config_file
From eb7953cacb42c39b0e529cc8b0dfbab376eda904 Mon Sep 17 00:00:00 2001
From: pluto <83957921+plutoyty@users.noreply.github.com>
Date: Thu, 13 Jul 2023 10:30:25 +0800
Subject: [PATCH 4/9] cicd: update openim-ci.yml (#528)
---
.github/workflows/openim-ci.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/openim-ci.yml b/.github/workflows/openim-ci.yml
index 5794b2ef3..73b30e42b 100644
--- a/.github/workflows/openim-ci.yml
+++ b/.github/workflows/openim-ci.yml
@@ -66,6 +66,7 @@ jobs:
run: |
make format
echo "Run go format successfully"
+ continue-on-error: true
# - name: Generate all necessary files, such as error code files
# run: |
@@ -149,4 +150,4 @@ jobs:
# uses: goreleaser/goreleaser-action@v4
# with:
# version: latest
-# args: release --clean --skip-publish --snapshot
\ No newline at end of file
+# args: release --clean --skip-publish --snapshot
From 7bf8a898e2f503b00e3297c79067c51d1a5f9407 Mon Sep 17 00:00:00 2001
From: Xinwei Xiong <86140903+cubxxw@users.noreply.github.com>
Date: Thu, 13 Jul 2023 11:37:23 +0800
Subject: [PATCH 5/9] feat: add scripts (#525)
---
.github/workflows/release.yml | 37 ++
CHANGELOG/CHANGELOG.md | 69 +++-
config/config.yaml | 2 +-
docker-compose.yaml | 2 +-
internal/api/third.go | 10 +-
internal/msggateway/client.go | 23 +-
internal/msgtransfer/init.go | 27 +-
internal/push/push_to_client.go | 103 ++++-
internal/rpc/conversation/conversaion.go | 86 +++-
internal/rpc/group/db_map.go | 3 +-
internal/rpc/group/group.go | 218 +++++++---
internal/rpc/group/statistics.go | 8 +-
internal/rpc/msg/server.go | 6 +-
internal/rpc/msg/statistics.go | 22 +-
internal/rpc/third/s3.go | 13 +-
internal/rpc/third/third.go | 18 +-
internal/rpc/third/tool.go | 5 +-
internal/rpc/user/user.go | 54 ++-
internal/tools/conversation.go | 51 ++-
internal/tools/cron_task.go | 13 +-
internal/tools/msg.go | 67 +++-
pkg/apistruct/msg.go | 62 +--
pkg/common/cmd/rpc.go | 10 +-
pkg/common/db/controller/conversation.go | 103 ++++-
pkg/common/db/controller/group.go | 6 +-
pkg/common/db/controller/msg.go | 397 ++++++++++++++++---
pkg/common/db/controller/s3.go | 27 +-
pkg/common/db/relation/conversation_model.go | 191 +++++++--
pkg/common/db/relation/group_model.go | 39 +-
pkg/common/db/relation/object_model.go | 4 +-
pkg/common/db/s3/cont/controller.go | 25 +-
pkg/common/db/s3/cont/error.go | 1 +
pkg/common/db/s3/cos/cos.go | 66 ++-
pkg/common/db/s3/minio/minio.go | 51 ++-
pkg/common/db/s3/oss/oss.go | 48 ++-
pkg/common/db/s3/oss/sign.go | 8 +-
pkg/common/db/s3/s3.go | 23 +-
pkg/common/db/table/relation/conversation.go | 47 ++-
pkg/common/db/table/unrelation/msg.go | 19 +-
pkg/common/db/unrelation/msg.go | 19 +-
pkg/common/log/sql_logger.go | 43 +-
pkg/discoveryregistry/zookeeper/discover.go | 38 +-
pkg/proto/msg/msg.pb.go | 8 +-
pkg/rpcclient/conversation.go | 83 +++-
pkg/rpcclient/msg.go | 49 ++-
pkg/rpcclient/notification/group.go | 262 +++++++++---
pkg/rpcclient/notification/msg.go | 15 +-
scripts/build_all_service.sh | 4 +-
scripts/enterprise/check_all.sh | 2 +-
scripts/githooks/pre-commit | 2 +-
scripts/githooks/pre-push | 11 +
scripts/msg_gateway_start.sh | 2 +-
scripts/msg_transfer_start.sh | 4 +-
scripts/path_info.sh | 1 +
scripts/start_all.sh | 12 +
scripts/start_rpc_service.sh | 4 +-
56 files changed, 2065 insertions(+), 458 deletions(-)
create mode 100644 .github/workflows/release.yml
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..280804c94
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,37 @@
+name: goreleaser
+
+on:
+ push:
+ # run only against tags
+ tags:
+ - '*'
+
+permissions:
+ contents: write
+ # packages: write
+ # issues: write
+
+jobs:
+ goreleaser:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - run: git fetch --force --tags
+ - uses: actions/setup-go@v4
+ with:
+ go-version: stable
+ # More assembly might be required: Docker logins, GPG, etc. It all depends
+ # on your needs.
+ - uses: goreleaser/goreleaser-action@v4
+ with:
+ # either 'goreleaser' (default) or 'goreleaser-pro':
+ distribution: goreleaser
+ version: latest
+ args: release --clean
+ env:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ # Your GoReleaser Pro key, if you are using the 'goreleaser-pro'
+ # distribution:
+ # GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
diff --git a/CHANGELOG/CHANGELOG.md b/CHANGELOG/CHANGELOG.md
index 3307c2068..2d788d4c4 100644
--- a/CHANGELOG/CHANGELOG.md
+++ b/CHANGELOG/CHANGELOG.md
@@ -1,5 +1,16 @@
# Changelog
+- [Changelog](#changelog)
+ - [command](#command)
+ - [create next tag](#create-next-tag)
+ - [Release version logs](#release-version-logs)
+ - [Introduction](#introduction)
+ - [Naming Format](#naming-format)
+ - [Examples](#examples)
+ - [Version Modifiers](#version-modifiers)
+ - [Versioning Strategy](#versioning-strategy)
+
+
All notable changes to this project will be documented in this file.
+ [https://github.com/OpenIMSDK/Open-IM-Server/releases](https://github.com/OpenIMSDK/Open-IM-Server/releases)
@@ -34,4 +45,60 @@ git tag 2.0.0
+ [OpenIM CHANGELOG-V2.2](CHANGELOG-2.2.md)
+ [OpenIM CHANGELOG-V2.3](CHANGELOG-2.3.md)
+ [OpenIM CHANGELOG-V2.9](CHANGELOG-2.9.md)
-+ [OpenIM CHANGELOG-V3.0](CHANGELOG-3.0.md)
\ No newline at end of file
++ [OpenIM CHANGELOG-V3.0](CHANGELOG-3.0.md)
+
+## Introduction
+
+In both the open-source and closed-source software development communities, it is important to follow a consistent and understandable versioning scheme for software projects. This ensures clear communication of changes, compatibility, and stability across different releases. One widely adopted naming convention is the Semantic Versioning 2.0.0.
+
+## Naming Format
+
+The most common format for version numbers is as follows:
+
+```
+major.minor[.patch[.build]]
+```
+
+Let's take a closer look at each component:
+
+1. **Major Version**: This is the first number in the versioning scheme and indicates significant changes that may not be backward compatible (specific to each project).
+2. **Minor Version**: The second number signifies the addition of new features while maintaining backward compatibility.
+3. **Patch Version**: The third number represents bug fixes or code optimizations without introducing new features. It is generally backward compatible.
+4. **Build Version**: Typically an automatically generated number that increments with each code commit.
+
+## Examples
+
+Here are a few examples to illustrate the versioning scheme:
+
+1. `1.0`
+2. `2.14.0.1478`
+3. `3.2.1 build-354`
+
+## Version Modifiers
+
+Apart from the version numbers, there are also version modifiers used to indicate specific stages or statuses of a release. Some commonly used version modifiers include:
+
+- **alpha**: An internal testing version with numerous known bugs. It is primarily used for communication among developers.
+- **beta**: A testing version released to enthusiastic users for feedback and bug detection.
+- **rc (release candidate)**: The final testing version before the official release.
+- **ga (general availability)**: The initial stable release for public distribution.
+- **r/release** (or no modifier at all): The final released version intended for general users.
+- **lts (long-term support)**: Designates a version that will receive extended maintenance and bug fixes for a specified number of years.
+
+## Versioning Strategy
+
+To effectively manage version numbers, the following strategies are commonly employed:
+
+- The initial version of a project can be either `0.1` or `1.0`.
+- When fixing bugs, the patch version is incremented by 1.
+- When adding new features, the minor version is incremented by 1, and the patch version is reset to 0.
+- In the case of significant modifications, the major version is incremented by 1.
+- The build version is usually automatically generated by the compilation process and follows a defined format. It does not require manual control.
+
+By adhering to these strategies and guidelines, developers can maintain consistency and clarity in versioning their software projects. This enables users and collaborators to understand the nature of changes between different releases and ensure compatibility with their systems.
+
+(Note: Markdown formatting has been used to structure this article. Markdown is a lightweight markup language used to format text on platforms like GitHub.)
+
+------
+
+**Note**: The above article is based on the given content and aims to provide a Markdown-formatted English article explaining the naming conventions for software project versions, specifically focusing on the Semantic Versioning 2.0.0.
\ No newline at end of file
diff --git a/config/config.yaml b/config/config.yaml
index 07d46957e..5170e9a83 100644
--- a/config/config.yaml
+++ b/config/config.yaml
@@ -117,7 +117,7 @@ rpcRegisterName: #rpc注册服务名,不建议修改
openImThirdName: Third
log:
- storageLocation: ../logs/ #存放目录
+ storageLocation: ../../../../../logs/ #TODO: 存放目录
rotationTime: 24 #日志旋转时间
remainRotationCount: 2 #日志数量
remainLogLevel: 6 #日志级别 6表示全都打印,
diff --git a/docker-compose.yaml b/docker-compose.yaml
index c78e4a63b..cea3b1480 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -100,7 +100,7 @@ services:
openim_server:
- image: ghcr.io/openimsdk/openim-server:v3.0.0
+ image: ghcr.io/openimsdk/openim-server:v3.0.0-alpha.0
container_name: openim-server
volumes:
- ./logs:/Open-IM-Server/logs
diff --git a/internal/api/third.go b/internal/api/third.go
index ad9475511..895e3784f 100644
--- a/internal/api/third.go
+++ b/internal/api/third.go
@@ -1,16 +1,18 @@
package api
import (
+ "math/rand"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
- "github.com/gin-gonic/gin"
- "math/rand"
- "net/http"
- "strconv"
)
type ThirdApi rpcclient.Third
diff --git a/internal/msggateway/client.go b/internal/msggateway/client.go
index ec3e08d7c..34f9cf47d 100644
--- a/internal/msggateway/client.go
+++ b/internal/msggateway/client.go
@@ -21,13 +21,14 @@ import (
"runtime/debug"
"sync"
+ "google.golang.org/protobuf/proto"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "google.golang.org/protobuf/proto"
)
var ErrConnClosed = errors.New("conn has closed")
@@ -80,7 +81,14 @@ func newClient(ctx *UserConnContext, conn LongConn, isCompress bool) *Client {
ctx: ctx,
}
}
-func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, isBackground, isCompress bool, longConnServer LongConnServer, token string) {
+
+func (c *Client) ResetClient(
+ ctx *UserConnContext,
+ conn LongConn,
+ isBackground, isCompress bool,
+ longConnServer LongConnServer,
+ token string,
+) {
c.w = new(sync.Mutex)
c.conn = conn
c.PlatformID = utils.StringToInt(ctx.GetPlatformID())
@@ -161,7 +169,9 @@ func (c *Client) handleMessage(message []byte) error {
if binaryReq.SendID != c.UserID {
return utils.Wrap(errors.New("exception conn userID not same to req userID"), binaryReq.String())
}
- ctx := mcontext.WithMustInfoCtx([]string{binaryReq.OperationID, binaryReq.SendID, constant.PlatformIDToName(c.PlatformID), c.ctx.GetConnID()})
+ ctx := mcontext.WithMustInfoCtx(
+ []string{binaryReq.OperationID, binaryReq.SendID, constant.PlatformIDToName(c.PlatformID), c.ctx.GetConnID()},
+ )
log.ZDebug(ctx, "gateway req message", "req", binaryReq.String())
var messageErr error
var resp []byte
@@ -179,7 +189,12 @@ func (c *Client) handleMessage(message []byte) error {
case WsSetBackgroundStatus:
resp, messageErr = c.setAppBackgroundStatus(ctx, binaryReq)
default:
- return fmt.Errorf("ReqIdentifier failed,sendID:%s,msgIncr:%s,reqIdentifier:%d", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier)
+ return fmt.Errorf(
+ "ReqIdentifier failed,sendID:%s,msgIncr:%s,reqIdentifier:%d",
+ binaryReq.SendID,
+ binaryReq.MsgIncr,
+ binaryReq.ReqIdentifier,
+ )
}
c.replyMessage(ctx, &binaryReq, messageErr, resp)
return nil
diff --git a/internal/msgtransfer/init.go b/internal/msgtransfer/init.go
index 1f166d743..3bad5f12e 100644
--- a/internal/msgtransfer/init.go
+++ b/internal/msgtransfer/init.go
@@ -5,6 +5,9 @@ import (
"sync"
"time"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
@@ -16,8 +19,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
)
type MsgTransfer struct {
@@ -46,9 +47,18 @@ func StartTransfer(prometheusPort int) error {
if err := mongo.CreateMsgIndex(); err != nil {
return err
}
- client, err := openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema,
- openKeeper.WithFreq(time.Hour), openKeeper.WithRoundRobin(), openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username,
- config.Config.Zookeeper.Password), openKeeper.WithTimeout(10), openKeeper.WithLogger(log.NewZkLogger()))
+ client, err := openKeeper.NewClient(
+ config.Config.Zookeeper.ZkAddr,
+ config.Config.Zookeeper.Schema,
+ openKeeper.WithFreq(
+ time.Hour,
+ ),
+ openKeeper.WithRoundRobin(),
+ openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username,
+ config.Config.Zookeeper.Password),
+ openKeeper.WithTimeout(10),
+ openKeeper.WithLogger(log.NewZkLogger()),
+ )
if err != nil {
return err
}
@@ -70,8 +80,11 @@ func StartTransfer(prometheusPort int) error {
func NewMsgTransfer(chatLogDatabase controller.ChatLogDatabase,
msgDatabase controller.CommonMsgDatabase,
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient) *MsgTransfer {
- return &MsgTransfer{persistentCH: NewPersistentConsumerHandler(chatLogDatabase), historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient),
- historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase)}
+ return &MsgTransfer{
+ persistentCH: NewPersistentConsumerHandler(chatLogDatabase),
+ historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient),
+ historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase),
+ }
}
func (m *MsgTransfer) initPrometheus() {
diff --git a/internal/push/push_to_client.go b/internal/push/push_to_client.go
index 607d862e1..4aae679af 100644
--- a/internal/push/push_to_client.go
+++ b/internal/push/push_to_client.go
@@ -38,9 +38,16 @@ type Pusher struct {
var errNoOfflinePusher = errors.New("no offlinePusher is configured")
-func NewPusher(discov discoveryregistry.SvcDiscoveryRegistry, offlinePusher offlinepush.OfflinePusher, database controller.PushDatabase,
- groupLocalCache *localcache.GroupLocalCache, conversationLocalCache *localcache.ConversationLocalCache,
- conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient, msgRpcClient *rpcclient.MessageRpcClient) *Pusher {
+func NewPusher(
+ discov discoveryregistry.SvcDiscoveryRegistry,
+ offlinePusher offlinepush.OfflinePusher,
+ database controller.PushDatabase,
+ groupLocalCache *localcache.GroupLocalCache,
+ conversationLocalCache *localcache.ConversationLocalCache,
+ conversationRpcClient *rpcclient.ConversationRpcClient,
+ groupRpcClient *rpcclient.GroupRpcClient,
+ msgRpcClient *rpcclient.MessageRpcClient,
+) *Pusher {
return &Pusher{
discov: discov,
database: database,
@@ -87,7 +94,18 @@ func (p *Pusher) Push2User(ctx context.Context, userIDs []string, msg *sdkws.Msg
return err
}
isOfflinePush := utils.GetSwitchFromOptions(msg.Options, constant.IsOfflinePush)
- log.ZDebug(ctx, "push_result", "ws push result", wsResults, "sendData", msg, "isOfflinePush", isOfflinePush, "push_to_userID", userIDs)
+ log.ZDebug(
+ ctx,
+ "push_result",
+ "ws push result",
+ wsResults,
+ "sendData",
+ msg,
+ "isOfflinePush",
+ isOfflinePush,
+ "push_to_userID",
+ userIDs,
+ )
p.successCount++
for _, userID := range userIDs {
if isOfflinePush && userID != msg.SendID {
@@ -138,7 +156,15 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws
}
defer func(groupID string, userIDs []string) {
if err := p.DeleteMemberAndSetConversationSeq(ctx, groupID, userIDs); err != nil {
- log.ZError(ctx, "MemberQuitNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", userIDs)
+ log.ZError(
+ ctx,
+ "MemberQuitNotification DeleteMemberAndSetConversationSeq",
+ err,
+ "groupID",
+ groupID,
+ "userIDs",
+ userIDs,
+ )
}
}(groupID, []string{tips.QuitUser.UserID})
pushToUserIDs = append(pushToUserIDs, tips.QuitUser.UserID)
@@ -147,10 +173,21 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws
if p.UnmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
- kickedUsers := utils.Slice(tips.KickedUserList, func(e *sdkws.GroupMemberFullInfo) string { return e.UserID })
+ kickedUsers := utils.Slice(
+ tips.KickedUserList,
+ func(e *sdkws.GroupMemberFullInfo) string { return e.UserID },
+ )
defer func(groupID string, userIDs []string) {
if err := p.DeleteMemberAndSetConversationSeq(ctx, groupID, userIDs); err != nil {
- log.ZError(ctx, "MemberKickedNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", userIDs)
+ log.ZError(
+ ctx,
+ "MemberKickedNotification DeleteMemberAndSetConversationSeq",
+ err,
+ "groupID",
+ groupID,
+ "userIDs",
+ userIDs,
+ )
}
}(groupID, kickedUsers)
pushToUserIDs = append(pushToUserIDs, kickedUsers...)
@@ -160,7 +197,16 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws
if p.UnmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
- log.ZInfo(ctx, "GroupDismissedNotificationInfo****", "groupID", groupID, "num", len(pushToUserIDs), "list", pushToUserIDs)
+ log.ZInfo(
+ ctx,
+ "GroupDismissedNotificationInfo****",
+ "groupID",
+ groupID,
+ "num",
+ len(pushToUserIDs),
+ "list",
+ pushToUserIDs,
+ )
if len(config.Config.Manager.UserID) > 0 {
ctx = mcontext.WithOpUserIDContext(ctx, config.Config.Manager.UserID[0])
}
@@ -224,9 +270,23 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws
log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg)
return err
}
- _, err := p.GetConnsAndOnlinePush(ctx, msg, utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs))
+ _, err := p.GetConnsAndOnlinePush(
+ ctx,
+ msg,
+ utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs),
+ )
if err != nil {
- log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg, "userIDs", utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs))
+ log.ZError(
+ ctx,
+ "offlinePushMsg failed",
+ err,
+ "groupID",
+ groupID,
+ "msg",
+ msg,
+ "userIDs",
+ utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs),
+ )
return err
}
}
@@ -234,7 +294,11 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws
return nil
}
-func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData, pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
+func (p *Pusher) GetConnsAndOnlinePush(
+ ctx context.Context,
+ msg *sdkws.MsgData,
+ pushToUserIDs []string,
+) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
conns, err := p.discov.GetConns(ctx, config.Config.RpcRegisterName.OpenImMessageGatewayName)
log.ZDebug(ctx, "get gateway conn", "conn length", len(conns))
if err != nil {
@@ -243,7 +307,10 @@ func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
//Online push message
for _, v := range conns {
msgClient := msggateway.NewMsgGatewayClient(v)
- reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs})
+ reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(
+ ctx,
+ &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs},
+ )
if err != nil {
continue
}
@@ -256,7 +323,12 @@ func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
return wsResults, nil
}
-func (p *Pusher) offlinePushMsg(ctx context.Context, conversationID string, msg *sdkws.MsgData, offlinePushUserIDs []string) error {
+func (p *Pusher) offlinePushMsg(
+ ctx context.Context,
+ conversationID string,
+ msg *sdkws.MsgData,
+ offlinePushUserIDs []string,
+) error {
title, content, opts, err := p.getOfflinePushInfos(conversationID, msg)
if err != nil {
return err
@@ -290,7 +362,10 @@ func (p *Pusher) GetOfflinePushOpts(msg *sdkws.MsgData) (opts *offlinepush.Opts,
return opts, nil
}
-func (p *Pusher) getOfflinePushInfos(conversationID string, msg *sdkws.MsgData) (title, content string, opts *offlinepush.Opts, err error) {
+func (p *Pusher) getOfflinePushInfos(
+ conversationID string,
+ msg *sdkws.MsgData,
+) (title, content string, opts *offlinepush.Opts, err error) {
if p.offlinePusher == nil {
err = errNoOfflinePusher
return
diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go
index 1f45d0224..4af5dd8b4 100644
--- a/internal/rpc/conversation/conversaion.go
+++ b/internal/rpc/conversation/conversaion.go
@@ -3,6 +3,8 @@ package conversation
import (
"context"
+ "google.golang.org/grpc"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
@@ -17,7 +19,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "google.golang.org/grpc"
)
type conversationServer struct {
@@ -44,12 +45,19 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
pbConversation.RegisterConversationServer(server, &conversationServer{
conversationNotificationSender: notification.NewConversationNotificationSender(&msgRpcClient),
groupRpcClient: &groupRpcClient,
- conversationDatabase: controller.NewConversationDatabase(conversationDB, cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB), tx.NewGorm(db)),
+ conversationDatabase: controller.NewConversationDatabase(
+ conversationDB,
+ cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB),
+ tx.NewGorm(db),
+ ),
})
return nil
}
-func (c *conversationServer) GetConversation(ctx context.Context, req *pbConversation.GetConversationReq) (*pbConversation.GetConversationResp, error) {
+func (c *conversationServer) GetConversation(
+ ctx context.Context,
+ req *pbConversation.GetConversationReq,
+) (*pbConversation.GetConversationResp, error) {
conversations, err := c.conversationDatabase.FindConversations(ctx, req.OwnerUserID, []string{req.ConversationID})
if err != nil {
return nil, err
@@ -62,7 +70,10 @@ func (c *conversationServer) GetConversation(ctx context.Context, req *pbConvers
return resp, nil
}
-func (c *conversationServer) GetAllConversations(ctx context.Context, req *pbConversation.GetAllConversationsReq) (*pbConversation.GetAllConversationsResp, error) {
+func (c *conversationServer) GetAllConversations(
+ ctx context.Context,
+ req *pbConversation.GetAllConversationsReq,
+) (*pbConversation.GetAllConversationsResp, error) {
conversations, err := c.conversationDatabase.GetUserAllConversation(ctx, req.OwnerUserID)
if err != nil {
return nil, err
@@ -72,7 +83,10 @@ func (c *conversationServer) GetAllConversations(ctx context.Context, req *pbCon
return resp, nil
}
-func (c *conversationServer) GetConversations(ctx context.Context, req *pbConversation.GetConversationsReq) (*pbConversation.GetConversationsResp, error) {
+func (c *conversationServer) GetConversations(
+ ctx context.Context,
+ req *pbConversation.GetConversationsReq,
+) (*pbConversation.GetConversationsResp, error) {
conversations, err := c.conversationDatabase.FindConversations(ctx, req.OwnerUserID, req.ConversationIDs)
if err != nil {
return nil, err
@@ -82,12 +96,19 @@ func (c *conversationServer) GetConversations(ctx context.Context, req *pbConver
return resp, nil
}
-func (c *conversationServer) SetConversation(ctx context.Context, req *pbConversation.SetConversationReq) (*pbConversation.SetConversationResp, error) {
+func (c *conversationServer) SetConversation(
+ ctx context.Context,
+ req *pbConversation.SetConversationReq,
+) (*pbConversation.SetConversationResp, error) {
var conversation tableRelation.ConversationModel
if err := utils.CopyStructFields(&conversation, req.Conversation); err != nil {
return nil, err
}
- err := c.conversationDatabase.SetUserConversations(ctx, req.Conversation.OwnerUserID, []*tableRelation.ConversationModel{&conversation})
+ err := c.conversationDatabase.SetUserConversations(
+ ctx,
+ req.Conversation.OwnerUserID,
+ []*tableRelation.ConversationModel{&conversation},
+ )
if err != nil {
return nil, err
}
@@ -96,7 +117,10 @@ func (c *conversationServer) SetConversation(ctx context.Context, req *pbConvers
return resp, nil
}
-func (c *conversationServer) SetConversations(ctx context.Context, req *pbConversation.SetConversationsReq) (*pbConversation.SetConversationsResp, error) {
+func (c *conversationServer) SetConversations(
+ ctx context.Context,
+ req *pbConversation.SetConversationsReq,
+) (*pbConversation.SetConversationsResp, error) {
if req.Conversation == nil {
return nil, errs.ErrArgs.Wrap("conversation must not be nil")
}
@@ -154,7 +178,12 @@ func (c *conversationServer) SetConversations(ctx context.Context, req *pbConver
return nil, err
}
for _, userID := range req.UserIDs {
- c.conversationNotificationSender.ConversationSetPrivateNotification(ctx, userID, req.Conversation.UserID, req.Conversation.IsPrivateChat.Value)
+ c.conversationNotificationSender.ConversationSetPrivateNotification(
+ ctx,
+ userID,
+ req.Conversation.UserID,
+ req.Conversation.IsPrivateChat.Value,
+ )
}
}
if req.Conversation.BurnDuration != nil {
@@ -171,7 +200,10 @@ func (c *conversationServer) SetConversations(ctx context.Context, req *pbConver
}
// 获取超级大群开启免打扰的用户ID
-func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req *pbConversation.GetRecvMsgNotNotifyUserIDsReq) (*pbConversation.GetRecvMsgNotNotifyUserIDsResp, error) {
+func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(
+ ctx context.Context,
+ req *pbConversation.GetRecvMsgNotNotifyUserIDsReq,
+) (*pbConversation.GetRecvMsgNotNotifyUserIDsResp, error) {
userIDs, err := c.conversationDatabase.FindRecvMsgNotNotifyUserIDs(ctx, req.GroupID)
if err != nil {
return nil, err
@@ -180,7 +212,10 @@ func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req
}
// create conversation without notification for msg redis transfer
-func (c *conversationServer) CreateSingleChatConversations(ctx context.Context, req *pbConversation.CreateSingleChatConversationsReq) (*pbConversation.CreateSingleChatConversationsResp, error) {
+func (c *conversationServer) CreateSingleChatConversations(
+ ctx context.Context,
+ req *pbConversation.CreateSingleChatConversationsReq,
+) (*pbConversation.CreateSingleChatConversationsResp, error) {
var conversation tableRelation.ConversationModel
conversation.ConversationID = utils.GetConversationIDBySessionType(constant.SingleChatType, req.RecvID, req.SendID)
conversation.ConversationType = constant.SingleChatType
@@ -201,7 +236,10 @@ func (c *conversationServer) CreateSingleChatConversations(ctx context.Context,
return &pbConversation.CreateSingleChatConversationsResp{}, nil
}
-func (c *conversationServer) CreateGroupChatConversations(ctx context.Context, req *pbConversation.CreateGroupChatConversationsReq) (*pbConversation.CreateGroupChatConversationsResp, error) {
+func (c *conversationServer) CreateGroupChatConversations(
+ ctx context.Context,
+ req *pbConversation.CreateGroupChatConversationsReq,
+) (*pbConversation.CreateGroupChatConversationsResp, error) {
err := c.conversationDatabase.CreateGroupChatConversation(ctx, req.GroupID, req.UserIDs)
if err != nil {
return nil, err
@@ -209,7 +247,10 @@ func (c *conversationServer) CreateGroupChatConversations(ctx context.Context, r
return &pbConversation.CreateGroupChatConversationsResp{}, nil
}
-func (c *conversationServer) SetConversationMaxSeq(ctx context.Context, req *pbConversation.SetConversationMaxSeqReq) (*pbConversation.SetConversationMaxSeqResp, error) {
+func (c *conversationServer) SetConversationMaxSeq(
+ ctx context.Context,
+ req *pbConversation.SetConversationMaxSeqReq,
+) (*pbConversation.SetConversationMaxSeqResp, error) {
if err := c.conversationDatabase.UpdateUsersConversationFiled(ctx, req.OwnerUserID, req.ConversationID,
map[string]interface{}{"max_seq": req.MaxSeq}); err != nil {
return nil, err
@@ -217,7 +258,10 @@ func (c *conversationServer) SetConversationMaxSeq(ctx context.Context, req *pbC
return &pbConversation.SetConversationMaxSeqResp{}, nil
}
-func (c *conversationServer) GetConversationIDs(ctx context.Context, req *pbConversation.GetConversationIDsReq) (*pbConversation.GetConversationIDsResp, error) {
+func (c *conversationServer) GetConversationIDs(
+ ctx context.Context,
+ req *pbConversation.GetConversationIDsReq,
+) (*pbConversation.GetConversationIDsResp, error) {
conversationIDs, err := c.conversationDatabase.GetConversationIDs(ctx, req.UserID)
if err != nil {
return nil, err
@@ -225,7 +269,10 @@ func (c *conversationServer) GetConversationIDs(ctx context.Context, req *pbConv
return &pbConversation.GetConversationIDsResp{ConversationIDs: conversationIDs}, nil
}
-func (c *conversationServer) GetUserConversationIDsHash(ctx context.Context, req *pbConversation.GetUserConversationIDsHashReq) (*pbConversation.GetUserConversationIDsHashResp, error) {
+func (c *conversationServer) GetUserConversationIDsHash(
+ ctx context.Context,
+ req *pbConversation.GetUserConversationIDsHashReq,
+) (*pbConversation.GetUserConversationIDsHashResp, error) {
hash, err := c.conversationDatabase.GetUserConversationIDsHash(ctx, req.OwnerUserID)
if err != nil {
return nil, err
@@ -233,10 +280,15 @@ func (c *conversationServer) GetUserConversationIDsHash(ctx context.Context, req
return &pbConversation.GetUserConversationIDsHashResp{Hash: hash}, nil
}
-func (c *conversationServer) GetConversationsByConversationID(ctx context.Context, req *pbConversation.GetConversationsByConversationIDReq) (*pbConversation.GetConversationsByConversationIDResp, error) {
+func (c *conversationServer) GetConversationsByConversationID(
+ ctx context.Context,
+ req *pbConversation.GetConversationsByConversationIDReq,
+) (*pbConversation.GetConversationsByConversationIDResp, error) {
conversations, err := c.conversationDatabase.GetConversationsByConversationID(ctx, req.ConversationIDs)
if err != nil {
return nil, err
}
- return &pbConversation.GetConversationsByConversationIDResp{Conversations: convert.ConversationsDB2Pb(conversations)}, nil
+ return &pbConversation.GetConversationsByConversationIDResp{
+ Conversations: convert.ConversationsDB2Pb(conversations),
+ }, nil
}
diff --git a/internal/rpc/group/db_map.go b/internal/rpc/group/db_map.go
index 84c0e74a4..7940635bd 100644
--- a/internal/rpc/group/db_map.go
+++ b/internal/rpc/group/db_map.go
@@ -16,9 +16,10 @@ package group
import (
"context"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
"time"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
+
pbGroup "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
)
diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go
index ec5d0bdb5..acafc130a 100644
--- a/internal/rpc/group/group.go
+++ b/internal/rpc/group/group.go
@@ -3,20 +3,23 @@ package group
import (
"context"
"fmt"
- pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
"math/big"
"math/rand"
"strconv"
"strings"
"time"
+ pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw/specialerror"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
+ "google.golang.org/grpc"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
@@ -31,7 +34,6 @@ import (
pbGroup "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "google.golang.org/grpc"
)
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
@@ -57,13 +59,18 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
pbGroup.RegisterGroupServer(server, &groupServer{
GroupDatabase: database,
User: userRpcClient,
- Notification: notification.NewGroupNotificationSender(database, &msgRpcClient, &userRpcClient, func(ctx context.Context, userIDs []string) ([]notification.CommonUser, error) {
- users, err := userRpcClient.GetUsersInfo(ctx, userIDs)
- if err != nil {
- return nil, err
- }
- return utils.Slice(users, func(e *sdkws.UserInfo) notification.CommonUser { return e }), nil
- }),
+ Notification: notification.NewGroupNotificationSender(
+ database,
+ &msgRpcClient,
+ &userRpcClient,
+ func(ctx context.Context, userIDs []string) ([]notification.CommonUser, error) {
+ users, err := userRpcClient.GetUsersInfo(ctx, userIDs)
+ if err != nil {
+ return nil, err
+ }
+ return utils.Slice(users, func(e *sdkws.UserInfo) notification.CommonUser { return e }), nil
+ },
+ ),
conversationRpcClient: conversationRpcClient,
msgRpcClient: msgRpcClient,
})
@@ -120,7 +127,16 @@ func (s *groupServer) GenGroupID(ctx context.Context, groupID *string) error {
}
}
for i := 0; i < 10; i++ {
- id := utils.Md5(strings.Join([]string{mcontext.GetOperationID(ctx), strconv.FormatInt(time.Now().UnixNano(), 10), strconv.Itoa(rand.Int())}, ",;,"))
+ id := utils.Md5(
+ strings.Join(
+ []string{
+ mcontext.GetOperationID(ctx),
+ strconv.FormatInt(time.Now().UnixNano(), 10),
+ strconv.Itoa(rand.Int()),
+ },
+ ",;,",
+ ),
+ )
bi := big.NewInt(0)
bi.SetString(id[0:8], 16)
id = bi.String()
@@ -234,7 +250,10 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
return resp, nil
}
-func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) {
+func (s *groupServer) GetJoinedGroupList(
+ ctx context.Context,
+ req *pbGroup.GetJoinedGroupListReq,
+) (*pbGroup.GetJoinedGroupListResp, error) {
resp := &pbGroup.GetJoinedGroupListResp{}
if err := tokenverify.CheckAccessV3(ctx, req.FromUserID); err != nil {
return nil, err
@@ -244,7 +263,8 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
pageNumber = req.Pagination.PageNumber
showNumber = req.Pagination.ShowNumber
}
- //total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber, showNumber)
+ // total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber,
+ // showNumber)
total, members, err := s.GroupDatabase.PageGetJoinGroup(ctx, req.FromUserID, pageNumber, showNumber)
if err != nil {
return nil, err
@@ -283,7 +303,10 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
return resp, nil
}
-func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
+func (s *groupServer) InviteUserToGroup(
+ ctx context.Context,
+ req *pbGroup.InviteUserToGroupReq,
+) (*pbGroup.InviteUserToGroupResp, error) {
resp := &pbGroup.InviteUserToGroupResp{}
if len(req.InvitedUserIDs) == 0 {
return nil, errs.ErrArgs.Wrap("user empty")
@@ -384,7 +407,10 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
return resp, nil
}
-func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
+func (s *groupServer) GetGroupAllMember(
+ ctx context.Context,
+ req *pbGroup.GetGroupAllMemberReq,
+) (*pbGroup.GetGroupAllMemberResp, error) {
resp := &pbGroup.GetGroupAllMemberResp{}
group, err := s.GroupDatabase.TakeGroup(ctx, req.GroupID)
if err != nil {
@@ -412,7 +438,10 @@ func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGro
return resp, nil
}
-func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGroupMemberListReq) (*pbGroup.GetGroupMemberListResp, error) {
+func (s *groupServer) GetGroupMemberList(
+ ctx context.Context,
+ req *pbGroup.GetGroupMemberListReq,
+) (*pbGroup.GetGroupMemberListResp, error) {
resp := &pbGroup.GetGroupMemberListResp{}
total, members, err := s.PageGetGroupMember(ctx, req.GroupID, req.Pagination.PageNumber, req.Pagination.ShowNumber)
log.ZDebug(ctx, "GetGroupMemberList", "total", total, "members", members, "length", len(members))
@@ -425,7 +454,10 @@ func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGr
return resp, nil
}
-func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) {
+func (s *groupServer) KickGroupMember(
+ ctx context.Context,
+ req *pbGroup.KickGroupMemberReq,
+) (*pbGroup.KickGroupMemberResp, error) {
resp := &pbGroup.KickGroupMemberResp{}
group, err := s.GroupDatabase.TakeGroup(ctx, req.GroupID)
if err != nil {
@@ -533,7 +565,10 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
return resp, nil
}
-func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetGroupMembersInfoReq) (*pbGroup.GetGroupMembersInfoResp, error) {
+func (s *groupServer) GetGroupMembersInfo(
+ ctx context.Context,
+ req *pbGroup.GetGroupMembersInfoReq,
+) (*pbGroup.GetGroupMembersInfoResp, error) {
resp := &pbGroup.GetGroupMembersInfoResp{}
if len(req.UserIDs) == 0 {
return nil, errs.ErrArgs.Wrap("userIDs empty")
@@ -560,7 +595,10 @@ func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetG
return resp, nil
}
-func (s *groupServer) GetGroupApplicationList(ctx context.Context, req *pbGroup.GetGroupApplicationListReq) (*pbGroup.GetGroupApplicationListResp, error) {
+func (s *groupServer) GetGroupApplicationList(
+ ctx context.Context,
+ req *pbGroup.GetGroupApplicationListReq,
+) (*pbGroup.GetGroupApplicationListResp, error) {
pageNumber, showNumber := utils.GetPage(req.Pagination)
groupIDs, err := s.GroupDatabase.FindUserManagedGroupID(ctx, req.FromUserID)
@@ -611,12 +649,19 @@ func (s *groupServer) GetGroupApplicationList(ctx context.Context, req *pbGroup.
return e.GroupID
})
resp.GroupRequests = utils.Slice(groupRequests, func(e *relationTb.GroupRequestModel) *sdkws.GroupRequest {
- return convert.Db2PbGroupRequest(e, userMap[e.UserID], convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, groupMemberNumMap[e.GroupID]))
+ return convert.Db2PbGroupRequest(
+ e,
+ userMap[e.UserID],
+ convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, groupMemberNumMap[e.GroupID]),
+ )
})
return resp, nil
}
-func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) {
+func (s *groupServer) GetGroupsInfo(
+ ctx context.Context,
+ req *pbGroup.GetGroupsInfoReq,
+) (*pbGroup.GetGroupsInfoResp, error) {
resp := &pbGroup.GetGroupsInfoResp{}
if len(req.GroupIDs) == 0 {
return nil, errs.ErrArgs.Wrap("groupID is empty")
@@ -646,7 +691,10 @@ func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsI
return resp, nil
}
-func (s *groupServer) GroupApplicationResponse(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (*pbGroup.GroupApplicationResponseResp, error) {
+func (s *groupServer) GroupApplicationResponse(
+ ctx context.Context,
+ req *pbGroup.GroupApplicationResponseReq,
+) (*pbGroup.GroupApplicationResponseResp, error) {
defer log.ZInfo(ctx, utils.GetFuncName()+" Return")
if !utils.Contain(req.HandleResult, constant.GroupResponseAgree, constant.GroupResponseRefuse) {
return nil, errs.ErrArgs.Wrap("HandleResult unknown")
@@ -718,7 +766,10 @@ func (s *groupServer) GroupApplicationResponse(ctx context.Context, req *pbGroup
return &pbGroup.GroupApplicationResponseResp{}, nil
}
-func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (resp *pbGroup.JoinGroupResp, err error) {
+func (s *groupServer) JoinGroup(
+ ctx context.Context,
+ req *pbGroup.JoinGroupReq,
+) (resp *pbGroup.JoinGroupResp, err error) {
defer log.ZInfo(ctx, "JoinGroup.Return")
user, err := s.User.GetUserInfo(ctx, req.InviterUserID)
if err != nil {
@@ -818,7 +869,10 @@ func (s *groupServer) deleteMemberAndSetConversationSeq(ctx context.Context, gro
return s.conversationRpcClient.SetConversationMaxSeq(ctx, userIDs, conevrsationID, maxSeq)
}
-func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.SetGroupInfoResp, error) {
+func (s *groupServer) SetGroupInfo(
+ ctx context.Context,
+ req *pbGroup.SetGroupInfoReq,
+) (*pbGroup.SetGroupInfoResp, error) {
var opMember *relationTb.GroupMemberModel
if !tokenverify.IsAppManagerUid(ctx) {
var err error
@@ -870,11 +924,17 @@ func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInf
go func() {
nctx := mcontext.NewCtx("@@@" + mcontext.GetOperationID(ctx))
conversation := &pbConversation.ConversationReq{
- ConversationID: utils.GetConversationIDBySessionType(constant.SuperGroupChatType, req.GroupInfoForSet.GroupID),
+ ConversationID: utils.GetConversationIDBySessionType(
+ constant.SuperGroupChatType,
+ req.GroupInfoForSet.GroupID,
+ ),
ConversationType: constant.SuperGroupChatType,
GroupID: req.GroupInfoForSet.GroupID,
}
- resp, err := s.GetGroupMemberUserIDs(nctx, &pbGroup.GetGroupMemberUserIDsReq{GroupID: req.GroupInfoForSet.GroupID})
+ resp, err := s.GetGroupMemberUserIDs(
+ nctx,
+ &pbGroup.GetGroupMemberUserIDsReq{GroupID: req.GroupInfoForSet.GroupID},
+ )
if err != nil {
log.ZWarn(ctx, "GetGroupMemberIDs", err)
return
@@ -885,7 +945,10 @@ func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInf
}
}()
num++
- s.Notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser})
+ s.Notification.GroupInfoSetAnnouncementNotification(
+ ctx,
+ &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser},
+ )
}
switch len(data) - num {
@@ -902,7 +965,10 @@ func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInf
return resp, nil
}
-func (s *groupServer) TransferGroupOwner(ctx context.Context, req *pbGroup.TransferGroupOwnerReq) (*pbGroup.TransferGroupOwnerResp, error) {
+func (s *groupServer) TransferGroupOwner(
+ ctx context.Context,
+ req *pbGroup.TransferGroupOwnerReq,
+) (*pbGroup.TransferGroupOwnerResp, error) {
resp := &pbGroup.TransferGroupOwnerResp{}
group, err := s.GroupDatabase.TakeGroup(ctx, req.GroupID)
if err != nil {
@@ -981,9 +1047,20 @@ func (s *groupServer) GetGroups(ctx context.Context, req *pbGroup.GetGroupsReq)
return resp, nil
}
-func (s *groupServer) GetGroupMembersCMS(ctx context.Context, req *pbGroup.GetGroupMembersCMSReq) (*pbGroup.GetGroupMembersCMSResp, error) {
+func (s *groupServer) GetGroupMembersCMS(
+ ctx context.Context,
+ req *pbGroup.GetGroupMembersCMSReq,
+) (*pbGroup.GetGroupMembersCMSResp, error) {
resp := &pbGroup.GetGroupMembersCMSResp{}
- total, members, err := s.GroupDatabase.SearchGroupMember(ctx, req.UserName, []string{req.GroupID}, nil, nil, req.Pagination.PageNumber, req.Pagination.ShowNumber)
+ total, members, err := s.GroupDatabase.SearchGroupMember(
+ ctx,
+ req.UserName,
+ []string{req.GroupID},
+ nil,
+ nil,
+ req.Pagination.PageNumber,
+ req.Pagination.ShowNumber,
+ )
if err != nil {
return nil, err
}
@@ -1003,7 +1080,10 @@ func (s *groupServer) GetGroupMembersCMS(ctx context.Context, req *pbGroup.GetGr
return resp, nil
}
-func (s *groupServer) GetUserReqApplicationList(ctx context.Context, req *pbGroup.GetUserReqApplicationListReq) (*pbGroup.GetUserReqApplicationListResp, error) {
+func (s *groupServer) GetUserReqApplicationList(
+ ctx context.Context,
+ req *pbGroup.GetUserReqApplicationListReq,
+) (*pbGroup.GetUserReqApplicationListResp, error) {
resp := &pbGroup.GetUserReqApplicationListResp{}
user, err := s.User.GetPublicUserInfo(ctx, req.UserID)
if err != nil {
@@ -1050,12 +1130,19 @@ func (s *groupServer) GetUserReqApplicationList(ctx context.Context, req *pbGrou
return nil, err
}
resp.GroupRequests = utils.Slice(requests, func(e *relationTb.GroupRequestModel) *sdkws.GroupRequest {
- return convert.Db2PbGroupRequest(e, user, convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, uint32(groupMemberNum[e.GroupID])))
+ return convert.Db2PbGroupRequest(
+ e,
+ user,
+ convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, uint32(groupMemberNum[e.GroupID])),
+ )
})
return resp, nil
}
-func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGroupReq) (*pbGroup.DismissGroupResp, error) {
+func (s *groupServer) DismissGroup(
+ ctx context.Context,
+ req *pbGroup.DismissGroupReq,
+) (*pbGroup.DismissGroupResp, error) {
defer log.ZInfo(ctx, "DismissGroup.return")
resp := &pbGroup.DismissGroupResp{}
owner, err := s.TakeGroupOwner(ctx, req.GroupID)
@@ -1104,7 +1191,10 @@ func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGrou
return resp, nil
}
-func (s *groupServer) MuteGroupMember(ctx context.Context, req *pbGroup.MuteGroupMemberReq) (*pbGroup.MuteGroupMemberResp, error) {
+func (s *groupServer) MuteGroupMember(
+ ctx context.Context,
+ req *pbGroup.MuteGroupMemberReq,
+) (*pbGroup.MuteGroupMemberResp, error) {
resp := &pbGroup.MuteGroupMemberResp{}
//if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil {
// return nil, err
@@ -1139,7 +1229,10 @@ func (s *groupServer) MuteGroupMember(ctx context.Context, req *pbGroup.MuteGrou
return resp, nil
}
-func (s *groupServer) CancelMuteGroupMember(ctx context.Context, req *pbGroup.CancelMuteGroupMemberReq) (*pbGroup.CancelMuteGroupMemberResp, error) {
+func (s *groupServer) CancelMuteGroupMember(
+ ctx context.Context,
+ req *pbGroup.CancelMuteGroupMemberReq,
+) (*pbGroup.CancelMuteGroupMemberResp, error) {
resp := &pbGroup.CancelMuteGroupMemberResp{}
//member, err := s.GroupDatabase.TakeGroupMember(ctx, req.GroupID, req.UserID)
//if err != nil {
@@ -1151,7 +1244,8 @@ func (s *groupServer) CancelMuteGroupMember(ctx context.Context, req *pbGroup.Ca
// return nil, err
// }
// if opMember.RoleLevel <= member.RoleLevel {
- // return nil, errs.ErrNoPermission.Wrap(fmt.Sprintf("self RoleLevel %d target %d", opMember.RoleLevel, member.RoleLevel))
+ // return nil, errs.ErrNoPermission.Wrap(fmt.Sprintf("self RoleLevel %d target %d", opMember.RoleLevel,
+ // member.RoleLevel))
// }
//}
//if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil {
@@ -1199,7 +1293,10 @@ func (s *groupServer) MuteGroup(ctx context.Context, req *pbGroup.MuteGroupReq)
return resp, nil
}
-func (s *groupServer) CancelMuteGroup(ctx context.Context, req *pbGroup.CancelMuteGroupReq) (*pbGroup.CancelMuteGroupResp, error) {
+func (s *groupServer) CancelMuteGroup(
+ ctx context.Context,
+ req *pbGroup.CancelMuteGroupReq,
+) (*pbGroup.CancelMuteGroupResp, error) {
resp := &pbGroup.CancelMuteGroupResp{}
if err := s.CheckGroupAdmin(ctx, req.GroupID); err != nil {
return nil, err
@@ -1211,7 +1308,10 @@ func (s *groupServer) CancelMuteGroup(ctx context.Context, req *pbGroup.CancelMu
return resp, nil
}
-func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbGroup.SetGroupMemberInfoReq) (*pbGroup.SetGroupMemberInfoResp, error) {
+func (s *groupServer) SetGroupMemberInfo(
+ ctx context.Context,
+ req *pbGroup.SetGroupMemberInfoReq,
+) (*pbGroup.SetGroupMemberInfoResp, error) {
resp := &pbGroup.SetGroupMemberInfoResp{}
if len(req.Members) == 0 {
return nil, errs.ErrArgs.Wrap("members empty")
@@ -1238,9 +1338,11 @@ func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbGroup.SetGr
delete(duplicateMap, [...]string{member.GroupID, member.UserID})
}
if len(duplicateMap) > 0 {
- return nil, errs.ErrArgs.Wrap("user not found" + strings.Join(utils.Slice(utils.Keys(duplicateMap), func(e [2]string) string {
- return fmt.Sprintf("[group: %s user: %s]", e[0], e[1])
- }), ","))
+ return nil, errs.ErrArgs.Wrap(
+ "user not found" + strings.Join(utils.Slice(utils.Keys(duplicateMap), func(e [2]string) string {
+ return fmt.Sprintf("[group: %s user: %s]", e[0], e[1])
+ }), ","),
+ )
}
memberMap := utils.SliceToMap(members, func(e *relationTb.GroupMemberModel) [2]string {
return [...]string{e.GroupID, e.UserID}
@@ -1270,7 +1372,9 @@ func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbGroup.SetGr
}
dbMember, ok := memberMap[[...]string{member.GroupID, member.UserID}]
if !ok {
- return nil, errs.ErrRecordNotFound.Wrap(fmt.Sprintf("user %s not in group %s", member.UserID, member.GroupID))
+ return nil, errs.ErrRecordNotFound.Wrap(
+ fmt.Sprintf("user %s not in group %s", member.UserID, member.GroupID),
+ )
}
//if opMember.RoleLevel == constant.GroupOwner {
// continue
@@ -1332,14 +1436,25 @@ func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbGroup.SetGr
if member.Nickname != nil || member.FaceURL != nil || member.Ex != nil {
log.ZDebug(ctx, "setGroupMemberInfo notification", "member", member.UserID)
if err := s.Notification.GroupMemberInfoSetNotification(ctx, member.GroupID, member.UserID); err != nil {
- log.ZError(ctx, "setGroupMemberInfo notification failed", err, "member", member.UserID, "groupID", member.GroupID)
+ log.ZError(
+ ctx,
+ "setGroupMemberInfo notification failed",
+ err,
+ "member",
+ member.UserID,
+ "groupID",
+ member.GroupID,
+ )
}
}
}
return resp, nil
}
-func (s *groupServer) GetGroupAbstractInfo(ctx context.Context, req *pbGroup.GetGroupAbstractInfoReq) (*pbGroup.GetGroupAbstractInfoResp, error) {
+func (s *groupServer) GetGroupAbstractInfo(
+ ctx context.Context,
+ req *pbGroup.GetGroupAbstractInfoReq,
+) (*pbGroup.GetGroupAbstractInfoResp, error) {
resp := &pbGroup.GetGroupAbstractInfoResp{}
if len(req.GroupIDs) == 0 {
return nil, errs.ErrArgs.Wrap("groupIDs empty")
@@ -1370,7 +1485,10 @@ func (s *groupServer) GetGroupAbstractInfo(ctx context.Context, req *pbGroup.Get
return resp, nil
}
-func (s *groupServer) GetUserInGroupMembers(ctx context.Context, req *pbGroup.GetUserInGroupMembersReq) (*pbGroup.GetUserInGroupMembersResp, error) {
+func (s *groupServer) GetUserInGroupMembers(
+ ctx context.Context,
+ req *pbGroup.GetUserInGroupMembersReq,
+) (*pbGroup.GetUserInGroupMembersResp, error) {
resp := &pbGroup.GetUserInGroupMembersResp{}
if len(req.GroupIDs) == 0 {
return nil, errs.ErrArgs.Wrap("groupIDs empty")
@@ -1394,7 +1512,10 @@ func (s *groupServer) GetUserInGroupMembers(ctx context.Context, req *pbGroup.Ge
return resp, nil
}
-func (s *groupServer) GetGroupMemberUserIDs(ctx context.Context, req *pbGroup.GetGroupMemberUserIDsReq) (resp *pbGroup.GetGroupMemberUserIDsResp, err error) {
+func (s *groupServer) GetGroupMemberUserIDs(
+ ctx context.Context,
+ req *pbGroup.GetGroupMemberUserIDsReq,
+) (resp *pbGroup.GetGroupMemberUserIDsResp, err error) {
resp = &pbGroup.GetGroupMemberUserIDsResp{}
resp.UserIDs, err = s.GroupDatabase.FindGroupMemberUserID(ctx, req.GroupID)
if err != nil {
@@ -1403,7 +1524,10 @@ func (s *groupServer) GetGroupMemberUserIDs(ctx context.Context, req *pbGroup.Ge
return resp, nil
}
-func (s *groupServer) GetGroupMemberRoleLevel(ctx context.Context, req *pbGroup.GetGroupMemberRoleLevelReq) (*pbGroup.GetGroupMemberRoleLevelResp, error) {
+func (s *groupServer) GetGroupMemberRoleLevel(
+ ctx context.Context,
+ req *pbGroup.GetGroupMemberRoleLevelReq,
+) (*pbGroup.GetGroupMemberRoleLevelResp, error) {
resp := &pbGroup.GetGroupMemberRoleLevelResp{}
if len(req.RoleLevels) == 0 {
return nil, errs.ErrArgs.Wrap("RoleLevels empty")
diff --git a/internal/rpc/group/statistics.go b/internal/rpc/group/statistics.go
index c6664b4df..45d47b932 100644
--- a/internal/rpc/group/statistics.go
+++ b/internal/rpc/group/statistics.go
@@ -2,12 +2,16 @@ package group
import (
"context"
+ "time"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
- "time"
)
-func (s *groupServer) GroupCreateCount(ctx context.Context, req *group.GroupCreateCountReq) (*group.GroupCreateCountResp, error) {
+func (s *groupServer) GroupCreateCount(
+ ctx context.Context,
+ req *group.GroupCreateCountReq,
+) (*group.GroupCreateCountResp, error) {
if req.Start > req.End {
return nil, errs.ErrArgs.Wrap("start > end")
}
diff --git a/internal/rpc/msg/server.go b/internal/rpc/msg/server.go
index 909707703..15fc696d8 100644
--- a/internal/rpc/msg/server.go
+++ b/internal/rpc/msg/server.go
@@ -3,6 +3,8 @@ package msg
import (
"context"
+ "google.golang.org/grpc"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
@@ -13,7 +15,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
- "google.golang.org/grpc"
)
type MessageInterceptorChain []MessageInterceptorFunc
@@ -100,7 +101,8 @@ func (m *msgServer) initPrometheus() {
}
func (m *msgServer) conversationAndGetRecvID(conversation *conversation.Conversation, userID string) (recvID string) {
- if conversation.ConversationType == constant.SingleChatType || conversation.ConversationType == constant.NotificationChatType {
+ if conversation.ConversationType == constant.SingleChatType ||
+ conversation.ConversationType == constant.NotificationChatType {
if userID == conversation.OwnerUserID {
recvID = conversation.UserID
} else {
diff --git a/internal/rpc/msg/statistics.go b/internal/rpc/msg/statistics.go
index 872ec8f18..cfcbd7c82 100644
--- a/internal/rpc/msg/statistics.go
+++ b/internal/rpc/msg/statistics.go
@@ -2,15 +2,24 @@ package msg
import (
"context"
+ "time"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "time"
)
func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq) (*msg.GetActiveUserResp, error) {
- msgCount, userCount, users, dateCount, err := m.MsgDatabase.RangeUserSendCount(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End), req.Group, req.Ase, req.Pagination.PageNumber, req.Pagination.ShowNumber)
+ msgCount, userCount, users, dateCount, err := m.MsgDatabase.RangeUserSendCount(
+ ctx,
+ time.UnixMilli(req.Start),
+ time.UnixMilli(req.End),
+ req.Group,
+ req.Ase,
+ req.Pagination.PageNumber,
+ req.Pagination.ShowNumber,
+ )
if err != nil {
return nil, err
}
@@ -45,7 +54,14 @@ func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq
}
func (m *msgServer) GetActiveGroup(ctx context.Context, req *msg.GetActiveGroupReq) (*msg.GetActiveGroupResp, error) {
- msgCount, groupCount, groups, dateCount, err := m.MsgDatabase.RangeGroupSendCount(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End), req.Ase, req.Pagination.PageNumber, req.Pagination.ShowNumber)
+ msgCount, groupCount, groups, dateCount, err := m.MsgDatabase.RangeGroupSendCount(
+ ctx,
+ time.UnixMilli(req.Start),
+ time.UnixMilli(req.End),
+ req.Ase,
+ req.Pagination.PageNumber,
+ req.Pagination.ShowNumber,
+ )
if err != nil {
return nil, err
}
diff --git a/internal/rpc/third/s3.go b/internal/rpc/third/s3.go
index 4cbbd3d7d..bd26a6e42 100644
--- a/internal/rpc/third/s3.go
+++ b/internal/rpc/third/s3.go
@@ -2,6 +2,8 @@ package third
import (
"context"
+ "time"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
@@ -9,7 +11,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "time"
)
func (t *thirdServer) PartLimit(ctx context.Context, req *third.PartLimitReq) (*third.PartLimitResp, error) {
@@ -29,7 +30,10 @@ func (t *thirdServer) PartSize(ctx context.Context, req *third.PartSizeReq) (*th
return &third.PartSizeResp{Size: size}, nil
}
-func (t *thirdServer) InitiateMultipartUpload(ctx context.Context, req *third.InitiateMultipartUploadReq) (*third.InitiateMultipartUploadResp, error) {
+func (t *thirdServer) InitiateMultipartUpload(
+ ctx context.Context,
+ req *third.InitiateMultipartUploadReq,
+) (*third.InitiateMultipartUploadResp, error) {
defer log.ZDebug(ctx, "return")
if err := checkUploadName(ctx, req.Name); err != nil {
return nil, err
@@ -108,7 +112,10 @@ func (t *thirdServer) AuthSign(ctx context.Context, req *third.AuthSignReq) (*th
return resp, nil
}
-func (t *thirdServer) CompleteMultipartUpload(ctx context.Context, req *third.CompleteMultipartUploadReq) (*third.CompleteMultipartUploadResp, error) {
+func (t *thirdServer) CompleteMultipartUpload(
+ ctx context.Context,
+ req *third.CompleteMultipartUploadReq,
+) (*third.CompleteMultipartUploadResp, error) {
defer log.ZDebug(ctx, "return")
if err := checkUploadName(ctx, req.Name); err != nil {
return nil, err
diff --git a/internal/rpc/third/third.go b/internal/rpc/third/third.go
index 7c487b1d2..02e5a1588 100644
--- a/internal/rpc/third/third.go
+++ b/internal/rpc/third/third.go
@@ -3,12 +3,15 @@ package third
import (
"context"
"fmt"
+ "net/url"
+ "time"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cos"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/minio"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/oss"
- "net/url"
- "time"
+
+ "google.golang.org/grpc"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
@@ -18,7 +21,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
- "google.golang.org/grpc"
)
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
@@ -77,7 +79,10 @@ type thirdServer struct {
defaultExpire time.Duration
}
-func (t *thirdServer) FcmUpdateToken(ctx context.Context, req *third.FcmUpdateTokenReq) (resp *third.FcmUpdateTokenResp, err error) {
+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 {
return nil, err
@@ -85,7 +90,10 @@ func (t *thirdServer) FcmUpdateToken(ctx context.Context, req *third.FcmUpdateTo
return &third.FcmUpdateTokenResp{}, nil
}
-func (t *thirdServer) SetAppBadge(ctx context.Context, req *third.SetAppBadgeReq) (resp *third.SetAppBadgeResp, err error) {
+func (t *thirdServer) SetAppBadge(
+ ctx context.Context,
+ req *third.SetAppBadgeReq,
+) (resp *third.SetAppBadgeResp, err error) {
err = t.thirdDatabase.SetAppBadge(ctx, req.UserID, int(req.AppUnreadCount))
if err != nil {
return nil, err
diff --git a/internal/rpc/third/tool.go b/internal/rpc/third/tool.go
index 84017ae1f..379731434 100644
--- a/internal/rpc/third/tool.go
+++ b/internal/rpc/third/tool.go
@@ -4,12 +4,13 @@ import (
"context"
"errors"
"fmt"
+ "strings"
+ "unicode/utf8"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
- "strings"
- "unicode/utf8"
)
func toPbMapArray(m map[string][]string) []*third.KeyValues {
diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go
index 0914e9d1d..cbf525d27 100644
--- a/internal/rpc/user/user.go
+++ b/internal/rpc/user/user.go
@@ -24,8 +24,9 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
"google.golang.org/grpc"
+
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
)
type userServer struct {
@@ -60,16 +61,22 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error {
friendRpcClient := rpcclient.NewFriendRpcClient(client)
msgRpcClient := rpcclient.NewMessageRpcClient(client)
u := &userServer{
- UserDatabase: database,
- RegisterCenter: client,
- friendRpcClient: &friendRpcClient,
- notificationSender: notification.NewFriendNotificationSender(&msgRpcClient, notification.WithDBFunc(database.FindWithError)),
+ UserDatabase: database,
+ RegisterCenter: client,
+ friendRpcClient: &friendRpcClient,
+ notificationSender: notification.NewFriendNotificationSender(
+ &msgRpcClient,
+ notification.WithDBFunc(database.FindWithError),
+ ),
}
pbuser.RegisterUserServer(server, u)
return u.UserDatabase.InitOnce(context.Background(), users)
}
-func (s *userServer) GetDesignateUsers(ctx context.Context, req *pbuser.GetDesignateUsersReq) (resp *pbuser.GetDesignateUsersResp, err error) {
+func (s *userServer) GetDesignateUsers(
+ ctx context.Context,
+ req *pbuser.GetDesignateUsersReq,
+) (resp *pbuser.GetDesignateUsersResp, err error) {
resp = &pbuser.GetDesignateUsersResp{}
users, err := s.FindWithError(ctx, req.UserIDs)
if err != nil {
@@ -82,7 +89,10 @@ func (s *userServer) GetDesignateUsers(ctx context.Context, req *pbuser.GetDesig
return resp, nil
}
-func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInfoReq) (resp *pbuser.UpdateUserInfoResp, err error) {
+func (s *userServer) UpdateUserInfo(
+ ctx context.Context,
+ req *pbuser.UpdateUserInfoReq,
+) (resp *pbuser.UpdateUserInfoResp, err error) {
resp = &pbuser.UpdateUserInfoResp{}
err = tokenverify.CheckAccessV3(ctx, req.UserInfo.UserID)
if err != nil {
@@ -107,7 +117,10 @@ func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserI
return resp, nil
}
-func (s *userServer) SetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.SetGlobalRecvMessageOptReq) (resp *pbuser.SetGlobalRecvMessageOptResp, err error) {
+func (s *userServer) SetGlobalRecvMessageOpt(
+ ctx context.Context,
+ req *pbuser.SetGlobalRecvMessageOptReq,
+) (resp *pbuser.SetGlobalRecvMessageOptResp, err error) {
resp = &pbuser.SetGlobalRecvMessageOptResp{}
if _, err := s.FindWithError(ctx, []string{req.UserID}); err != nil {
return nil, err
@@ -121,7 +134,10 @@ func (s *userServer) SetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.Se
return resp, nil
}
-func (s *userServer) AccountCheck(ctx context.Context, req *pbuser.AccountCheckReq) (resp *pbuser.AccountCheckResp, err error) {
+func (s *userServer) AccountCheck(
+ ctx context.Context,
+ req *pbuser.AccountCheckReq,
+) (resp *pbuser.AccountCheckResp, err error) {
resp = &pbuser.AccountCheckResp{}
if utils.Duplicate(req.CheckUserIDs) {
return nil, errs.ErrArgs.Wrap("userID repeated")
@@ -150,7 +166,10 @@ func (s *userServer) AccountCheck(ctx context.Context, req *pbuser.AccountCheckR
return resp, nil
}
-func (s *userServer) GetPaginationUsers(ctx context.Context, req *pbuser.GetPaginationUsersReq) (resp *pbuser.GetPaginationUsersResp, err error) {
+func (s *userServer) GetPaginationUsers(
+ ctx context.Context,
+ req *pbuser.GetPaginationUsersReq,
+) (resp *pbuser.GetPaginationUsersResp, err error) {
var pageNumber, showNumber int32
if req.Pagination != nil {
pageNumber = req.Pagination.PageNumber
@@ -163,7 +182,10 @@ func (s *userServer) GetPaginationUsers(ctx context.Context, req *pbuser.GetPagi
return &pbuser.GetPaginationUsersResp{Total: int32(total), Users: convert.UsersDB2Pb(users)}, err
}
-func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterReq) (resp *pbuser.UserRegisterResp, err error) {
+func (s *userServer) UserRegister(
+ ctx context.Context,
+ req *pbuser.UserRegisterReq,
+) (resp *pbuser.UserRegisterResp, err error) {
resp = &pbuser.UserRegisterResp{}
if len(req.Users) == 0 {
return nil, errs.ErrArgs.Wrap("users is empty")
@@ -211,7 +233,10 @@ func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterR
return resp, nil
}
-func (s *userServer) GetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.GetGlobalRecvMessageOptReq) (resp *pbuser.GetGlobalRecvMessageOptResp, err error) {
+func (s *userServer) GetGlobalRecvMessageOpt(
+ ctx context.Context,
+ req *pbuser.GetGlobalRecvMessageOptReq,
+) (resp *pbuser.GetGlobalRecvMessageOptResp, err error) {
user, err := s.FindWithError(ctx, []string{req.UserID})
if err != nil {
return nil, err
@@ -219,7 +244,10 @@ func (s *userServer) GetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.Ge
return &pbuser.GetGlobalRecvMessageOptResp{GlobalRecvMsgOpt: user[0].GlobalRecvMsgOpt}, nil
}
-func (s *userServer) GetAllUserID(ctx context.Context, req *pbuser.GetAllUserIDReq) (resp *pbuser.GetAllUserIDResp, err error) {
+func (s *userServer) GetAllUserID(
+ ctx context.Context,
+ req *pbuser.GetAllUserIDReq,
+) (resp *pbuser.GetAllUserIDResp, err error) {
userIDs, err := s.UserDatabase.GetAllUserID(ctx)
if err != nil {
return nil, err
diff --git a/internal/tools/conversation.go b/internal/tools/conversation.go
index 1cad58248..1fcab854e 100644
--- a/internal/tools/conversation.go
+++ b/internal/tools/conversation.go
@@ -19,19 +19,60 @@ func (c *MsgTool) ConversationsDestructMsgs() {
}
log.ZDebug(context.Background(), "nums conversations need destruct", "nums", len(conversations))
for _, conversation := range conversations {
- log.ZDebug(ctx, "UserMsgsDestruct", "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID, "msgDestructTime", conversation.MsgDestructTime, "lastMsgDestructTime", conversation.LatestMsgDestructTime)
- seqs, err := c.msgDatabase.UserMsgsDestruct(ctx, conversation.OwnerUserID, conversation.ConversationID, conversation.MsgDestructTime, conversation.LatestMsgDestructTime)
+ log.ZDebug(
+ ctx,
+ "UserMsgsDestruct",
+ "conversationID",
+ conversation.ConversationID,
+ "ownerUserID",
+ conversation.OwnerUserID,
+ "msgDestructTime",
+ conversation.MsgDestructTime,
+ "lastMsgDestructTime",
+ conversation.LatestMsgDestructTime,
+ )
+ seqs, err := c.msgDatabase.UserMsgsDestruct(
+ ctx,
+ conversation.OwnerUserID,
+ conversation.ConversationID,
+ conversation.MsgDestructTime,
+ conversation.LatestMsgDestructTime,
+ )
if err != nil {
- log.ZError(ctx, "user msg destruct failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID)
+ log.ZError(
+ ctx,
+ "user msg destruct failed",
+ err,
+ "conversationID",
+ conversation.ConversationID,
+ "ownerUserID",
+ conversation.OwnerUserID,
+ )
continue
}
if err := c.conversationDatabase.UpdateUsersConversationFiled(ctx, []string{conversation.OwnerUserID}, conversation.ConversationID, map[string]interface{}{"latest_msg_destruct_time": time.Now()}); err != nil {
- log.ZError(ctx, "updateUsersConversationFiled failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID)
+ log.ZError(
+ ctx,
+ "updateUsersConversationFiled failed",
+ err,
+ "conversationID",
+ conversation.ConversationID,
+ "ownerUserID",
+ conversation.OwnerUserID,
+ )
continue
}
if len(seqs) > 0 {
if err := c.msgNotificationSender.UserDeleteMsgsNotification(ctx, conversation.OwnerUserID, conversation.ConversationID, seqs); err != nil {
- log.ZError(ctx, "userDeleteMsgsNotification failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID)
+ log.ZError(
+ ctx,
+ "userDeleteMsgsNotification failed",
+ err,
+ "conversationID",
+ conversation.ConversationID,
+ "ownerUserID",
+ conversation.OwnerUserID,
+ )
}
}
}
diff --git a/internal/tools/cron_task.go b/internal/tools/cron_task.go
index 5e4183615..e67c06671 100644
--- a/internal/tools/cron_task.go
+++ b/internal/tools/cron_task.go
@@ -34,10 +34,19 @@ func StartCronTask() error {
c := cron.New()
var wg sync.WaitGroup
wg.Add(1)
- log.ZInfo(context.Background(), "start chatRecordsClearTime cron task", "cron config", config.Config.ChatRecordsClearTime)
+ log.ZInfo(
+ context.Background(),
+ "start chatRecordsClearTime cron task",
+ "cron config",
+ config.Config.ChatRecordsClearTime,
+ )
_, err = c.AddFunc(config.Config.ChatRecordsClearTime, msgTool.AllConversationClearMsgAndFixSeq)
if err != nil {
- fmt.Println("start allConversationClearMsgAndFixSeq cron failed", err.Error(), config.Config.ChatRecordsClearTime)
+ fmt.Println(
+ "start allConversationClearMsgAndFixSeq cron failed",
+ err.Error(),
+ config.Config.ChatRecordsClearTime,
+ )
panic(err)
}
log.ZInfo(context.Background(), "start msgDestruct cron task", "cron config", config.Config.MsgDestructTime)
diff --git a/internal/tools/msg.go b/internal/tools/msg.go
index 7247d32eb..aa7f52f23 100644
--- a/internal/tools/msg.go
+++ b/internal/tools/msg.go
@@ -6,6 +6,10 @@ import (
"math"
"time"
+ "github.com/redis/go-redis/v9"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
@@ -20,9 +24,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "github.com/redis/go-redis/v9"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
)
type MsgTool struct {
@@ -33,8 +34,13 @@ type MsgTool struct {
msgNotificationSender *notification.MsgNotificationSender
}
-func NewMsgTool(msgDatabase controller.CommonMsgDatabase, userDatabase controller.UserDatabase,
- groupDatabase controller.GroupDatabase, conversationDatabase controller.ConversationDatabase, msgNotificationSender *notification.MsgNotificationSender) *MsgTool {
+func NewMsgTool(
+ msgDatabase controller.CommonMsgDatabase,
+ userDatabase controller.UserDatabase,
+ groupDatabase controller.GroupDatabase,
+ conversationDatabase controller.ConversationDatabase,
+ msgNotificationSender *notification.MsgNotificationSender,
+) *MsgTool {
return &MsgTool{
msgDatabase: msgDatabase,
userDatabase: userDatabase,
@@ -57,18 +63,35 @@ func InitMsgTool() (*MsgTool, error) {
if err != nil {
return nil, err
}
- discov, err := zookeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema,
- zookeeper.WithFreq(time.Hour), zookeeper.WithRoundRobin(), zookeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username,
- config.Config.Zookeeper.Password), zookeeper.WithTimeout(10), zookeeper.WithLogger(log.NewZkLogger()))
+ discov, err := zookeeper.NewClient(
+ config.Config.Zookeeper.ZkAddr,
+ config.Config.Zookeeper.Schema,
+ zookeeper.WithFreq(
+ time.Hour,
+ ),
+ zookeeper.WithRoundRobin(),
+ zookeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username,
+ config.Config.Zookeeper.Password),
+ zookeeper.WithTimeout(10),
+ zookeeper.WithLogger(log.NewZkLogger()),
+ )
if err != nil {
return nil, err
}
discov.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
userDB := relation.NewUserGorm(db)
msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase())
- userDatabase := controller.NewUserDatabase(userDB, cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()), tx.NewGorm(db))
+ userDatabase := controller.NewUserDatabase(
+ userDB,
+ cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()),
+ tx.NewGorm(db),
+ )
groupDatabase := controller.InitGroupDatabase(db, rdb, mongo.GetDatabase())
- conversationDatabase := controller.NewConversationDatabase(relation.NewConversationGorm(db), cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), relation.NewConversationGorm(db)), tx.NewGorm(db))
+ conversationDatabase := controller.NewConversationDatabase(
+ relation.NewConversationGorm(db),
+ cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), relation.NewConversationGorm(db)),
+ tx.NewGorm(db),
+ )
msgRpcClient := rpcclient.NewMessageRpcClient(discov)
msgNotificationSender := notification.NewMsgNotificationSender(rpcclient.WithRpcClient(&msgRpcClient))
msgTool := NewMsgTool(msgDatabase, userDatabase, groupDatabase, conversationDatabase, msgNotificationSender)
@@ -93,7 +116,15 @@ func (c *MsgTool) AllConversationClearMsgAndFixSeq() {
func (c *MsgTool) ClearConversationsMsg(ctx context.Context, conversationIDs []string) {
for _, conversationID := range conversationIDs {
if err := c.msgDatabase.DeleteConversationMsgsAndSetMinSeq(ctx, conversationID, int64(config.Config.RetainChatRecords*24*60*60)); err != nil {
- log.ZError(ctx, "DeleteUserSuperGroupMsgsAndSetMinSeq failed", err, "conversationID", conversationID, "DBRetainChatRecords", config.Config.RetainChatRecords)
+ log.ZError(
+ ctx,
+ "DeleteUserSuperGroupMsgsAndSetMinSeq failed",
+ err,
+ "conversationID",
+ conversationID,
+ "DBRetainChatRecords",
+ config.Config.RetainChatRecords,
+ )
}
if err := c.checkMaxSeq(ctx, conversationID); err != nil {
log.ZError(ctx, "fixSeq failed", err, "conversationID", conversationID)
@@ -107,7 +138,19 @@ func (c *MsgTool) checkMaxSeqWithMongo(ctx context.Context, conversationID strin
return err
}
if math.Abs(float64(maxSeqMongo-maxSeqCache)) > 10 {
- log.ZError(ctx, "cache max seq and mongo max seq is diff > 10", nil, "maxSeqMongo", maxSeqMongo, "minSeqMongo", minSeqMongo, "maxSeqCache", maxSeqCache, "conversationID", conversationID)
+ log.ZError(
+ ctx,
+ "cache max seq and mongo max seq is diff > 10",
+ nil,
+ "maxSeqMongo",
+ maxSeqMongo,
+ "minSeqMongo",
+ minSeqMongo,
+ "maxSeqCache",
+ maxSeqCache,
+ "conversationID",
+ conversationID,
+ )
}
return nil
}
diff --git a/pkg/apistruct/msg.go b/pkg/apistruct/msg.go
index 274c31a61..a07616ff2 100644
--- a/pkg/apistruct/msg.go
+++ b/pkg/apistruct/msg.go
@@ -1,8 +1,8 @@
package apistruct
type DelMsgReq struct {
- UserID string `json:"userID,omitempty" binding:"required"`
- SeqList []uint32 `json:"seqList,omitempty" binding:"required"`
+ UserID string `json:"userID,omitempty" binding:"required"`
+ SeqList []uint32 `json:"seqList,omitempty" binding:"required"`
OperationID string `json:"operationID,omitempty" binding:"required"`
}
@@ -10,19 +10,19 @@ type DelMsgResp struct {
}
type CleanUpMsgReq struct {
- UserID string `json:"userID" binding:"required"`
- OperationID string `json:"operationID" binding:"required"`
+ UserID string `json:"userID" binding:"required"`
+ OperationID string `json:"operationID" binding:"required"`
}
type CleanUpMsgResp struct {
}
type DelSuperGroupMsgReq struct {
- UserID string `json:"userID" binding:"required"`
- GroupID string `json:"groupID" binding:"required"`
+ UserID string `json:"userID" binding:"required"`
+ GroupID string `json:"groupID" binding:"required"`
SeqList []uint32 `json:"seqList,omitempty"`
IsAllDelete bool `json:"isAllDelete"`
- OperationID string `json:"operationID" binding:"required"`
+ OperationID string `json:"operationID" binding:"required"`
}
type DelSuperGroupMsgResp struct {
@@ -35,10 +35,10 @@ type MsgDeleteNotificationElem struct {
}
type SetMsgMinSeqReq struct {
- UserID string `json:"userID" binding:"required"`
+ UserID string `json:"userID" binding:"required"`
GroupID string `json:"groupID"`
- MinSeq uint32 `json:"minSeq" binding:"required"`
- OperationID string `json:"operationID" binding:"required"`
+ MinSeq uint32 `json:"minSeq" binding:"required"`
+ OperationID string `json:"operationID" binding:"required"`
}
type SetMsgMinSeqResp struct {
@@ -46,17 +46,17 @@ type SetMsgMinSeqResp struct {
type PictureBaseInfo struct {
UUID string `mapstructure:"uuid"`
- Type string `mapstructure:"type" `
- Size int64 `mapstructure:"size" `
- Width int32 `mapstructure:"width" `
+ Type string `mapstructure:"type"`
+ Size int64 `mapstructure:"size"`
+ Width int32 `mapstructure:"width"`
Height int32 `mapstructure:"height"`
- Url string `mapstructure:"url" `
+ Url string `mapstructure:"url"`
}
type PictureElem struct {
SourcePath string `mapstructure:"sourcePath"`
SourcePicture PictureBaseInfo `mapstructure:"sourcePicture"`
- BigPicture PictureBaseInfo `mapstructure:"bigPicture" `
+ BigPicture PictureBaseInfo `mapstructure:"bigPicture"`
SnapshotPicture PictureBaseInfo `mapstructure:"snapshotPicture"`
}
type SoundElem struct {
@@ -98,7 +98,7 @@ type LocationElem struct {
Latitude float64 `mapstructure:"latitude"`
}
type CustomElem struct {
- Data string `mapstructure:"data" validate:"required"`
+ Data string `mapstructure:"data" validate:"required"`
Description string `mapstructure:"description"`
Extension string `mapstructure:"extension"`
}
@@ -110,23 +110,23 @@ type RevokeElem struct {
RevokeMsgClientID string `mapstructure:"revokeMsgClientID" validate:"required"`
}
type OANotificationElem struct {
- NotificationName string `mapstructure:"notificationName" json:"notificationName" validate:"required"`
+ NotificationName string `mapstructure:"notificationName" json:"notificationName" validate:"required"`
NotificationFaceURL string `mapstructure:"notificationFaceURL" json:"notificationFaceURL"`
- 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"`
- PictureElem PictureElem `mapstructure:"pictureElem" json:"pictureElem"`
- SoundElem SoundElem `mapstructure:"soundElem" json:"soundElem"`
- VideoElem VideoElem `mapstructure:"videoElem" json:"videoElem"`
- FileElem FileElem `mapstructure:"fileElem" json:"fileElem"`
- Ex string `mapstructure:"ex" json:"ex"`
+ 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"`
+ PictureElem PictureElem `mapstructure:"pictureElem" json:"pictureElem"`
+ SoundElem SoundElem `mapstructure:"soundElem" json:"soundElem"`
+ VideoElem VideoElem `mapstructure:"videoElem" json:"videoElem"`
+ FileElem FileElem `mapstructure:"fileElem" json:"fileElem"`
+ Ex string `mapstructure:"ex" json:"ex"`
}
type MessageRevoked struct {
- RevokerID string `mapstructure:"revokerID" json:"revokerID" validate:"required"`
- RevokerRole int32 `mapstructure:"revokerRole" json:"revokerRole" validate:"required"`
- ClientMsgID string `mapstructure:"clientMsgID" json:"clientMsgID" validate:"required"`
+ RevokerID string `mapstructure:"revokerID" json:"revokerID" validate:"required"`
+ RevokerRole int32 `mapstructure:"revokerRole" json:"revokerRole" validate:"required"`
+ ClientMsgID string `mapstructure:"clientMsgID" json:"clientMsgID" validate:"required"`
RevokerNickname string `mapstructure:"revokerNickname" json:"revokerNickname"`
- SessionType int32 `mapstructure:"sessionType" json:"sessionType" validate:"required"`
- Seq uint32 `mapstructure:"seq" json:"seq" validate:"required"`
+ SessionType int32 `mapstructure:"sessionType" json:"sessionType" validate:"required"`
+ Seq uint32 `mapstructure:"seq" json:"seq" validate:"required"`
}
diff --git a/pkg/common/cmd/rpc.go b/pkg/common/cmd/rpc.go
index 8ff4195d2..c9ac80b44 100644
--- a/pkg/common/cmd/rpc.go
+++ b/pkg/common/cmd/rpc.go
@@ -3,10 +3,11 @@ package cmd
import (
"errors"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/startrpc"
"github.com/spf13/cobra"
"google.golang.org/grpc"
+
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/startrpc"
)
type RpcCmd struct {
@@ -26,7 +27,10 @@ func (a *RpcCmd) Exec() error {
return a.Execute()
}
-func (a *RpcCmd) StartSvr(name string, rpcFn func(discov discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error) error {
+func (a *RpcCmd) StartSvr(
+ name string,
+ rpcFn func(discov discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error,
+) error {
if a.GetPortFlag() == 0 {
return errors.New("port is required")
}
diff --git a/pkg/common/db/controller/conversation.go b/pkg/common/db/controller/conversation.go
index 7908d163a..a7649b468 100644
--- a/pkg/common/db/controller/conversation.go
+++ b/pkg/common/db/controller/conversation.go
@@ -14,13 +14,22 @@ import (
type ConversationDatabase interface {
//UpdateUserConversationFiled 更新用户该会话的属性信息
- UpdateUsersConversationFiled(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) error
+ UpdateUsersConversationFiled(
+ ctx context.Context,
+ userIDs []string,
+ conversationID string,
+ args map[string]interface{},
+ ) error
//CreateConversation 创建一批新的会话
CreateConversation(ctx context.Context, conversations []*relationTb.ConversationModel) error
//SyncPeerUserPrivateConversation 同步对端私聊会话内部保证事务操作
SyncPeerUserPrivateConversationTx(ctx context.Context, conversation []*relationTb.ConversationModel) error
//FindConversations 根据会话ID获取某个用户的多个会话
- FindConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*relationTb.ConversationModel, error)
+ FindConversations(
+ ctx context.Context,
+ ownerUserID string,
+ conversationIDs []string,
+ ) ([]*relationTb.ConversationModel, error)
//FindRecvMsgNotNotifyUserIDs 获取超级大群开启免打扰的用户ID
FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error)
//GetUserAllConversation 获取一个用户在服务器上所有的会话
@@ -28,17 +37,29 @@ type ConversationDatabase interface {
//SetUserConversations 设置用户多个会话属性,如果会话不存在则创建,否则更新,内部保证原子性
SetUserConversations(ctx context.Context, ownerUserID string, conversations []*relationTb.ConversationModel) error
//SetUsersConversationFiledTx 设置多个用户会话关于某个字段的更新操作,如果会话不存在则创建,否则更新,内部保证事务操作
- SetUsersConversationFiledTx(ctx context.Context, userIDs []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) error
+ SetUsersConversationFiledTx(
+ ctx context.Context,
+ userIDs []string,
+ conversation *relationTb.ConversationModel,
+ filedMap map[string]interface{},
+ ) error
CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error
GetConversationIDs(ctx context.Context, userID string) ([]string, error)
GetUserConversationIDsHash(ctx context.Context, ownerUserID string) (hash uint64, err error)
GetAllConversationIDs(ctx context.Context) ([]string, error)
GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (map[string]int64, error)
- GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*relationTb.ConversationModel, error)
+ GetConversationsByConversationID(
+ ctx context.Context,
+ conversationIDs []string,
+ ) ([]*relationTb.ConversationModel, error)
GetConversationIDsNeedDestruct(ctx context.Context) ([]*relationTb.ConversationModel, error)
}
-func NewConversationDatabase(conversation relationTb.ConversationModelInterface, cache cache.ConversationCache, tx tx.Tx) ConversationDatabase {
+func NewConversationDatabase(
+ conversation relationTb.ConversationModelInterface,
+ cache cache.ConversationCache,
+ tx tx.Tx,
+) ConversationDatabase {
return &conversationDatabase{
conversationDB: conversation,
cache: cache,
@@ -52,7 +73,12 @@ type conversationDatabase struct {
tx tx.Tx
}
-func (c *conversationDatabase) SetUsersConversationFiledTx(ctx context.Context, userIDs []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) (err error) {
+func (c *conversationDatabase) SetUsersConversationFiledTx(
+ ctx context.Context,
+ userIDs []string,
+ conversation *relationTb.ConversationModel,
+ filedMap map[string]interface{},
+) (err error) {
cache := c.cache.NewCache()
if err := c.tx.Transaction(func(tx any) error {
conversationTx := c.conversationDB.NewTx(tx)
@@ -100,7 +126,12 @@ func (c *conversationDatabase) SetUsersConversationFiledTx(ctx context.Context,
return cache.ExecDel(ctx)
}
-func (c *conversationDatabase) UpdateUsersConversationFiled(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) error {
+func (c *conversationDatabase) UpdateUsersConversationFiled(
+ ctx context.Context,
+ userIDs []string,
+ conversationID string,
+ args map[string]interface{},
+) error {
_, err := c.conversationDB.UpdateByMap(ctx, userIDs, conversationID, args)
if err != nil {
return err
@@ -108,7 +139,10 @@ func (c *conversationDatabase) UpdateUsersConversationFiled(ctx context.Context,
return c.cache.DelUsersConversation(conversationID, userIDs...).ExecDel(ctx)
}
-func (c *conversationDatabase) CreateConversation(ctx context.Context, conversations []*relationTb.ConversationModel) error {
+func (c *conversationDatabase) CreateConversation(
+ ctx context.Context,
+ conversations []*relationTb.ConversationModel,
+) error {
if err := c.conversationDB.Create(ctx, conversations); err != nil {
return err
}
@@ -121,7 +155,10 @@ func (c *conversationDatabase) CreateConversation(ctx context.Context, conversat
return cache.DelConversationIDs(userIDs...).DelUserConversationIDsHash(userIDs...).ExecDel(ctx)
}
-func (c *conversationDatabase) SyncPeerUserPrivateConversationTx(ctx context.Context, conversations []*relationTb.ConversationModel) error {
+func (c *conversationDatabase) SyncPeerUserPrivateConversationTx(
+ ctx context.Context,
+ conversations []*relationTb.ConversationModel,
+) error {
cache := c.cache.NewCache()
if err := c.tx.Transaction(func(tx any) error {
conversationTx := c.conversationDB.NewTx(tx)
@@ -159,19 +196,34 @@ func (c *conversationDatabase) SyncPeerUserPrivateConversationTx(ctx context.Con
return cache.ExecDel(ctx)
}
-func (c *conversationDatabase) FindConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*relationTb.ConversationModel, error) {
+func (c *conversationDatabase) FindConversations(
+ ctx context.Context,
+ ownerUserID string,
+ conversationIDs []string,
+) ([]*relationTb.ConversationModel, error) {
return c.cache.GetConversations(ctx, ownerUserID, conversationIDs)
}
-func (c *conversationDatabase) GetConversation(ctx context.Context, ownerUserID string, conversationID string) (*relationTb.ConversationModel, error) {
+func (c *conversationDatabase) GetConversation(
+ ctx context.Context,
+ ownerUserID string,
+ conversationID string,
+) (*relationTb.ConversationModel, error) {
return c.cache.GetConversation(ctx, ownerUserID, conversationID)
}
-func (c *conversationDatabase) GetUserAllConversation(ctx context.Context, ownerUserID string) ([]*relationTb.ConversationModel, error) {
+func (c *conversationDatabase) GetUserAllConversation(
+ ctx context.Context,
+ ownerUserID string,
+) ([]*relationTb.ConversationModel, error) {
return c.cache.GetUserAllConversations(ctx, ownerUserID)
}
-func (c *conversationDatabase) SetUserConversations(ctx context.Context, ownerUserID string, conversations []*relationTb.ConversationModel) error {
+func (c *conversationDatabase) SetUserConversations(
+ ctx context.Context,
+ ownerUserID string,
+ conversations []*relationTb.ConversationModel,
+) error {
cache := c.cache.NewCache()
if err := c.tx.Transaction(func(tx any) error {
var conversationIDs []string
@@ -221,7 +273,11 @@ func (c *conversationDatabase) FindRecvMsgNotNotifyUserIDs(ctx context.Context,
return c.cache.GetSuperGroupRecvMsgNotNotifyUserIDs(ctx, groupID)
}
-func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error {
+func (c *conversationDatabase) CreateGroupChatConversation(
+ ctx context.Context,
+ groupID string,
+ userIDs []string,
+) error {
cache := c.cache.NewCache()
conversationID := utils.GetConversationIDBySessionType(constant.SuperGroupChatType, groupID)
if err := c.tx.Transaction(func(tx any) error {
@@ -261,7 +317,10 @@ func (c *conversationDatabase) GetConversationIDs(ctx context.Context, userID st
return c.cache.GetUserConversationIDs(ctx, userID)
}
-func (c *conversationDatabase) GetUserConversationIDsHash(ctx context.Context, ownerUserID string) (hash uint64, err error) {
+func (c *conversationDatabase) GetUserConversationIDsHash(
+ ctx context.Context,
+ ownerUserID string,
+) (hash uint64, err error) {
return c.cache.GetUserConversationIDsHash(ctx, ownerUserID)
}
@@ -269,14 +328,22 @@ func (c *conversationDatabase) GetAllConversationIDs(ctx context.Context) ([]str
return c.conversationDB.GetAllConversationIDs(ctx)
}
-func (c *conversationDatabase) GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (map[string]int64, error) {
+func (c *conversationDatabase) GetUserAllHasReadSeqs(
+ ctx context.Context,
+ ownerUserID string,
+) (map[string]int64, error) {
return c.cache.GetUserAllHasReadSeqs(ctx, ownerUserID)
}
-func (c *conversationDatabase) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*relationTb.ConversationModel, error) {
+func (c *conversationDatabase) GetConversationsByConversationID(
+ ctx context.Context,
+ conversationIDs []string,
+) ([]*relationTb.ConversationModel, error) {
return c.conversationDB.GetConversationsByConversationID(ctx, conversationIDs)
}
-func (c *conversationDatabase) GetConversationIDsNeedDestruct(ctx context.Context) ([]*relationTb.ConversationModel, error) {
+func (c *conversationDatabase) GetConversationIDsNeedDestruct(
+ ctx context.Context,
+) ([]*relationTb.ConversationModel, error) {
return c.conversationDB.GetConversationIDsNeedDestruct(ctx)
}
diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go
index 9010e3350..fd465c103 100644
--- a/pkg/common/db/controller/group.go
+++ b/pkg/common/db/controller/group.go
@@ -573,6 +573,10 @@ func (g *groupDatabase) CountTotal(ctx context.Context, before *time.Time) (coun
return g.groupDB.CountTotal(ctx, before)
}
-func (g *groupDatabase) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) {
+func (g *groupDatabase) CountRangeEverydayTotal(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+) (map[string]int64, error) {
return g.groupDB.CountRangeEverydayTotal(ctx, start, end)
}
diff --git a/pkg/common/db/controller/msg.go b/pkg/common/db/controller/msg.go
index f23e7580c..b2855819f 100644
--- a/pkg/common/db/controller/msg.go
+++ b/pkg/common/db/controller/msg.go
@@ -18,10 +18,11 @@ import (
"context"
"errors"
+ "go.mongodb.org/mongo-driver/mongo"
+
pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "go.mongodb.org/mongo-driver/mongo"
)
const (
@@ -40,16 +41,36 @@ type CommonMsgDatabase interface {
DeleteMessagesFromCache(ctx context.Context, conversationID string, seqs []int64) error
DelUserDeleteMsgsList(ctx context.Context, conversationID string, seqs []int64)
// incrSeq然后批量插入缓存
- BatchInsertChat2Cache(ctx context.Context, conversationID string, msgs []*sdkws.MsgData) (seq int64, isNewConversation bool, err error)
+ BatchInsertChat2Cache(
+ ctx context.Context,
+ conversationID string,
+ msgs []*sdkws.MsgData,
+ ) (seq int64, isNewConversation bool, err error)
// 通过seqList获取mongo中写扩散消息
- GetMsgBySeqsRange(ctx context.Context, userID string, conversationID string, begin, end, num, userMaxSeq int64) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error)
+ GetMsgBySeqsRange(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ begin, end, num, userMaxSeq int64,
+ ) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error)
// 通过seqList获取大群在 mongo里面的消息
- GetMsgBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error)
+ GetMsgBySeqs(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ seqs []int64,
+ ) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error)
// 删除会话消息重置最小seq, remainTime为消息保留的时间单位秒,超时消息删除, 传0删除所有消息(此方法不删除redis cache)
DeleteConversationMsgsAndSetMinSeq(ctx context.Context, conversationID string, remainTime int64) error
// 用户标记删除过期消息返回标记删除的seq列表
- UserMsgsDestruct(cte context.Context, userID string, conversationID string, destructTime int64, lastMsgDestructTime time.Time) (seqs []int64, err error)
+ UserMsgsDestruct(
+ cte context.Context,
+ userID string,
+ conversationID string,
+ destructTime int64,
+ lastMsgDestructTime time.Time,
+ ) (seqs []int64, err error)
// 用户根据seq删除消息
DeleteUserMsgsBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) error
@@ -75,7 +96,10 @@ type CommonMsgDatabase interface {
UserSetHasReadSeqs(ctx context.Context, userID string, hasReadSeqs map[string]int64) error
GetMongoMaxAndMinSeq(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo int64, err error)
- GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
+ GetConversationMinMaxSeqInMongoAndCache(
+ ctx context.Context,
+ conversationID string,
+ ) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
SetSendMsgStatus(ctx context.Context, id string, status int32) error
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
@@ -85,8 +109,23 @@ type CommonMsgDatabase interface {
MsgToPushMQ(ctx context.Context, key, conversarionID string, msg2mq *sdkws.MsgData) (int32, int64, error)
MsgToMongoMQ(ctx context.Context, key, conversarionID string, msgs []*sdkws.MsgData, lastSeq int64) error
- RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error)
- RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error)
+ RangeUserSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ group bool,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+ ) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error)
+ RangeGroupSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+ ) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error)
}
func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheModel cache.MsgModel) CommonMsgDatabase {
@@ -121,16 +160,32 @@ func (db *commonMsgDatabase) MsgToMQ(ctx context.Context, key string, msg2mq *sd
return err
}
-func (db *commonMsgDatabase) MsgToModifyMQ(ctx context.Context, key, conversationID string, messages []*sdkws.MsgData) error {
+func (db *commonMsgDatabase) MsgToModifyMQ(
+ ctx context.Context,
+ key, conversationID string,
+ messages []*sdkws.MsgData,
+) error {
if len(messages) > 0 {
- _, _, err := db.producerToModify.SendMessage(ctx, key, &pbMsg.MsgDataToModifyByMQ{ConversationID: conversationID, Messages: messages})
+ _, _, err := db.producerToModify.SendMessage(
+ ctx,
+ key,
+ &pbMsg.MsgDataToModifyByMQ{ConversationID: conversationID, Messages: messages},
+ )
return err
}
return nil
}
-func (db *commonMsgDatabase) MsgToPushMQ(ctx context.Context, key, conversationID string, msg2mq *sdkws.MsgData) (int32, int64, error) {
- partition, offset, err := db.producerToPush.SendMessage(ctx, key, &pbMsg.PushMsgDataToMQ{MsgData: msg2mq, ConversationID: conversationID})
+func (db *commonMsgDatabase) MsgToPushMQ(
+ ctx context.Context,
+ key, conversationID string,
+ msg2mq *sdkws.MsgData,
+) (int32, int64, error) {
+ partition, offset, err := db.producerToPush.SendMessage(
+ ctx,
+ key,
+ &pbMsg.PushMsgDataToMQ{MsgData: msg2mq, ConversationID: conversationID},
+ )
if err != nil {
log.ZError(ctx, "MsgToPushMQ", err, "key", key, "msg2mq", msg2mq)
return 0, 0, err
@@ -138,15 +193,30 @@ func (db *commonMsgDatabase) MsgToPushMQ(ctx context.Context, key, conversationI
return partition, offset, nil
}
-func (db *commonMsgDatabase) MsgToMongoMQ(ctx context.Context, key, conversationID string, messages []*sdkws.MsgData, lastSeq int64) error {
+func (db *commonMsgDatabase) MsgToMongoMQ(
+ ctx context.Context,
+ key, conversationID string,
+ messages []*sdkws.MsgData,
+ lastSeq int64,
+) error {
if len(messages) > 0 {
- _, _, err := db.producerToMongo.SendMessage(ctx, key, &pbMsg.MsgDataToMongoByMQ{LastSeq: lastSeq, ConversationID: conversationID, MsgData: messages})
+ _, _, err := db.producerToMongo.SendMessage(
+ ctx,
+ key,
+ &pbMsg.MsgDataToMongoByMQ{LastSeq: lastSeq, ConversationID: conversationID, MsgData: messages},
+ )
return err
}
return nil
}
-func (db *commonMsgDatabase) BatchInsertBlock(ctx context.Context, conversationID string, fields []any, key int8, firstSeq int64) error {
+func (db *commonMsgDatabase) BatchInsertBlock(
+ ctx context.Context,
+ conversationID string,
+ fields []any,
+ key int8,
+ firstSeq int64,
+) error {
if len(fields) == 0 {
return nil
}
@@ -247,7 +317,12 @@ func (db *commonMsgDatabase) BatchInsertBlock(ctx context.Context, conversationI
return nil
}
-func (db *commonMsgDatabase) BatchInsertChat2DB(ctx context.Context, conversationID string, msgList []*sdkws.MsgData, currentMaxSeq int64) error {
+func (db *commonMsgDatabase) BatchInsertChat2DB(
+ ctx context.Context,
+ conversationID string,
+ msgList []*sdkws.MsgData,
+ currentMaxSeq int64,
+) error {
if len(msgList) == 0 {
return errs.ErrArgs.Wrap("msgList is empty")
}
@@ -293,11 +368,21 @@ func (db *commonMsgDatabase) BatchInsertChat2DB(ctx context.Context, conversatio
return db.BatchInsertBlock(ctx, conversationID, msgs, updateKeyMsg, msgList[0].Seq)
}
-func (db *commonMsgDatabase) RevokeMsg(ctx context.Context, conversationID string, seq int64, revoke *unRelationTb.RevokeModel) error {
+func (db *commonMsgDatabase) RevokeMsg(
+ ctx context.Context,
+ conversationID string,
+ seq int64,
+ revoke *unRelationTb.RevokeModel,
+) error {
return db.BatchInsertBlock(ctx, conversationID, []any{revoke}, updateKeyRevoke, seq)
}
-func (db *commonMsgDatabase) MarkSingleChatMsgsAsRead(ctx context.Context, userID string, conversationID string, totalSeqs []int64) error {
+func (db *commonMsgDatabase) MarkSingleChatMsgsAsRead(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ totalSeqs []int64,
+) error {
for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, totalSeqs) {
var indexes []int64
for _, seq := range seqs {
@@ -320,7 +405,11 @@ func (db *commonMsgDatabase) DelUserDeleteMsgsList(ctx context.Context, conversa
db.cache.DelUserDeleteMsgsList(ctx, conversationID, seqs)
}
-func (db *commonMsgDatabase) BatchInsertChat2Cache(ctx context.Context, conversationID string, msgs []*sdkws.MsgData) (seq int64, isNew bool, err error) {
+func (db *commonMsgDatabase) BatchInsertChat2Cache(
+ ctx context.Context,
+ conversationID string,
+ msgs []*sdkws.MsgData,
+) (seq int64, isNew bool, err error) {
currentMaxSeq, err := db.cache.GetMaxSeq(ctx, conversationID)
if err != nil && errs.Unwrap(err) != redis.Nil {
prome.Inc(prome.SeqGetFailedCounter)
@@ -367,7 +456,11 @@ func (db *commonMsgDatabase) BatchInsertChat2Cache(ctx context.Context, conversa
return lastMaxSeq, isNew, utils.Wrap(err, "")
}
-func (db *commonMsgDatabase) getMsgBySeqs(ctx context.Context, userID, conversationID string, seqs []int64) (totalMsgs []*sdkws.MsgData, err error) {
+func (db *commonMsgDatabase) getMsgBySeqs(
+ ctx context.Context,
+ userID, conversationID string,
+ seqs []int64,
+) (totalMsgs []*sdkws.MsgData, err error) {
for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, seqs) {
//log.ZDebug(ctx, "getMsgBySeqs", "docID", docID, "seqs", seqs)
msgs, err := db.findMsgInfoBySeq(ctx, userID, docID, seqs)
@@ -381,7 +474,11 @@ func (db *commonMsgDatabase) getMsgBySeqs(ctx context.Context, userID, conversat
return totalMsgs, nil
}
-func (db *commonMsgDatabase) findMsgInfoBySeq(ctx context.Context, userID, docID string, seqs []int64) (totalMsgs []*unRelationTb.MsgInfoModel, err error) {
+func (db *commonMsgDatabase) findMsgInfoBySeq(
+ ctx context.Context,
+ userID, docID string,
+ seqs []int64,
+) (totalMsgs []*unRelationTb.MsgInfoModel, err error) {
msgs, err := db.msgDocDatabase.GetMsgBySeqIndexIn1Doc(ctx, userID, docID, seqs)
for _, msg := range msgs {
if msg.IsRead {
@@ -391,8 +488,25 @@ func (db *commonMsgDatabase) findMsgInfoBySeq(ctx context.Context, userID, docID
return msgs, err
}
-func (db *commonMsgDatabase) getMsgBySeqsRange(ctx context.Context, userID string, conversationID string, allSeqs []int64, begin, end int64) (seqMsgs []*sdkws.MsgData, err error) {
- log.ZDebug(ctx, "getMsgBySeqsRange", "conversationID", conversationID, "allSeqs", allSeqs, "begin", begin, "end", end)
+func (db *commonMsgDatabase) getMsgBySeqsRange(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ allSeqs []int64,
+ begin, end int64,
+) (seqMsgs []*sdkws.MsgData, err error) {
+ log.ZDebug(
+ ctx,
+ "getMsgBySeqsRange",
+ "conversationID",
+ conversationID,
+ "allSeqs",
+ allSeqs,
+ "begin",
+ begin,
+ "end",
+ end,
+ )
for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, allSeqs) {
log.ZDebug(ctx, "getMsgBySeqsRange", "docID", docID, "seqs", seqs)
msgs, err := db.findMsgInfoBySeq(ctx, userID, docID, seqs)
@@ -409,7 +523,12 @@ func (db *commonMsgDatabase) getMsgBySeqsRange(ctx context.Context, userID strin
return seqMsgs, nil
}
-func (db *commonMsgDatabase) GetMsgBySeqsRange(ctx context.Context, userID string, conversationID string, begin, end, num, userMaxSeq int64) (int64, int64, []*sdkws.MsgData, error) {
+func (db *commonMsgDatabase) GetMsgBySeqsRange(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ begin, end, num, userMaxSeq int64,
+) (int64, int64, []*sdkws.MsgData, error) {
userMinSeq, err := db.cache.GetConversationUserMinSeq(ctx, conversationID, userID)
if err != nil && errs.Unwrap(err) != redis.Nil {
return 0, 0, nil, err
@@ -429,7 +548,18 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange(ctx context.Context, userID strin
if err != nil && errs.Unwrap(err) != redis.Nil {
return 0, 0, nil, err
}
- log.ZDebug(ctx, "GetMsgBySeqsRange", "userMinSeq", userMinSeq, "conMinSeq", minSeq, "conMaxSeq", maxSeq, "userMaxSeq", userMaxSeq)
+ log.ZDebug(
+ ctx,
+ "GetMsgBySeqsRange",
+ "userMinSeq",
+ userMinSeq,
+ "conMinSeq",
+ minSeq,
+ "conMaxSeq",
+ maxSeq,
+ "userMaxSeq",
+ userMaxSeq,
+ )
if userMaxSeq != 0 {
if userMaxSeq < maxSeq {
maxSeq = userMaxSeq
@@ -479,7 +609,18 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange(ctx context.Context, userID strin
cacheDelNum += 1
}
}
- log.ZDebug(ctx, "get delSeqs from redis", "delSeqs", delSeqs, "userID", userID, "conversationID", conversationID, "cacheDelNum", cacheDelNum)
+ log.ZDebug(
+ ctx,
+ "get delSeqs from redis",
+ "delSeqs",
+ delSeqs,
+ "userID",
+ userID,
+ "conversationID",
+ conversationID,
+ "cacheDelNum",
+ cacheDelNum,
+ )
var reGetSeqsCache []int64
for i := 1; i <= cacheDelNum; {
newSeq := newBegin - int64(i)
@@ -499,7 +640,15 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange(ctx context.Context, userID strin
if err != nil {
if err != redis.Nil {
prome.Add(prome.MsgPullFromRedisFailedCounter, len(failedSeqs2))
- log.ZError(ctx, "get message from redis exception", err, "conversationID", conversationID, "seqs", reGetSeqsCache)
+ log.ZError(
+ ctx,
+ "get message from redis exception",
+ err,
+ "conversationID",
+ conversationID,
+ "seqs",
+ reGetSeqsCache,
+ )
}
}
failedSeqs = append(failedSeqs, failedSeqs2...)
@@ -525,7 +674,12 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange(ctx context.Context, userID strin
return minSeq, maxSeq, successMsgs, nil
}
-func (db *commonMsgDatabase) GetMsgBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) (int64, int64, []*sdkws.MsgData, error) {
+func (db *commonMsgDatabase) GetMsgBySeqs(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ seqs []int64,
+) (int64, int64, []*sdkws.MsgData, error) {
userMinSeq, err := db.cache.GetConversationUserMinSeq(ctx, conversationID, userID)
if err != nil && errs.Unwrap(err) != redis.Nil {
return 0, 0, nil, err
@@ -551,10 +705,33 @@ func (db *commonMsgDatabase) GetMsgBySeqs(ctx context.Context, userID string, co
if err != nil {
if err != redis.Nil {
prome.Add(prome.MsgPullFromRedisFailedCounter, len(failedSeqs))
- log.ZError(ctx, "get message from redis exception", err, "failedSeqs", failedSeqs, "conversationID", conversationID)
+ log.ZError(
+ ctx,
+ "get message from redis exception",
+ err,
+ "failedSeqs",
+ failedSeqs,
+ "conversationID",
+ conversationID,
+ )
}
}
- log.ZInfo(ctx, "db.cache.GetMessagesBySeq", "userID", userID, "conversationID", conversationID, "seqs", seqs, "successMsgs", len(successMsgs), "failedSeqs", failedSeqs, "conversationID", conversationID)
+ log.ZInfo(
+ ctx,
+ "db.cache.GetMessagesBySeq",
+ "userID",
+ userID,
+ "conversationID",
+ conversationID,
+ "seqs",
+ seqs,
+ "successMsgs",
+ len(successMsgs),
+ "failedSeqs",
+ failedSeqs,
+ "conversationID",
+ conversationID,
+ )
prome.Add(prome.MsgPullFromRedisSuccessCounter, len(successMsgs))
if len(failedSeqs) > 0 {
mongoMsgs, err := db.getMsgBySeqs(ctx, userID, conversationID, failedSeqs)
@@ -568,7 +745,11 @@ func (db *commonMsgDatabase) GetMsgBySeqs(ctx context.Context, userID string, co
return minSeq, maxSeq, successMsgs, nil
}
-func (db *commonMsgDatabase) DeleteConversationMsgsAndSetMinSeq(ctx context.Context, conversationID string, remainTime int64) error {
+func (db *commonMsgDatabase) DeleteConversationMsgsAndSetMinSeq(
+ ctx context.Context,
+ conversationID string,
+ remainTime int64,
+) error {
var delStruct delMsgRecursionStruct
var skip int64
minSeq, err := db.deleteMsgRecursion(ctx, conversationID, skip, &delStruct, remainTime)
@@ -588,7 +769,13 @@ func (db *commonMsgDatabase) DeleteConversationMsgsAndSetMinSeq(ctx context.Cont
return db.cache.SetMinSeq(ctx, conversationID, minSeq)
}
-func (db *commonMsgDatabase) UserMsgsDestruct(ctx context.Context, userID string, conversationID string, destructTime int64, lastMsgDestructTime time.Time) (seqs []int64, err error) {
+func (db *commonMsgDatabase) UserMsgsDestruct(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ destructTime int64,
+ lastMsgDestructTime time.Time,
+) (seqs []int64, err error) {
var index int64
for {
// from oldest 2 newest
@@ -596,7 +783,16 @@ func (db *commonMsgDatabase) UserMsgsDestruct(ctx context.Context, userID string
if err != nil || msgDocModel.DocID == "" {
if err != nil {
if err == unrelation.ErrMsgListNotExist {
- log.ZDebug(ctx, "deleteMsgRecursion finished", "conversationID", conversationID, "userID", userID, "index", index)
+ log.ZDebug(
+ ctx,
+ "deleteMsgRecursion finished",
+ "conversationID",
+ conversationID,
+ "userID",
+ userID,
+ "index",
+ index,
+ )
} else {
log.ZError(ctx, "deleteMsgRecursion GetUserMsgListByIndex failed", err, "conversationID", conversationID, "index", index)
}
@@ -645,13 +841,26 @@ func (d *delMsgRecursionStruct) getSetMinSeq() int64 {
// seq 70
// set minSeq 21
// recursion 删除list并且返回设置的最小seq
-func (db *commonMsgDatabase) deleteMsgRecursion(ctx context.Context, conversationID string, index int64, delStruct *delMsgRecursionStruct, remainTime int64) (int64, error) {
+func (db *commonMsgDatabase) deleteMsgRecursion(
+ ctx context.Context,
+ conversationID string,
+ index int64,
+ delStruct *delMsgRecursionStruct,
+ remainTime int64,
+) (int64, error) {
// find from oldest list
msgDocModel, err := db.msgDocDatabase.GetMsgDocModelByIndex(ctx, conversationID, index, 1)
if err != nil || msgDocModel.DocID == "" {
if err != nil {
if err == unrelation.ErrMsgListNotExist {
- log.ZDebug(ctx, "deleteMsgRecursion ErrMsgListNotExist", "conversationID", conversationID, "index:", index)
+ log.ZDebug(
+ ctx,
+ "deleteMsgRecursion ErrMsgListNotExist",
+ "conversationID",
+ conversationID,
+ "index:",
+ index,
+ )
} else {
log.ZError(ctx, "deleteMsgRecursion GetUserMsgListByIndex failed", err, "conversationID", conversationID, "index", index)
}
@@ -663,11 +872,23 @@ func (db *commonMsgDatabase) deleteMsgRecursion(ctx context.Context, conversatio
}
return delStruct.getSetMinSeq() + 1, nil
}
- log.ZDebug(ctx, "doc info", "conversationID", conversationID, "index", index, "docID", msgDocModel.DocID, "len", len(msgDocModel.Msg))
+ log.ZDebug(
+ ctx,
+ "doc info",
+ "conversationID",
+ conversationID,
+ "index",
+ index,
+ "docID",
+ msgDocModel.DocID,
+ "len",
+ len(msgDocModel.Msg),
+ )
if int64(len(msgDocModel.Msg)) > db.msg.GetSingleGocMsgNum() {
log.ZWarn(ctx, "msgs too large", nil, "lenth", len(msgDocModel.Msg), "docID:", msgDocModel.DocID)
}
- if msgDocModel.IsFull() && msgDocModel.Msg[len(msgDocModel.Msg)-1].Msg.SendTime+(remainTime*1000) < utils.GetCurrentTimestampByMill() {
+ if msgDocModel.IsFull() &&
+ msgDocModel.Msg[len(msgDocModel.Msg)-1].Msg.SendTime+(remainTime*1000) < utils.GetCurrentTimestampByMill() {
log.ZDebug(ctx, "doc is full and all msg is expired", "docID", msgDocModel.DocID)
delStruct.delDocIDs = append(delStruct.delDocIDs, msgDocModel.DocID)
delStruct.minSeq = msgDocModel.Msg[len(msgDocModel.Msg)-1].Msg.Seq
@@ -704,7 +925,11 @@ func (db *commonMsgDatabase) deleteMsgRecursion(ctx context.Context, conversatio
return seq, err
}
-func (db *commonMsgDatabase) DeleteMsgsPhysicalBySeqs(ctx context.Context, conversationID string, allSeqs []int64) error {
+func (db *commonMsgDatabase) DeleteMsgsPhysicalBySeqs(
+ ctx context.Context,
+ conversationID string,
+ allSeqs []int64,
+) error {
if err := db.cache.DeleteMessages(ctx, conversationID, allSeqs); err != nil {
return err
}
@@ -720,7 +945,12 @@ func (db *commonMsgDatabase) DeleteMsgsPhysicalBySeqs(ctx context.Context, conve
return nil
}
-func (db *commonMsgDatabase) DeleteUserMsgsBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) error {
+func (db *commonMsgDatabase) DeleteUserMsgsBySeqs(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ seqs []int64,
+) error {
cachedMsgs, _, err := db.cache.GetMessagesBySeq(ctx, conversationID, seqs)
if err != nil && errs.Unwrap(err) != redis.Nil {
log.ZWarn(ctx, "DeleteUserMsgsBySeqs", err, "conversationID", conversationID, "seqs", seqs)
@@ -789,31 +1019,70 @@ func (db *commonMsgDatabase) GetMinSeqs(ctx context.Context, conversationIDs []s
func (db *commonMsgDatabase) GetMinSeq(ctx context.Context, conversationID string) (int64, error) {
return db.cache.GetMinSeq(ctx, conversationID)
}
-func (db *commonMsgDatabase) GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error) {
+
+func (db *commonMsgDatabase) GetConversationUserMinSeq(
+ ctx context.Context,
+ conversationID string,
+ userID string,
+) (int64, error) {
return db.cache.GetConversationUserMinSeq(ctx, conversationID, userID)
}
-func (db *commonMsgDatabase) GetConversationUserMinSeqs(ctx context.Context, conversationID string, userIDs []string) (map[string]int64, error) {
+
+func (db *commonMsgDatabase) GetConversationUserMinSeqs(
+ ctx context.Context,
+ conversationID string,
+ userIDs []string,
+) (map[string]int64, error) {
return db.cache.GetConversationUserMinSeqs(ctx, conversationID, userIDs)
}
-func (db *commonMsgDatabase) SetConversationUserMinSeq(ctx context.Context, conversationID string, userID string, minSeq int64) error {
+
+func (db *commonMsgDatabase) SetConversationUserMinSeq(
+ ctx context.Context,
+ conversationID string,
+ userID string,
+ minSeq int64,
+) error {
return db.cache.SetConversationUserMinSeq(ctx, conversationID, userID, minSeq)
}
-func (db *commonMsgDatabase) SetConversationUserMinSeqs(ctx context.Context, conversationID string, seqs map[string]int64) (err error) {
+
+func (db *commonMsgDatabase) SetConversationUserMinSeqs(
+ ctx context.Context,
+ conversationID string,
+ seqs map[string]int64,
+) (err error) {
return db.cache.SetConversationUserMinSeqs(ctx, conversationID, seqs)
}
-func (db *commonMsgDatabase) SetUserConversationsMinSeqs(ctx context.Context, userID string, seqs map[string]int64) error {
+func (db *commonMsgDatabase) SetUserConversationsMinSeqs(
+ ctx context.Context,
+ userID string,
+ seqs map[string]int64,
+) error {
return db.cache.SetUserConversationsMinSeqs(ctx, userID, seqs)
}
-func (db *commonMsgDatabase) UserSetHasReadSeqs(ctx context.Context, userID string, hasReadSeqs map[string]int64) error {
+func (db *commonMsgDatabase) UserSetHasReadSeqs(
+ ctx context.Context,
+ userID string,
+ hasReadSeqs map[string]int64,
+) error {
return db.cache.UserSetHasReadSeqs(ctx, userID, hasReadSeqs)
}
-func (db *commonMsgDatabase) SetHasReadSeq(ctx context.Context, userID string, conversationID string, hasReadSeq int64) error {
+func (db *commonMsgDatabase) SetHasReadSeq(
+ ctx context.Context,
+ userID string,
+ conversationID string,
+ hasReadSeq int64,
+) error {
return db.cache.SetHasReadSeq(ctx, userID, conversationID, hasReadSeq)
}
-func (db *commonMsgDatabase) GetHasReadSeqs(ctx context.Context, userID string, conversationIDs []string) (map[string]int64, error) {
+
+func (db *commonMsgDatabase) GetHasReadSeqs(
+ ctx context.Context,
+ userID string,
+ conversationIDs []string,
+) (map[string]int64, error) {
return db.cache.GetHasReadSeqs(ctx, userID, conversationIDs)
}
@@ -829,7 +1098,10 @@ func (db *commonMsgDatabase) GetSendMsgStatus(ctx context.Context, id string) (i
return db.cache.GetSendMsgStatus(ctx, id)
}
-func (db *commonMsgDatabase) GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error) {
+func (db *commonMsgDatabase) GetConversationMinMaxSeqInMongoAndCache(
+ ctx context.Context,
+ conversationID string,
+) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error) {
minSeqMongo, maxSeqMongo, err = db.GetMinMaxSeqMongo(ctx, conversationID)
if err != nil {
return
@@ -845,11 +1117,17 @@ func (db *commonMsgDatabase) GetConversationMinMaxSeqInMongoAndCache(ctx context
return
}
-func (db *commonMsgDatabase) GetMongoMaxAndMinSeq(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo int64, err error) {
+func (db *commonMsgDatabase) GetMongoMaxAndMinSeq(
+ ctx context.Context,
+ conversationID string,
+) (minSeqMongo, maxSeqMongo int64, err error) {
return db.GetMinMaxSeqMongo(ctx, conversationID)
}
-func (db *commonMsgDatabase) GetMinMaxSeqMongo(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo int64, err error) {
+func (db *commonMsgDatabase) GetMinMaxSeqMongo(
+ ctx context.Context,
+ conversationID string,
+) (minSeqMongo, maxSeqMongo int64, err error) {
oldestMsgMongo, err := db.msgDocDatabase.GetOldestMsg(ctx, conversationID)
if err != nil {
return
@@ -863,10 +1141,25 @@ func (db *commonMsgDatabase) GetMinMaxSeqMongo(ctx context.Context, conversation
return
}
-func (db *commonMsgDatabase) RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error) {
+func (db *commonMsgDatabase) RangeUserSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ group bool,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error) {
return db.msgDocDatabase.RangeUserSendCount(ctx, start, end, group, ase, pageNumber, showNumber)
}
-func (db *commonMsgDatabase) RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) {
+func (db *commonMsgDatabase) RangeGroupSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) {
return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber)
}
diff --git a/pkg/common/db/controller/s3.go b/pkg/common/db/controller/s3.go
index b3cc9dbb4..83f81519a 100644
--- a/pkg/common/db/controller/s3.go
+++ b/pkg/common/db/controller/s3.go
@@ -2,18 +2,25 @@ package controller
import (
"context"
+ "path/filepath"
+ "time"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
- "path/filepath"
- "time"
)
type S3Database interface {
PartLimit() *s3.PartLimit
PartSize(ctx context.Context, size int64) (int64, error)
AuthSign(ctx context.Context, uploadID string, partNumbers []int) (*s3.AuthSignResult, error)
- InitiateMultipartUpload(ctx context.Context, hash string, size int64, expire time.Duration, maxParts int) (*cont.InitiateUploadResult, error)
+ InitiateMultipartUpload(
+ ctx context.Context,
+ hash string,
+ size int64,
+ expire time.Duration,
+ maxParts int,
+ ) (*cont.InitiateUploadResult, error)
CompleteMultipartUpload(ctx context.Context, uploadID string, parts []string) (*cont.UploadResult, error)
AccessURL(ctx context.Context, name string, expire time.Duration) (time.Time, string, error)
SetObject(ctx context.Context, info *relation.ObjectModel) error
@@ -43,11 +50,21 @@ func (s *s3Database) AuthSign(ctx context.Context, uploadID string, partNumbers
return s.s3.AuthSign(ctx, uploadID, partNumbers)
}
-func (s *s3Database) InitiateMultipartUpload(ctx context.Context, hash string, size int64, expire time.Duration, maxParts int) (*cont.InitiateUploadResult, error) {
+func (s *s3Database) InitiateMultipartUpload(
+ ctx context.Context,
+ hash string,
+ size int64,
+ expire time.Duration,
+ maxParts int,
+) (*cont.InitiateUploadResult, error) {
return s.s3.InitiateUpload(ctx, hash, size, expire, maxParts)
}
-func (s *s3Database) CompleteMultipartUpload(ctx context.Context, uploadID string, parts []string) (*cont.UploadResult, error) {
+func (s *s3Database) CompleteMultipartUpload(
+ ctx context.Context,
+ uploadID string,
+ parts []string,
+) (*cont.UploadResult, error) {
return s.s3.CompleteUpload(ctx, uploadID, parts)
}
diff --git a/pkg/common/db/relation/conversation_model.go b/pkg/common/db/relation/conversation_model.go
index 04300f704..f4a282af0 100644
--- a/pkg/common/db/relation/conversation_model.go
+++ b/pkg/common/db/relation/conversation_model.go
@@ -3,10 +3,11 @@ package relation
import (
"context"
+ "gorm.io/gorm"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "gorm.io/gorm"
)
type ConversationGorm struct {
@@ -29,66 +30,172 @@ func (c *ConversationGorm) Delete(ctx context.Context, groupIDs []string) (err e
return utils.Wrap(c.db(ctx).Where("group_id in (?)", groupIDs).Delete(&relation.ConversationModel{}).Error, "")
}
-func (c *ConversationGorm) UpdateByMap(ctx context.Context, userIDList []string, conversationID string, args map[string]interface{}) (rows int64, err error) {
+func (c *ConversationGorm) UpdateByMap(
+ ctx context.Context,
+ userIDList []string,
+ conversationID string,
+ args map[string]interface{},
+) (rows int64, err error) {
result := c.db(ctx).Where("owner_user_id IN (?) and conversation_id=?", userIDList, conversationID).Updates(args)
return result.RowsAffected, utils.Wrap(result.Error, "")
}
func (c *ConversationGorm) Update(ctx context.Context, conversation *relation.ConversationModel) (err error) {
- return utils.Wrap(c.db(ctx).Where("owner_user_id = ? and conversation_id = ?", conversation.OwnerUserID, conversation.ConversationID).Updates(conversation).Error, "")
-}
-
-func (c *ConversationGorm) Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*relation.ConversationModel, err error) {
- err = utils.Wrap(c.db(ctx).Where("owner_user_id=? and conversation_id IN (?)", ownerUserID, conversationIDs).Find(&conversations).Error, "")
+ return utils.Wrap(
+ c.db(ctx).
+ Where("owner_user_id = ? and conversation_id = ?", conversation.OwnerUserID, conversation.ConversationID).
+ Updates(conversation).
+ Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) Find(
+ ctx context.Context,
+ ownerUserID string,
+ conversationIDs []string,
+) (conversations []*relation.ConversationModel, err error) {
+ err = utils.Wrap(
+ c.db(ctx).
+ Where("owner_user_id=? and conversation_id IN (?)", ownerUserID, conversationIDs).
+ Find(&conversations).
+ Error,
+ "",
+ )
return conversations, err
}
-func (c *ConversationGorm) Take(ctx context.Context, userID, conversationID string) (conversation *relation.ConversationModel, err error) {
+func (c *ConversationGorm) Take(
+ ctx context.Context,
+ userID, conversationID string,
+) (conversation *relation.ConversationModel, err error) {
cc := &relation.ConversationModel{}
- return cc, utils.Wrap(c.db(ctx).Where("conversation_id = ? And owner_user_id = ?", conversationID, userID).Take(cc).Error, "")
-}
-
-func (c *ConversationGorm) FindUserID(ctx context.Context, userIDs []string, conversationIDs []string) (existUserID []string, err error) {
- return existUserID, utils.Wrap(c.db(ctx).Where(" owner_user_id IN (?) and conversation_id in (?)", userIDs, conversationIDs).Pluck("owner_user_id", &existUserID).Error, "")
-}
-
-func (c *ConversationGorm) FindConversationID(ctx context.Context, userID string, conversationIDList []string) (existConversationID []string, err error) {
- return existConversationID, utils.Wrap(c.db(ctx).Where(" conversation_id IN (?) and owner_user_id=?", conversationIDList, userID).Pluck("conversation_id", &existConversationID).Error, "")
-}
-
-func (c *ConversationGorm) FindUserIDAllConversationID(ctx context.Context, userID string) (conversationIDList []string, err error) {
- return conversationIDList, utils.Wrap(c.db(ctx).Where("owner_user_id=?", userID).Pluck("conversation_id", &conversationIDList).Error, "")
-}
-
-func (c *ConversationGorm) FindUserIDAllConversations(ctx context.Context, userID string) (conversations []*relation.ConversationModel, err error) {
+ return cc, utils.Wrap(
+ c.db(ctx).Where("conversation_id = ? And owner_user_id = ?", conversationID, userID).Take(cc).Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) FindUserID(
+ ctx context.Context,
+ userIDs []string,
+ conversationIDs []string,
+) (existUserID []string, err error) {
+ return existUserID, utils.Wrap(
+ c.db(ctx).
+ Where(" owner_user_id IN (?) and conversation_id in (?)", userIDs, conversationIDs).
+ Pluck("owner_user_id", &existUserID).
+ Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) FindConversationID(
+ ctx context.Context,
+ userID string,
+ conversationIDList []string,
+) (existConversationID []string, err error) {
+ return existConversationID, utils.Wrap(
+ c.db(ctx).
+ Where(" conversation_id IN (?) and owner_user_id=?", conversationIDList, userID).
+ Pluck("conversation_id", &existConversationID).
+ Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) FindUserIDAllConversationID(
+ ctx context.Context,
+ userID string,
+) (conversationIDList []string, err error) {
+ return conversationIDList, utils.Wrap(
+ c.db(ctx).Where("owner_user_id=?", userID).Pluck("conversation_id", &conversationIDList).Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) FindUserIDAllConversations(
+ ctx context.Context,
+ userID string,
+) (conversations []*relation.ConversationModel, err error) {
return conversations, utils.Wrap(c.db(ctx).Where("owner_user_id=?", userID).Find(&conversations).Error, "")
}
-func (c *ConversationGorm) FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (userIDs []string, err error) {
- return userIDs, utils.Wrap(c.db(ctx).Where("group_id = ? and recv_msg_opt = ?", groupID, constant.ReceiveNotNotifyMessage).Pluck("user_id", &userIDs).Error, "")
-}
-
-func (c *ConversationGorm) FindSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (userIDs []string, err error) {
- return userIDs, utils.Wrap(c.db(ctx).Where("group_id = ? and recv_msg_opt = ? and conversation_type = ?", groupID, constant.ReceiveNotNotifyMessage, constant.SuperGroupChatType).Pluck("user_id", &userIDs).Error, "")
-}
-
-func (c *ConversationGorm) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) {
+func (c *ConversationGorm) FindRecvMsgNotNotifyUserIDs(
+ ctx context.Context,
+ groupID string,
+) (userIDs []string, err error) {
+ return userIDs, utils.Wrap(
+ c.db(ctx).
+ Where("group_id = ? and recv_msg_opt = ?", groupID, constant.ReceiveNotNotifyMessage).
+ Pluck("user_id", &userIDs).
+ Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) FindSuperGroupRecvMsgNotNotifyUserIDs(
+ ctx context.Context,
+ groupID string,
+) (userIDs []string, err error) {
+ return userIDs, utils.Wrap(
+ c.db(ctx).
+ Where("group_id = ? and recv_msg_opt = ? and conversation_type = ?", groupID, constant.ReceiveNotNotifyMessage, constant.SuperGroupChatType).
+ Pluck("user_id", &userIDs).
+ Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) GetUserRecvMsgOpt(
+ ctx context.Context,
+ ownerUserID, conversationID string,
+) (opt int, err error) {
var conversation relation.ConversationModel
- return int(conversation.RecvMsgOpt), utils.Wrap(c.db(ctx).Where("conversation_id = ? And owner_user_id = ?", conversationID, ownerUserID).Select("recv_msg_opt").Find(&conversation).Error, "")
+ return int(
+ conversation.RecvMsgOpt,
+ ), utils.Wrap(
+ c.db(ctx).
+ Where("conversation_id = ? And owner_user_id = ?", conversationID, ownerUserID).
+ Select("recv_msg_opt").
+ Find(&conversation).
+ Error,
+ "",
+ )
}
func (c *ConversationGorm) GetAllConversationIDs(ctx context.Context) (conversationIDs []string, err error) {
- return conversationIDs, utils.Wrap(c.db(ctx).Distinct("conversation_id").Pluck("conversation_id", &conversationIDs).Error, "")
+ return conversationIDs, utils.Wrap(
+ c.db(ctx).Distinct("conversation_id").Pluck("conversation_id", &conversationIDs).Error,
+ "",
+ )
}
-func (c *ConversationGorm) GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (hasReadSeqs map[string]int64, err error) {
+func (c *ConversationGorm) GetUserAllHasReadSeqs(
+ ctx context.Context,
+ ownerUserID string,
+) (hasReadSeqs map[string]int64, err error) {
return nil, nil
}
-func (c *ConversationGorm) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) (conversations []*relation.ConversationModel, err error) {
- return conversations, utils.Wrap(c.db(ctx).Where("conversation_id IN (?)", conversationIDs).Find(&conversations).Error, "")
-}
-
-func (c *ConversationGorm) GetConversationIDsNeedDestruct(ctx context.Context) (conversations []*relation.ConversationModel, err error) {
- return conversations, utils.Wrap(c.db(ctx).Where("is_msg_destruct = 1 && UNIX_TIMESTAMP(NOW()) > (msg_destruct_time + UNIX_TIMESTAMP(latest_msg_destruct_time)) && msg_destruct_time != 0").Find(&conversations).Error, "")
+func (c *ConversationGorm) GetConversationsByConversationID(
+ ctx context.Context,
+ conversationIDs []string,
+) (conversations []*relation.ConversationModel, err error) {
+ return conversations, utils.Wrap(
+ c.db(ctx).Where("conversation_id IN (?)", conversationIDs).Find(&conversations).Error,
+ "",
+ )
+}
+
+func (c *ConversationGorm) GetConversationIDsNeedDestruct(
+ ctx context.Context,
+) (conversations []*relation.ConversationModel, err error) {
+ return conversations, utils.Wrap(
+ c.db(ctx).
+ Where("is_msg_destruct = 1 && UNIX_TIMESTAMP(NOW()) > (msg_destruct_time + UNIX_TIMESTAMP(latest_msg_destruct_time)) && msg_destruct_time != 0").
+ Find(&conversations).
+ Error,
+ "",
+ )
}
diff --git a/pkg/common/db/relation/group_model.go b/pkg/common/db/relation/group_model.go
index f3e1aec2f..402c77682 100644
--- a/pkg/common/db/relation/group_model.go
+++ b/pkg/common/db/relation/group_model.go
@@ -2,12 +2,14 @@ package relation
import (
"context"
+ "time"
+
+ "gorm.io/gorm"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/ormutil"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "gorm.io/gorm"
- "time"
)
var _ relation.GroupModelInterface = (*GroupGorm)(nil)
@@ -33,7 +35,13 @@ func (g *GroupGorm) UpdateMap(ctx context.Context, groupID string, args map[stri
}
func (g *GroupGorm) UpdateStatus(ctx context.Context, groupID string, status int32) (err error) {
- return utils.Wrap(g.DB.Where("group_id = ?", groupID).Model(&relation.GroupModel{}).Updates(map[string]any{"status": status}).Error, "")
+ return utils.Wrap(
+ g.DB.Where("group_id = ?", groupID).
+ Model(&relation.GroupModel{}).
+ Updates(map[string]any{"status": status}).
+ Error,
+ "",
+ )
}
func (g *GroupGorm) Find(ctx context.Context, groupIDs []string) (groups []*relation.GroupModel, err error) {
@@ -45,12 +53,19 @@ func (g *GroupGorm) Take(ctx context.Context, groupID string) (group *relation.G
return group, utils.Wrap(g.DB.Where("group_id = ?", groupID).Take(group).Error, "")
}
-func (g *GroupGorm) Search(ctx context.Context, keyword string, pageNumber, showNumber int32) (total uint32, groups []*relation.GroupModel, err error) {
+func (g *GroupGorm) Search(
+ ctx context.Context,
+ keyword string,
+ pageNumber, showNumber int32,
+) (total uint32, groups []*relation.GroupModel, err error) {
return ormutil.GormSearch[relation.GroupModel](g.DB, []string{"name"}, keyword, pageNumber, showNumber)
}
func (g *GroupGorm) GetGroupIDsByGroupType(ctx context.Context, groupType int) (groupIDs []string, err error) {
- return groupIDs, utils.Wrap(g.DB.Model(&relation.GroupModel{}).Where("group_type = ? ", groupType).Pluck("group_id", &groupIDs).Error, "")
+ return groupIDs, utils.Wrap(
+ g.DB.Model(&relation.GroupModel{}).Where("group_type = ? ", groupType).Pluck("group_id", &groupIDs).Error,
+ "",
+ )
}
func (g *GroupGorm) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) {
@@ -64,12 +79,22 @@ func (g *GroupGorm) CountTotal(ctx context.Context, before *time.Time) (count in
return count, nil
}
-func (g *GroupGorm) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) {
+func (g *GroupGorm) CountRangeEverydayTotal(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+) (map[string]int64, error) {
var res []struct {
Date time.Time `gorm:"column:date"`
Count int64 `gorm:"column:count"`
}
- err := g.db(ctx).Model(&relation.GroupModel{}).Select("DATE(create_time) AS date, count(1) AS count").Where("create_time >= ? and create_time < ?", start, end).Group("date").Find(&res).Error
+ err := g.db(ctx).
+ Model(&relation.GroupModel{}).
+ Select("DATE(create_time) AS date, count(1) AS count").
+ Where("create_time >= ? and create_time < ?", start, end).
+ Group("date").
+ Find(&res).
+ Error
if err != nil {
return nil, errs.Wrap(err)
}
diff --git a/pkg/common/db/relation/object_model.go b/pkg/common/db/relation/object_model.go
index cfbd011b8..bd2d22c3f 100644
--- a/pkg/common/db/relation/object_model.go
+++ b/pkg/common/db/relation/object_model.go
@@ -2,9 +2,11 @@ package relation
import (
"context"
+
+ "gorm.io/gorm"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
- "gorm.io/gorm"
)
type ObjectInfoGorm struct {
diff --git a/pkg/common/db/s3/cont/controller.go b/pkg/common/db/s3/cont/controller.go
index ba834a739..409f432f9 100644
--- a/pkg/common/db/s3/cont/controller.go
+++ b/pkg/common/db/s3/cont/controller.go
@@ -6,13 +6,15 @@ import (
"encoding/hex"
"errors"
"fmt"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
- "github.com/google/uuid"
"path"
"strings"
"time"
+
+ "github.com/google/uuid"
+
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
)
func New(impl s3.Interface) *Controller {
@@ -56,7 +58,13 @@ func (c *Controller) GetHashObject(ctx context.Context, hash string) (*s3.Object
return c.impl.StatObject(ctx, c.HashPath(hash))
}
-func (c *Controller) InitiateUpload(ctx context.Context, hash string, size int64, expire time.Duration, maxParts int) (*InitiateUploadResult, error) {
+func (c *Controller) InitiateUpload(
+ ctx context.Context,
+ hash string,
+ size int64,
+ expire time.Duration,
+ maxParts int,
+) (*InitiateUploadResult, error) {
defer log.ZDebug(ctx, "return")
if size < 0 {
return nil, errors.New("invalid size")
@@ -239,6 +247,11 @@ func (c *Controller) IsNotFound(err error) bool {
return c.impl.IsNotFound(err)
}
-func (c *Controller) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) {
+func (c *Controller) AccessURL(
+ ctx context.Context,
+ name string,
+ expire time.Duration,
+ opt *s3.AccessURLOption,
+) (string, error) {
return c.impl.AccessURL(ctx, name, expire, opt)
}
diff --git a/pkg/common/db/s3/cont/error.go b/pkg/common/db/s3/cont/error.go
index afd1d0eba..67ed3ec69 100644
--- a/pkg/common/db/s3/cont/error.go
+++ b/pkg/common/db/s3/cont/error.go
@@ -2,6 +2,7 @@ package cont
import (
"fmt"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
)
diff --git a/pkg/common/db/s3/cos/cos.go b/pkg/common/db/s3/cos/cos.go
index 4b1b4aa4d..545f8b934 100644
--- a/pkg/common/db/s3/cos/cos.go
+++ b/pkg/common/db/s3/cos/cos.go
@@ -4,14 +4,16 @@ import (
"context"
"errors"
"fmt"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
- "github.com/tencentyun/cos-go-sdk-v5"
"net/http"
"net/url"
"strconv"
"strings"
"time"
+
+ "github.com/tencentyun/cos-go-sdk-v5"
+
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
)
const (
@@ -70,7 +72,12 @@ func (c *Cos) InitiateMultipartUpload(ctx context.Context, name string) (*s3.Ini
}, nil
}
-func (c *Cos) CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []s3.Part) (*s3.CompleteMultipartUploadResult, error) {
+func (c *Cos) CompleteMultipartUpload(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ parts []s3.Part,
+) (*s3.CompleteMultipartUploadResult, error) {
opts := &cos.CompleteMultipartUploadOptions{
Parts: make([]cos.Object, len(parts)),
}
@@ -109,7 +116,13 @@ func (c *Cos) PartSize(ctx context.Context, size int64) (int64, error) {
return partSize, nil
}
-func (c *Cos) AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*s3.AuthSignResult, error) {
+func (c *Cos) AuthSign(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ expire time.Duration,
+ partNumbers []int,
+) (*s3.AuthSignResult, error) {
result := s3.AuthSignResult{
URL: c.client.BaseURL.BucketURL.String() + "/" + cos.EncodeURIComponent(name),
Query: url.Values{"uploadId": {uploadID}},
@@ -120,7 +133,13 @@ func (c *Cos) AuthSign(ctx context.Context, uploadID string, name string, expire
if err != nil {
return nil, err
}
- cos.AddAuthorizationHeader(c.credential.SecretID, c.credential.SecretKey, c.credential.SessionToken, req, cos.NewAuthTime(expire))
+ cos.AddAuthorizationHeader(
+ c.credential.SecretID,
+ c.credential.SecretKey,
+ c.credential.SessionToken,
+ req,
+ cos.NewAuthTime(expire),
+ )
result.Header = req.Header
for i, partNumber := range partNumbers {
result.Parts[i] = s3.SignPart{
@@ -132,7 +151,15 @@ func (c *Cos) AuthSign(ctx context.Context, uploadID string, name string, expire
}
func (c *Cos) PresignedPutObject(ctx context.Context, name string, expire time.Duration) (string, error) {
- rawURL, err := c.client.Object.GetPresignedURL(ctx, http.MethodPut, name, c.credential.SecretID, c.credential.SecretKey, expire, nil)
+ rawURL, err := c.client.Object.GetPresignedURL(
+ ctx,
+ http.MethodPut,
+ name,
+ c.credential.SecretID,
+ c.credential.SecretKey,
+ expire,
+ nil,
+ )
if err != nil {
return "", err
}
@@ -204,7 +231,13 @@ func (c *Cos) AbortMultipartUpload(ctx context.Context, uploadID string, name st
return err
}
-func (c *Cos) ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*s3.ListUploadedPartsResult, error) {
+func (c *Cos) ListUploadedParts(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ partNumberMarker int,
+ maxParts int,
+) (*s3.ListUploadedPartsResult, error) {
result, _, err := c.client.Object.ListParts(ctx, name, uploadID, &cos.ObjectListPartsOptions{
MaxParts: strconv.Itoa(maxParts),
PartNumberMarker: strconv.Itoa(partNumberMarker),
@@ -231,7 +264,12 @@ func (c *Cos) ListUploadedParts(ctx context.Context, uploadID string, name strin
return res, nil
}
-func (c *Cos) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) {
+func (c *Cos) AccessURL(
+ ctx context.Context,
+ name string,
+ expire time.Duration,
+ opt *s3.AccessURLOption,
+) (string, error) {
//reqParams := make(url.Values)
//if opt != nil {
// if opt.ContentType != "" {
@@ -246,7 +284,15 @@ func (c *Cos) AccessURL(ctx context.Context, name string, expire time.Duration,
} else if expire < time.Second {
expire = time.Second
}
- rawURL, err := c.client.Object.GetPresignedURL(ctx, http.MethodGet, name, c.credential.SecretID, c.credential.SecretKey, expire, nil)
+ rawURL, err := c.client.Object.GetPresignedURL(
+ ctx,
+ http.MethodGet,
+ name,
+ c.credential.SecretID,
+ c.credential.SecretKey,
+ expire,
+ nil,
+ )
if err != nil {
return "", err
}
diff --git a/pkg/common/db/s3/minio/minio.go b/pkg/common/db/s3/minio/minio.go
index 367cbe8a8..84c4348c0 100644
--- a/pkg/common/db/s3/minio/minio.go
+++ b/pkg/common/db/s3/minio/minio.go
@@ -4,16 +4,18 @@ import (
"context"
"errors"
"fmt"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
- "github.com/minio/minio-go/v7"
- "github.com/minio/minio-go/v7/pkg/credentials"
- "github.com/minio/minio-go/v7/pkg/signer"
"net/http"
"net/url"
"strconv"
"strings"
"time"
+
+ "github.com/minio/minio-go/v7"
+ "github.com/minio/minio-go/v7/pkg/credentials"
+ "github.com/minio/minio-go/v7/pkg/signer"
+
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
)
const (
@@ -79,7 +81,12 @@ func (m *Minio) InitiateMultipartUpload(ctx context.Context, name string) (*s3.I
}, nil
}
-func (m *Minio) CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []s3.Part) (*s3.CompleteMultipartUploadResult, error) {
+func (m *Minio) CompleteMultipartUpload(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ parts []s3.Part,
+) (*s3.CompleteMultipartUploadResult, error) {
minioParts := make([]minio.CompletePart, len(parts))
for i, part := range parts {
minioParts[i] = minio.CompletePart{
@@ -116,7 +123,13 @@ func (m *Minio) PartSize(ctx context.Context, size int64) (int64, error) {
return partSize, nil
}
-func (m *Minio) AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*s3.AuthSignResult, error) {
+func (m *Minio) AuthSign(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ expire time.Duration,
+ partNumbers []int,
+) (*s3.AuthSignResult, error) {
creds, err := m.opts.Creds.Get()
if err != nil {
return nil, err
@@ -133,7 +146,14 @@ func (m *Minio) AuthSign(ctx context.Context, uploadID string, name string, expi
return nil, err
}
request.Header.Set("X-Amz-Content-Sha256", unsignedPayload)
- request = signer.SignV4Trailer(*request, creds.AccessKeyID, creds.SecretAccessKey, creds.SessionToken, "us-east-1", nil)
+ request = signer.SignV4Trailer(
+ *request,
+ creds.AccessKeyID,
+ creds.SecretAccessKey,
+ creds.SessionToken,
+ "us-east-1",
+ nil,
+ )
result.Parts[i] = s3.SignPart{
PartNumber: partNumber,
URL: request.URL.String(),
@@ -204,7 +224,13 @@ func (m *Minio) AbortMultipartUpload(ctx context.Context, uploadID string, name
return m.core.AbortMultipartUpload(ctx, m.bucket, name, uploadID)
}
-func (m *Minio) ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*s3.ListUploadedPartsResult, error) {
+func (m *Minio) ListUploadedParts(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ partNumberMarker int,
+ maxParts int,
+) (*s3.ListUploadedPartsResult, error) {
result, err := m.core.ListObjectParts(ctx, m.bucket, name, uploadID, partNumberMarker, maxParts)
if err != nil {
return nil, err
@@ -227,7 +253,12 @@ func (m *Minio) ListUploadedParts(ctx context.Context, uploadID string, name str
return res, nil
}
-func (m *Minio) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) {
+func (m *Minio) AccessURL(
+ ctx context.Context,
+ name string,
+ expire time.Duration,
+ opt *s3.AccessURLOption,
+) (string, error) {
//reqParams := make(url.Values)
//if opt != nil {
// if opt.ContentType != "" {
diff --git a/pkg/common/db/s3/oss/oss.go b/pkg/common/db/s3/oss/oss.go
index f2b50da50..6dd144403 100644
--- a/pkg/common/db/s3/oss/oss.go
+++ b/pkg/common/db/s3/oss/oss.go
@@ -4,14 +4,16 @@ import (
"context"
"errors"
"fmt"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
- "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
- "github.com/aliyun/aliyun-oss-go-sdk/oss"
"net/http"
"net/url"
"strconv"
"strings"
"time"
+
+ "github.com/aliyun/aliyun-oss-go-sdk/oss"
+
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
)
const (
@@ -73,7 +75,12 @@ func (o *OSS) InitiateMultipartUpload(ctx context.Context, name string) (*s3.Ini
}, nil
}
-func (o *OSS) CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []s3.Part) (*s3.CompleteMultipartUploadResult, error) {
+func (o *OSS) CompleteMultipartUpload(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ parts []s3.Part,
+) (*s3.CompleteMultipartUploadResult, error) {
ossParts := make([]oss.UploadPart, len(parts))
for i, part := range parts {
ossParts[i] = oss.UploadPart{
@@ -114,7 +121,13 @@ func (o *OSS) PartSize(ctx context.Context, size int64) (int64, error) {
return partSize, nil
}
-func (o *OSS) AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*s3.AuthSignResult, error) {
+func (o *OSS) AuthSign(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ expire time.Duration,
+ partNumbers []int,
+) (*s3.AuthSignResult, error) {
result := s3.AuthSignResult{
URL: o.bucketURL + name,
Query: url.Values{"uploadId": {uploadID}},
@@ -132,7 +145,15 @@ func (o *OSS) AuthSign(ctx context.Context, uploadID string, name string, expire
}
request.Header.Set(oss.HTTPHeaderHost, request.Host)
request.Header.Set(oss.HTTPHeaderDate, time.Now().UTC().Format(http.TimeFormat))
- authorization := fmt.Sprintf(`OSS %s:%s`, o.credentials.GetAccessKeyID(), o.getSignedStr(request, fmt.Sprintf(`/%s/%s?partNumber=%d&uploadId=%s`, o.bucket.BucketName, name, partNumber, uploadID), o.credentials.GetAccessKeySecret()))
+ authorization := fmt.Sprintf(
+ `OSS %s:%s`,
+ o.credentials.GetAccessKeyID(),
+ o.getSignedStr(
+ request,
+ fmt.Sprintf(`/%s/%s?partNumber=%d&uploadId=%s`, o.bucket.BucketName, name, partNumber, uploadID),
+ o.credentials.GetAccessKeySecret(),
+ ),
+ )
request.Header.Set(oss.HTTPHeaderAuthorization, authorization)
result.Parts[i] = s3.SignPart{
PartNumber: partNumber,
@@ -213,7 +234,13 @@ func (o *OSS) AbortMultipartUpload(ctx context.Context, uploadID string, name st
})
}
-func (o *OSS) ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*s3.ListUploadedPartsResult, error) {
+func (o *OSS) ListUploadedParts(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ partNumberMarker int,
+ maxParts int,
+) (*s3.ListUploadedPartsResult, error) {
result, err := o.bucket.ListUploadedParts(oss.InitiateMultipartUploadResult{
UploadID: uploadID,
Key: name,
@@ -240,7 +267,12 @@ func (o *OSS) ListUploadedParts(ctx context.Context, uploadID string, name strin
return res, nil
}
-func (o *OSS) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) {
+func (o *OSS) AccessURL(
+ ctx context.Context,
+ name string,
+ expire time.Duration,
+ opt *s3.AccessURLOption,
+) (string, error) {
//var opts []oss.Option
//if opt != nil {
// if opt.ContentType != "" {
diff --git a/pkg/common/db/s3/oss/sign.go b/pkg/common/db/s3/oss/sign.go
index 82618d287..1a43effaa 100644
--- a/pkg/common/db/s3/oss/sign.go
+++ b/pkg/common/db/s3/oss/sign.go
@@ -5,12 +5,13 @@ import (
"crypto/sha1"
"crypto/sha256"
"encoding/base64"
- "github.com/aliyun/aliyun-oss-go-sdk/oss"
"hash"
"io"
"net/http"
"sort"
"strings"
+
+ "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func (o *OSS) getAdditionalHeaderKeys(req *http.Request) ([]string, map[string]string) {
@@ -71,7 +72,10 @@ func (o *OSS) getSignedStr(req *http.Request, canonicalizedResource string, keyS
// v2 signature
if o.bucket.Client.Config.AuthVersion == oss.AuthV2 {
- signStr = req.Method + "\n" + contentMd5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedOSSHeaders + strings.Join(additionalList, ";") + "\n" + canonicalizedResource
+ signStr = req.Method + "\n" + contentMd5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedOSSHeaders + strings.Join(
+ additionalList,
+ ";",
+ ) + "\n" + canonicalizedResource
h = hmac.New(func() hash.Hash { return sha256.New() }, []byte(keySecret))
}
_, _ = io.WriteString(h, signStr)
diff --git a/pkg/common/db/s3/s3.go b/pkg/common/db/s3/s3.go
index 4f1571b1e..ded27b3b3 100644
--- a/pkg/common/db/s3/s3.go
+++ b/pkg/common/db/s3/s3.go
@@ -112,10 +112,21 @@ type Interface interface {
PartLimit() *PartLimit
InitiateMultipartUpload(ctx context.Context, name string) (*InitiateMultipartUploadResult, error)
- CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []Part) (*CompleteMultipartUploadResult, error)
+ CompleteMultipartUpload(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ parts []Part,
+ ) (*CompleteMultipartUploadResult, error)
PartSize(ctx context.Context, size int64) (int64, error)
- AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*AuthSignResult, error)
+ AuthSign(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ expire time.Duration,
+ partNumbers []int,
+ ) (*AuthSignResult, error)
PresignedPutObject(ctx context.Context, name string, expire time.Duration) (string, error)
@@ -128,7 +139,13 @@ type Interface interface {
IsNotFound(err error) bool
AbortMultipartUpload(ctx context.Context, uploadID string, name string) error
- ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*ListUploadedPartsResult, error)
+ ListUploadedParts(
+ ctx context.Context,
+ uploadID string,
+ name string,
+ partNumberMarker int,
+ maxParts int,
+ ) (*ListUploadedPartsResult, error)
AccessURL(ctx context.Context, name string, expire time.Duration, opt *AccessURLOption) (string, error)
}
diff --git a/pkg/common/db/table/relation/conversation.go b/pkg/common/db/table/relation/conversation.go
index 6fd260583..e60ae5a70 100644
--- a/pkg/common/db/table/relation/conversation.go
+++ b/pkg/common/db/table/relation/conversation.go
@@ -10,20 +10,20 @@ const (
)
type ConversationModel struct {
- OwnerUserID string `gorm:"column:owner_user_id;primary_key;type:char(128)" json:"OwnerUserID"`
- ConversationID string `gorm:"column:conversation_id;primary_key;type:char(128)" json:"conversationID"`
- ConversationType int32 `gorm:"column:conversation_type" json:"conversationType"`
- UserID string `gorm:"column:user_id;type:char(64)" json:"userID"`
- GroupID string `gorm:"column:group_id;type:char(128)" json:"groupID"`
- RecvMsgOpt int32 `gorm:"column:recv_msg_opt" json:"recvMsgOpt"`
- IsPinned bool `gorm:"column:is_pinned" json:"isPinned"`
- IsPrivateChat bool `gorm:"column:is_private_chat" json:"isPrivateChat"`
- BurnDuration int32 `gorm:"column:burn_duration;default:30" json:"burnDuration"`
- GroupAtType int32 `gorm:"column:group_at_type" json:"groupAtType"`
- AttachedInfo string `gorm:"column:attached_info;type:varchar(1024)" json:"attachedInfo"`
- Ex string `gorm:"column:ex;type:varchar(1024)" json:"ex"`
- MaxSeq int64 `gorm:"column:max_seq" json:"maxSeq"`
- MinSeq int64 `gorm:"column:min_seq" json:"minSeq"`
+ OwnerUserID string `gorm:"column:owner_user_id;primary_key;type:char(128)" json:"OwnerUserID"`
+ ConversationID string `gorm:"column:conversation_id;primary_key;type:char(128)" json:"conversationID"`
+ ConversationType int32 `gorm:"column:conversation_type" json:"conversationType"`
+ UserID string `gorm:"column:user_id;type:char(64)" json:"userID"`
+ GroupID string `gorm:"column:group_id;type:char(128)" json:"groupID"`
+ RecvMsgOpt int32 `gorm:"column:recv_msg_opt" json:"recvMsgOpt"`
+ IsPinned bool `gorm:"column:is_pinned" json:"isPinned"`
+ IsPrivateChat bool `gorm:"column:is_private_chat" json:"isPrivateChat"`
+ BurnDuration int32 `gorm:"column:burn_duration;default:30" json:"burnDuration"`
+ GroupAtType int32 `gorm:"column:group_at_type" json:"groupAtType"`
+ AttachedInfo string `gorm:"column:attached_info;type:varchar(1024)" json:"attachedInfo"`
+ Ex string `gorm:"column:ex;type:varchar(1024)" json:"ex"`
+ MaxSeq int64 `gorm:"column:max_seq" json:"maxSeq"`
+ MinSeq int64 `gorm:"column:min_seq" json:"minSeq"`
CreateTime time.Time `gorm:"column:create_time;index:create_time;autoCreateTime"`
IsMsgDestruct bool `gorm:"column:is_msg_destruct;default:false"`
MsgDestructTime int64 `gorm:"column:msg_destruct_time;default:604800"`
@@ -37,13 +37,26 @@ func (ConversationModel) TableName() string {
type ConversationModelInterface interface {
Create(ctx context.Context, conversations []*ConversationModel) (err error)
Delete(ctx context.Context, groupIDs []string) (err error)
- UpdateByMap(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) (rows int64, err error)
+ UpdateByMap(
+ ctx context.Context,
+ userIDs []string,
+ conversationID string,
+ args map[string]interface{},
+ ) (rows int64, err error)
Update(ctx context.Context, conversation *ConversationModel) (err error)
- Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*ConversationModel, err error)
+ Find(
+ ctx context.Context,
+ ownerUserID string,
+ conversationIDs []string,
+ ) (conversations []*ConversationModel, err error)
FindUserID(ctx context.Context, userIDs []string, conversationIDs []string) ([]string, error)
FindUserIDAllConversationID(ctx context.Context, userID string) ([]string, error)
Take(ctx context.Context, userID, conversationID string) (conversation *ConversationModel, err error)
- FindConversationID(ctx context.Context, userID string, conversationIDs []string) (existConversationID []string, err error)
+ FindConversationID(
+ ctx context.Context,
+ userID string,
+ conversationIDs []string,
+ ) (existConversationID []string, err error)
FindUserIDAllConversations(ctx context.Context, userID string) (conversations []*ConversationModel, err error)
FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error)
GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error)
diff --git a/pkg/common/db/table/unrelation/msg.go b/pkg/common/db/table/unrelation/msg.go
index e34bd374b..103e68c22 100644
--- a/pkg/common/db/table/unrelation/msg.go
+++ b/pkg/common/db/table/unrelation/msg.go
@@ -108,8 +108,23 @@ type MsgDocModelInterface interface {
GetMsgDocModelByIndex(ctx context.Context, conversationID string, index, sort int64) (*MsgDocModel, error)
DeleteMsgsInOneDocByIndex(ctx context.Context, docID string, indexes []int) error
MarkSingleChatMsgsAsRead(ctx context.Context, userID string, docID string, indexes []int64) error
- RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*UserCount, dateCount map[string]int64, err error)
- RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*GroupCount, dateCount map[string]int64, err error)
+ RangeUserSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ group bool,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+ ) (msgCount int64, userCount int64, users []*UserCount, dateCount map[string]int64, err error)
+ RangeGroupSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+ ) (msgCount int64, userCount int64, groups []*GroupCount, dateCount map[string]int64, err error)
}
func (MsgDocModel) TableName() string {
diff --git a/pkg/common/db/unrelation/msg.go b/pkg/common/db/unrelation/msg.go
index 6c6d76216..b7bf42ef4 100644
--- a/pkg/common/db/unrelation/msg.go
+++ b/pkg/common/db/unrelation/msg.go
@@ -555,7 +555,15 @@ func (m *MsgMongoDriver) MarkSingleChatMsgsAsRead(
// }
//
// ])
-func (m *MsgMongoDriver) RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*table.UserCount, dateCount map[string]int64, err error) {
+func (m *MsgMongoDriver) RangeUserSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ group bool,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+) (msgCount int64, userCount int64, users []*table.UserCount, dateCount map[string]int64, err error) {
var sort int
if ase {
sort = 1
@@ -808,7 +816,14 @@ func (m *MsgMongoDriver) RangeUserSendCount(ctx context.Context, start time.Time
return result[0].MsgCount, result[0].UserCount, users, dateCount, nil
}
-func (m *MsgMongoDriver) RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*table.GroupCount, dateCount map[string]int64, err error) {
+func (m *MsgMongoDriver) RangeGroupSendCount(
+ ctx context.Context,
+ start time.Time,
+ end time.Time,
+ ase bool,
+ pageNumber int32,
+ showNumber int32,
+) (msgCount int64, userCount int64, groups []*table.GroupCount, dateCount map[string]int64, err error) {
var sort int
if ase {
sort = 1
diff --git a/pkg/common/log/sql_logger.go b/pkg/common/log/sql_logger.go
index 9e9bb1be6..1622067ba 100644
--- a/pkg/common/log/sql_logger.go
+++ b/pkg/common/log/sql_logger.go
@@ -17,7 +17,11 @@ type SqlLogger struct {
SlowThreshold time.Duration
}
-func NewSqlLogger(logLevel gormLogger.LogLevel, ignoreRecordNotFoundError bool, slowThreshold time.Duration) *SqlLogger {
+func NewSqlLogger(
+ logLevel gormLogger.LogLevel,
+ ignoreRecordNotFoundError bool,
+ slowThreshold time.Duration,
+) *SqlLogger {
return &SqlLogger{
LogLevel: logLevel,
IgnoreRecordNotFoundError: ignoreRecordNotFoundError,
@@ -52,7 +56,17 @@ func (l *SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql s
case err != nil && l.LogLevel >= gormLogger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError):
sql, rows := fc()
if rows == -1 {
- ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql)
+ ZError(
+ ctx,
+ "sql exec detail",
+ err,
+ "gorm",
+ gormUtils.FileWithLineNum(),
+ "elapsed time",
+ fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6),
+ "sql",
+ sql,
+ )
} else {
ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql)
}
@@ -60,14 +74,35 @@ func (l *SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql s
sql, rows := fc()
slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold)
if rows == -1 {
- ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql)
+ ZWarn(
+ ctx,
+ "sql exec detail",
+ nil,
+ "gorm",
+ gormUtils.FileWithLineNum(),
+ "slow sql",
+ slowLog,
+ "elapsed time",
+ fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6),
+ "sql",
+ sql,
+ )
} else {
ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql)
}
case l.LogLevel == gormLogger.Info:
sql, rows := fc()
if rows == -1 {
- ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql)
+ ZDebug(
+ ctx,
+ "sql exec detail",
+ "gorm",
+ gormUtils.FileWithLineNum(),
+ "elapsed time",
+ fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6),
+ "sql",
+ sql,
+ )
} else {
ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql)
}
diff --git a/pkg/discoveryregistry/zookeeper/discover.go b/pkg/discoveryregistry/zookeeper/discover.go
index a9848ee32..3fbb63610 100644
--- a/pkg/discoveryregistry/zookeeper/discover.go
+++ b/pkg/discoveryregistry/zookeeper/discover.go
@@ -6,9 +6,10 @@ import (
"io"
"strings"
+ "github.com/pkg/errors"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
- "github.com/pkg/errors"
"github.com/go-zookeeper/zk"
"google.golang.org/grpc"
@@ -69,7 +70,11 @@ func (s *ZkClient) GetConnsRemote(serviceName string) (conns []resolver.Address,
return conns, nil
}
-func (s *ZkClient) GetConns(ctx context.Context, serviceName string, opts ...grpc.DialOption) ([]grpc.ClientConnInterface, error) {
+func (s *ZkClient) GetConns(
+ ctx context.Context,
+ serviceName string,
+ opts ...grpc.DialOption,
+) ([]grpc.ClientConnInterface, error) {
s.logger.Printf("get conns from client, serviceName: %s", serviceName)
opts = append(s.options, opts...)
s.lock.Lock()
@@ -83,12 +88,26 @@ func (s *ZkClient) GetConns(ctx context.Context, serviceName string, opts ...grp
return nil, err
}
if len(addrs) == 0 {
- return nil, fmt.Errorf("no conn for service %s, grpc server may not exist, local conn is %v, please check zookeeper server %v, path: %s", serviceName, s.localConns, s.zkServers, s.zkRoot)
+ return nil, fmt.Errorf(
+ "no conn for service %s, grpc server may not exist, local conn is %v, please check zookeeper server %v, path: %s",
+ serviceName,
+ s.localConns,
+ s.zkServers,
+ s.zkRoot,
+ )
}
for _, addr := range addrs {
cc, err := grpc.DialContext(ctx, addr.Addr, append(s.options, opts...)...)
if err != nil {
- log.ZError(context.Background(), "dialContext failed", err, "addr", addr.Addr, "opts", append(s.options, opts...))
+ log.ZError(
+ context.Background(),
+ "dialContext failed",
+ err,
+ "addr",
+ addr.Addr,
+ "opts",
+ append(s.options, opts...),
+ )
return nil, errs.Wrap(err)
}
conns = append(conns, cc)
@@ -98,8 +117,15 @@ func (s *ZkClient) GetConns(ctx context.Context, serviceName string, opts ...grp
return conns, nil
}
-func (s *ZkClient) GetConn(ctx context.Context, serviceName string, opts ...grpc.DialOption) (grpc.ClientConnInterface, error) {
- newOpts := append(s.options, grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"LoadBalancingPolicy": "%s"}`, s.balancerName)))
+func (s *ZkClient) GetConn(
+ ctx context.Context,
+ serviceName string,
+ opts ...grpc.DialOption,
+) (grpc.ClientConnInterface, error) {
+ newOpts := append(
+ s.options,
+ grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"LoadBalancingPolicy": "%s"}`, s.balancerName)),
+ )
s.logger.Printf("get conn from client, serviceName: %s", serviceName)
return grpc.DialContext(ctx, fmt.Sprintf("%s:///%s", s.scheme, serviceName), append(newOpts, opts...)...)
}
diff --git a/pkg/proto/msg/msg.pb.go b/pkg/proto/msg/msg.pb.go
index 2686704cc..544483074 100644
--- a/pkg/proto/msg/msg.pb.go
+++ b/pkg/proto/msg/msg.pb.go
@@ -8,14 +8,16 @@ package msg
import (
context "context"
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ reflect "reflect"
+ sync "sync"
+
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
- reflect "reflect"
- sync "sync"
+
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
)
const (
diff --git a/pkg/rpcclient/conversation.go b/pkg/rpcclient/conversation.go
index 617446852..b913d1512 100644
--- a/pkg/rpcclient/conversation.go
+++ b/pkg/rpcclient/conversation.go
@@ -4,11 +4,12 @@ import (
"context"
"fmt"
+ "google.golang.org/grpc"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
- "google.golang.org/grpc"
)
type Conversation struct {
@@ -32,7 +33,10 @@ func NewConversationRpcClient(discov discoveryregistry.SvcDiscoveryRegistry) Con
return ConversationRpcClient(*NewConversation(discov))
}
-func (c *ConversationRpcClient) GetSingleConversationRecvMsgOpt(ctx context.Context, userID, conversationID string) (int32, error) {
+func (c *ConversationRpcClient) GetSingleConversationRecvMsgOpt(
+ ctx context.Context,
+ userID, conversationID string,
+) (int32, error) {
var req pbConversation.GetConversationReq
req.OwnerUserID = userID
req.ConversationID = conversationID
@@ -44,21 +48,51 @@ func (c *ConversationRpcClient) GetSingleConversationRecvMsgOpt(ctx context.Cont
}
func (c *ConversationRpcClient) SingleChatFirstCreateConversation(ctx context.Context, recvID, sendID string) error {
- _, err := c.Client.CreateSingleChatConversations(ctx, &pbConversation.CreateSingleChatConversationsReq{RecvID: recvID, SendID: sendID})
+ _, err := c.Client.CreateSingleChatConversations(
+ ctx,
+ &pbConversation.CreateSingleChatConversationsReq{RecvID: recvID, SendID: sendID},
+ )
return err
}
-func (c *ConversationRpcClient) GroupChatFirstCreateConversation(ctx context.Context, groupID string, userIDs []string) error {
- _, err := c.Client.CreateGroupChatConversations(ctx, &pbConversation.CreateGroupChatConversationsReq{UserIDs: userIDs, GroupID: groupID})
+func (c *ConversationRpcClient) GroupChatFirstCreateConversation(
+ ctx context.Context,
+ groupID string,
+ userIDs []string,
+) error {
+ _, err := c.Client.CreateGroupChatConversations(
+ ctx,
+ &pbConversation.CreateGroupChatConversationsReq{UserIDs: userIDs, GroupID: groupID},
+ )
return err
}
-func (c *ConversationRpcClient) SetConversationMaxSeq(ctx context.Context, ownerUserIDs []string, conversationID string, maxSeq int64) error {
- _, err := c.Client.SetConversationMaxSeq(ctx, &pbConversation.SetConversationMaxSeqReq{OwnerUserID: ownerUserIDs, ConversationID: conversationID, MaxSeq: maxSeq})
+func (c *ConversationRpcClient) SetConversationMaxSeq(
+ ctx context.Context,
+ ownerUserIDs []string,
+ conversationID string,
+ maxSeq int64,
+) error {
+ _, err := c.Client.SetConversationMaxSeq(
+ ctx,
+ &pbConversation.SetConversationMaxSeqReq{
+ OwnerUserID: ownerUserIDs,
+ ConversationID: conversationID,
+ MaxSeq: maxSeq,
+ },
+ )
return err
}
-func (c *ConversationRpcClient) SetConversations(ctx context.Context, userIDs []string, conversation *pbConversation.ConversationReq) error {
- _, err := c.Client.SetConversations(ctx, &pbConversation.SetConversationsReq{UserIDs: userIDs, Conversation: conversation})
+
+func (c *ConversationRpcClient) SetConversations(
+ ctx context.Context,
+ userIDs []string,
+ conversation *pbConversation.ConversationReq,
+) error {
+ _, err := c.Client.SetConversations(
+ ctx,
+ &pbConversation.SetConversationsReq{UserIDs: userIDs, Conversation: conversation},
+ )
return err
}
@@ -70,16 +104,28 @@ func (c *ConversationRpcClient) GetConversationIDs(ctx context.Context, ownerUse
return resp.ConversationIDs, nil
}
-func (c *ConversationRpcClient) GetConversation(ctx context.Context, ownerUserID, conversationID string) (*pbConversation.Conversation, error) {
- resp, err := c.Client.GetConversation(ctx, &pbConversation.GetConversationReq{OwnerUserID: ownerUserID, ConversationID: conversationID})
+func (c *ConversationRpcClient) GetConversation(
+ ctx context.Context,
+ ownerUserID, conversationID string,
+) (*pbConversation.Conversation, error) {
+ resp, err := c.Client.GetConversation(
+ ctx,
+ &pbConversation.GetConversationReq{OwnerUserID: ownerUserID, ConversationID: conversationID},
+ )
if err != nil {
return nil, err
}
return resp.Conversation, nil
}
-func (c *ConversationRpcClient) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*pbConversation.Conversation, error) {
- resp, err := c.Client.GetConversationsByConversationID(ctx, &pbConversation.GetConversationsByConversationIDReq{ConversationIDs: conversationIDs})
+func (c *ConversationRpcClient) GetConversationsByConversationID(
+ ctx context.Context,
+ conversationIDs []string,
+) ([]*pbConversation.Conversation, error) {
+ resp, err := c.Client.GetConversationsByConversationID(
+ ctx,
+ &pbConversation.GetConversationsByConversationIDReq{ConversationIDs: conversationIDs},
+ )
if err != nil {
return nil, err
}
@@ -89,8 +135,15 @@ func (c *ConversationRpcClient) GetConversationsByConversationID(ctx context.Con
return resp.Conversations, nil
}
-func (c *ConversationRpcClient) GetConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*pbConversation.Conversation, error) {
- resp, err := c.Client.GetConversations(ctx, &pbConversation.GetConversationsReq{OwnerUserID: ownerUserID, ConversationIDs: conversationIDs})
+func (c *ConversationRpcClient) GetConversations(
+ ctx context.Context,
+ ownerUserID string,
+ conversationIDs []string,
+) ([]*pbConversation.Conversation, error) {
+ resp, err := c.Client.GetConversations(
+ ctx,
+ &pbConversation.GetConversationsReq{OwnerUserID: ownerUserID, ConversationIDs: conversationIDs},
+ )
if err != nil {
return nil, err
}
diff --git a/pkg/rpcclient/msg.go b/pkg/rpcclient/msg.go
index ca02ecc90..9e7b481cd 100644
--- a/pkg/rpcclient/msg.go
+++ b/pkg/rpcclient/msg.go
@@ -4,6 +4,9 @@ import (
"context"
"encoding/json"
+ "google.golang.org/grpc"
+ "google.golang.org/protobuf/proto"
+
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
@@ -11,8 +14,6 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
- "google.golang.org/grpc"
- "google.golang.org/protobuf/proto"
// "google.golang.org/protobuf/proto"
)
@@ -136,7 +137,10 @@ func (m *MessageRpcClient) GetMaxSeq(ctx context.Context, req *sdkws.GetMaxSeqRe
return resp, err
}
-func (m *MessageRpcClient) PullMessageBySeqList(ctx context.Context, req *sdkws.PullMessageBySeqsReq) (*sdkws.PullMessageBySeqsResp, error) {
+func (m *MessageRpcClient) PullMessageBySeqList(
+ ctx context.Context,
+ req *sdkws.PullMessageBySeqsReq,
+) (*sdkws.PullMessageBySeqsResp, error) {
resp, err := m.Client.PullMessageBySeqs(ctx, req)
return resp, err
}
@@ -158,7 +162,9 @@ type NotificationSender struct {
type NotificationSenderOptions func(*NotificationSender)
-func WithLocalSendMsg(sendMsg func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error)) NotificationSenderOptions {
+func WithLocalSendMsg(
+ sendMsg func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error),
+) NotificationSenderOptions {
return func(s *NotificationSender) {
s.sendMsg = sendMsg
}
@@ -177,7 +183,10 @@ func WithUserRpcClient(userRpcClient *UserRpcClient) NotificationSenderOptions {
}
func NewNotificationSender(opts ...NotificationSenderOptions) *NotificationSender {
- notificationSender := &NotificationSender{contentTypeConf: newContentTypeConf(), sessionTypeConf: newSessionTypeConf()}
+ notificationSender := &NotificationSender{
+ contentTypeConf: newContentTypeConf(),
+ sessionTypeConf: newSessionTypeConf(),
+ }
for _, opt := range opts {
opt(notificationSender)
}
@@ -196,11 +205,29 @@ func WithRpcGetUserName() NotificationOptions {
}
}
-func (s *NotificationSender) NotificationWithSesstionType(ctx context.Context, sendID, recvID string, contentType, sesstionType int32, m proto.Message, opts ...NotificationOptions) (err error) {
+func (s *NotificationSender) NotificationWithSesstionType(
+ ctx context.Context,
+ sendID, recvID string,
+ contentType, sesstionType int32,
+ m proto.Message,
+ opts ...NotificationOptions,
+) (err error) {
n := sdkws.NotificationElem{Detail: utils.StructToJsonString(m)}
content, err := json.Marshal(&n)
if err != nil {
- log.ZError(ctx, "MsgClient Notification json.Marshal failed", err, "sendID", sendID, "recvID", recvID, "contentType", contentType, "msg", m)
+ log.ZError(
+ ctx,
+ "MsgClient Notification json.Marshal failed",
+ err,
+ "sendID",
+ sendID,
+ "recvID",
+ recvID,
+ "contentType",
+ contentType,
+ "msg",
+ m,
+ )
return err
}
notificationOpt := ¬ificationOpt{}
@@ -247,6 +274,12 @@ func (s *NotificationSender) NotificationWithSesstionType(ctx context.Context, s
return err
}
-func (s *NotificationSender) Notification(ctx context.Context, sendID, recvID string, contentType int32, m proto.Message, opts ...NotificationOptions) error {
+func (s *NotificationSender) Notification(
+ ctx context.Context,
+ sendID, recvID string,
+ contentType int32,
+ m proto.Message,
+ opts ...NotificationOptions,
+) error {
return s.NotificationWithSesstionType(ctx, sendID, recvID, contentType, s.sessionTypeConf[contentType], m, opts...)
}
diff --git a/pkg/rpcclient/notification/group.go b/pkg/rpcclient/notification/group.go
index 3efe76802..98af29b03 100644
--- a/pkg/rpcclient/notification/group.go
+++ b/pkg/rpcclient/notification/group.go
@@ -16,11 +16,19 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
)
-func NewGroupNotificationSender(db controller.GroupDatabase, msgRpcClient *rpcclient.MessageRpcClient, userRpcClient *rpcclient.UserRpcClient, fn func(ctx context.Context, userIDs []string) ([]CommonUser, error)) *GroupNotificationSender {
+func NewGroupNotificationSender(
+ db controller.GroupDatabase,
+ msgRpcClient *rpcclient.MessageRpcClient,
+ userRpcClient *rpcclient.UserRpcClient,
+ fn func(ctx context.Context, userIDs []string) ([]CommonUser, error),
+) *GroupNotificationSender {
return &GroupNotificationSender{
- NotificationSender: rpcclient.NewNotificationSender(rpcclient.WithRpcClient(msgRpcClient), rpcclient.WithUserRpcClient(userRpcClient)),
- getUsersInfo: fn,
- db: db,
+ NotificationSender: rpcclient.NewNotificationSender(
+ rpcclient.WithRpcClient(msgRpcClient),
+ rpcclient.WithUserRpcClient(userRpcClient),
+ ),
+ getUsersInfo: fn,
+ db: db,
}
}
@@ -80,7 +88,11 @@ func (g *GroupNotificationSender) getGroupInfo(ctx context.Context, groupID stri
}, nil
}
-func (g *GroupNotificationSender) getGroupMembers(ctx context.Context, groupID string, userIDs []string) ([]*sdkws.GroupMemberFullInfo, error) {
+func (g *GroupNotificationSender) getGroupMembers(
+ ctx context.Context,
+ groupID string,
+ userIDs []string,
+) ([]*sdkws.GroupMemberFullInfo, error) {
members, err := g.db.FindGroupMember(ctx, []string{groupID}, userIDs, nil)
if err != nil {
return nil, err
@@ -95,7 +107,9 @@ func (g *GroupNotificationSender) getGroupMembers(ctx context.Context, groupID s
for _, member := range members {
user, ok := users[member.UserID]
if !ok {
- return nil, errs.ErrUserIDNotFound.Wrap(fmt.Sprintf("group %s member %s not in user", member.GroupID, member.UserID))
+ return nil, errs.ErrUserIDNotFound.Wrap(
+ fmt.Sprintf("group %s member %s not in user", member.GroupID, member.UserID),
+ )
}
if member.Nickname == "" {
member.Nickname = user.Nickname
@@ -117,7 +131,11 @@ func (g *GroupNotificationSender) getGroupMembers(ctx context.Context, groupID s
return res, nil
}
-func (g *GroupNotificationSender) getGroupMemberMap(ctx context.Context, groupID string, userIDs []string) (map[string]*sdkws.GroupMemberFullInfo, error) {
+func (g *GroupNotificationSender) getGroupMemberMap(
+ ctx context.Context,
+ groupID string,
+ userIDs []string,
+) (map[string]*sdkws.GroupMemberFullInfo, error) {
members, err := g.getGroupMembers(ctx, groupID, userIDs)
if err != nil {
return nil, err
@@ -129,7 +147,11 @@ func (g *GroupNotificationSender) getGroupMemberMap(ctx context.Context, groupID
return m, nil
}
-func (g *GroupNotificationSender) getGroupMember(ctx context.Context, groupID string, userID string) (*sdkws.GroupMemberFullInfo, error) {
+func (g *GroupNotificationSender) getGroupMember(
+ ctx context.Context,
+ groupID string,
+ userID string,
+) (*sdkws.GroupMemberFullInfo, error) {
members, err := g.getGroupMembers(ctx, groupID, []string{userID})
if err != nil {
return nil, err
@@ -149,7 +171,11 @@ func (g *GroupNotificationSender) getGroupOwnerAndAdminUserID(ctx context.Contex
return utils.Slice(members, fn), nil
}
-func (g *GroupNotificationSender) groupDB2PB(group *relation.GroupModel, ownerUserID string, memberCount uint32) *sdkws.GroupInfo {
+func (g *GroupNotificationSender) groupDB2PB(
+ group *relation.GroupModel,
+ ownerUserID string,
+ memberCount uint32,
+) *sdkws.GroupInfo {
return &sdkws.GroupInfo{
GroupID: group.GroupID,
GroupName: group.GroupName,
@@ -171,7 +197,10 @@ func (g *GroupNotificationSender) groupDB2PB(group *relation.GroupModel, ownerUs
}
}
-func (g *GroupNotificationSender) groupMemberDB2PB(member *relation.GroupMemberModel, appMangerLevel int32) *sdkws.GroupMemberFullInfo {
+func (g *GroupNotificationSender) groupMemberDB2PB(
+ member *relation.GroupMemberModel,
+ appMangerLevel int32,
+) *sdkws.GroupMemberFullInfo {
return &sdkws.GroupMemberFullInfo{
GroupID: member.GroupID,
UserID: member.UserID,
@@ -188,7 +217,10 @@ func (g *GroupNotificationSender) groupMemberDB2PB(member *relation.GroupMemberM
}
}
-func (g *GroupNotificationSender) getUsersInfoMap(ctx context.Context, userIDs []string) (map[string]*sdkws.UserInfo, error) {
+func (g *GroupNotificationSender) getUsersInfoMap(
+ ctx context.Context,
+ userIDs []string,
+) (map[string]*sdkws.UserInfo, error) {
users, err := g.getUsersInfo(ctx, userIDs)
if err != nil {
return nil, err
@@ -200,7 +232,11 @@ func (g *GroupNotificationSender) getUsersInfoMap(ctx context.Context, userIDs [
return result, nil
}
-func (g *GroupNotificationSender) fillOpUser(ctx context.Context, opUser **sdkws.GroupMemberFullInfo, groupID string) error {
+func (g *GroupNotificationSender) fillOpUser(
+ ctx context.Context,
+ opUser **sdkws.GroupMemberFullInfo,
+ groupID string,
+) error {
if opUser == nil {
return errs.ErrInternalServer.Wrap("**sdkws.GroupMemberFullInfo is nil")
}
@@ -239,35 +275,70 @@ func (g *GroupNotificationSender) fillOpUser(ctx context.Context, opUser **sdkws
return nil
}
-func (g *GroupNotificationSender) GroupCreatedNotification(ctx context.Context, tips *sdkws.GroupCreatedTips) (err error) {
+func (g *GroupNotificationSender) GroupCreatedNotification(
+ ctx context.Context,
+ tips *sdkws.GroupCreatedTips,
+) (err error) {
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupCreatedNotification, tips)
}
-func (g *GroupNotificationSender) GroupInfoSetNotification(ctx context.Context, tips *sdkws.GroupInfoSetTips) (err error) {
+func (g *GroupNotificationSender) GroupInfoSetNotification(
+ ctx context.Context,
+ tips *sdkws.GroupInfoSetTips,
+) (err error) {
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNotification, tips, rpcclient.WithRpcGetUserName())
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ tips.Group.GroupID,
+ constant.GroupInfoSetNotification,
+ tips,
+ rpcclient.WithRpcGetUserName(),
+ )
}
-func (g *GroupNotificationSender) GroupInfoSetNameNotification(ctx context.Context, tips *sdkws.GroupInfoSetNameTips) (err error) {
+func (g *GroupNotificationSender) GroupInfoSetNameNotification(
+ ctx context.Context,
+ tips *sdkws.GroupInfoSetNameTips,
+) (err error) {
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNameNotification, tips)
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ tips.Group.GroupID,
+ constant.GroupInfoSetNameNotification,
+ tips,
+ )
}
-func (g *GroupNotificationSender) GroupInfoSetAnnouncementNotification(ctx context.Context, tips *sdkws.GroupInfoSetAnnouncementTips) (err error) {
+func (g *GroupNotificationSender) GroupInfoSetAnnouncementNotification(
+ ctx context.Context,
+ tips *sdkws.GroupInfoSetAnnouncementTips,
+) (err error) {
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetAnnouncementNotification, tips, rpcclient.WithRpcGetUserName())
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ tips.Group.GroupID,
+ constant.GroupInfoSetAnnouncementNotification,
+ tips,
+ rpcclient.WithRpcGetUserName(),
+ )
}
-func (g *GroupNotificationSender) JoinGroupApplicationNotification(ctx context.Context, req *pbGroup.JoinGroupReq) (err error) {
+func (g *GroupNotificationSender) JoinGroupApplicationNotification(
+ ctx context.Context,
+ req *pbGroup.JoinGroupReq,
+) (err error) {
group, err := g.getGroupInfo(ctx, req.GroupID)
if err != nil {
return err
@@ -291,7 +362,10 @@ func (g *GroupNotificationSender) JoinGroupApplicationNotification(ctx context.C
return nil
}
-func (g *GroupNotificationSender) MemberQuitNotification(ctx context.Context, member *sdkws.GroupMemberFullInfo) (err error) {
+func (g *GroupNotificationSender) MemberQuitNotification(
+ ctx context.Context,
+ member *sdkws.GroupMemberFullInfo,
+) (err error) {
defer log.ZDebug(ctx, "return")
defer func() {
if err != nil {
@@ -306,7 +380,10 @@ func (g *GroupNotificationSender) MemberQuitNotification(ctx context.Context, me
return g.Notification(ctx, mcontext.GetOpUserID(ctx), member.GroupID, constant.MemberQuitNotification, tips)
}
-func (g *GroupNotificationSender) GroupApplicationAcceptedNotification(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (err error) {
+func (g *GroupNotificationSender) GroupApplicationAcceptedNotification(
+ ctx context.Context,
+ req *pbGroup.GroupApplicationResponseReq,
+) (err error) {
defer log.ZDebug(ctx, "return")
defer func() {
if err != nil {
@@ -326,7 +403,13 @@ func (g *GroupNotificationSender) GroupApplicationAcceptedNotification(ctx conte
return err
}
for _, userID := range append(userIDs, mcontext.GetOpUserID(ctx)) {
- err = g.Notification(ctx, mcontext.GetOpUserID(ctx), userID, constant.GroupApplicationAcceptedNotification, tips)
+ err = g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ userID,
+ constant.GroupApplicationAcceptedNotification,
+ tips,
+ )
if err != nil {
log.ZError(ctx, "failed", err)
}
@@ -334,7 +417,10 @@ func (g *GroupNotificationSender) GroupApplicationAcceptedNotification(ctx conte
return nil
}
-func (g *GroupNotificationSender) GroupApplicationRejectedNotification(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (err error) {
+func (g *GroupNotificationSender) GroupApplicationRejectedNotification(
+ ctx context.Context,
+ req *pbGroup.GroupApplicationResponseReq,
+) (err error) {
group, err := g.getGroupInfo(ctx, req.GroupID)
if err != nil {
return err
@@ -348,7 +434,13 @@ func (g *GroupNotificationSender) GroupApplicationRejectedNotification(ctx conte
return err
}
for _, userID := range append(userIDs, mcontext.GetOpUserID(ctx)) {
- err = g.Notification(ctx, mcontext.GetOpUserID(ctx), userID, constant.GroupApplicationRejectedNotification, tips)
+ err = g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ userID,
+ constant.GroupApplicationRejectedNotification,
+ tips,
+ )
if err != nil {
log.ZError(ctx, "failed", err)
}
@@ -356,7 +448,10 @@ func (g *GroupNotificationSender) GroupApplicationRejectedNotification(ctx conte
return nil
}
-func (g *GroupNotificationSender) GroupOwnerTransferredNotification(ctx context.Context, req *pbGroup.TransferGroupOwnerReq) (err error) {
+func (g *GroupNotificationSender) GroupOwnerTransferredNotification(
+ ctx context.Context,
+ req *pbGroup.TransferGroupOwnerReq,
+) (err error) {
group, err := g.getGroupInfo(ctx, req.GroupID)
if err != nil {
return err
@@ -366,21 +461,38 @@ func (g *GroupNotificationSender) GroupOwnerTransferredNotification(ctx context.
if err != nil {
return err
}
- tips := &sdkws.GroupOwnerTransferredTips{Group: group, OpUser: member[opUserID], NewGroupOwner: member[req.NewOwnerUserID]}
+ tips := &sdkws.GroupOwnerTransferredTips{
+ Group: group,
+ OpUser: member[opUserID],
+ NewGroupOwner: member[req.NewOwnerUserID],
+ }
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupOwnerTransferredNotification, tips)
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ group.GroupID,
+ constant.GroupOwnerTransferredNotification,
+ tips,
+ )
}
-func (g *GroupNotificationSender) MemberKickedNotification(ctx context.Context, tips *sdkws.MemberKickedTips) (err error) {
+func (g *GroupNotificationSender) MemberKickedNotification(
+ ctx context.Context,
+ tips *sdkws.MemberKickedTips,
+) (err error) {
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.MemberKickedNotification, tips)
}
-func (g *GroupNotificationSender) MemberInvitedNotification(ctx context.Context, groupID, reason string, invitedUserIDList []string) (err error) {
+func (g *GroupNotificationSender) MemberInvitedNotification(
+ ctx context.Context,
+ groupID, reason string,
+ invitedUserIDList []string,
+) (err error) {
group, err := g.getGroupInfo(ctx, groupID)
if err != nil {
return err
@@ -399,7 +511,10 @@ func (g *GroupNotificationSender) MemberInvitedNotification(ctx context.Context,
return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.MemberInvitedNotification, tips)
}
-func (g *GroupNotificationSender) MemberEnterNotification(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (err error) {
+func (g *GroupNotificationSender) MemberEnterNotification(
+ ctx context.Context,
+ req *pbGroup.GroupApplicationResponseReq,
+) (err error) {
group, err := g.getGroupInfo(ctx, req.GroupID)
if err != nil {
return err
@@ -412,14 +527,21 @@ func (g *GroupNotificationSender) MemberEnterNotification(ctx context.Context, r
return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.MemberEnterNotification, tips)
}
-func (g *GroupNotificationSender) GroupDismissedNotification(ctx context.Context, tips *sdkws.GroupDismissedTips) (err error) {
+func (g *GroupNotificationSender) GroupDismissedNotification(
+ ctx context.Context,
+ tips *sdkws.GroupDismissedTips,
+) (err error) {
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupDismissedNotification, tips)
}
-func (g *GroupNotificationSender) GroupMemberMutedNotification(ctx context.Context, groupID, groupMemberUserID string, mutedSeconds uint32) (err error) {
+func (g *GroupNotificationSender) GroupMemberMutedNotification(
+ ctx context.Context,
+ groupID, groupMemberUserID string,
+ mutedSeconds uint32,
+) (err error) {
group, err := g.getGroupInfo(ctx, groupID)
if err != nil {
return err
@@ -436,7 +558,10 @@ func (g *GroupNotificationSender) GroupMemberMutedNotification(ctx context.Conte
return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberMutedNotification, tips)
}
-func (g *GroupNotificationSender) GroupMemberCancelMutedNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) {
+func (g *GroupNotificationSender) GroupMemberCancelMutedNotification(
+ ctx context.Context,
+ groupID, groupMemberUserID string,
+) (err error) {
group, err := g.getGroupInfo(ctx, groupID)
if err != nil {
return err
@@ -445,11 +570,21 @@ func (g *GroupNotificationSender) GroupMemberCancelMutedNotification(ctx context
if err != nil {
return err
}
- tips := &sdkws.GroupMemberCancelMutedTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], MutedUser: user[groupMemberUserID]}
+ tips := &sdkws.GroupMemberCancelMutedTips{
+ Group: group,
+ OpUser: user[mcontext.GetOpUserID(ctx)],
+ MutedUser: user[groupMemberUserID],
+ }
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberCancelMutedNotification, tips)
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ group.GroupID,
+ constant.GroupMemberCancelMutedNotification,
+ tips,
+ )
}
func (g *GroupNotificationSender) GroupMutedNotification(ctx context.Context, groupID string) (err error) {
@@ -490,7 +625,10 @@ func (g *GroupNotificationSender) GroupCancelMutedNotification(ctx context.Conte
return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupCancelMutedNotification, tips)
}
-func (g *GroupNotificationSender) GroupMemberInfoSetNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) {
+func (g *GroupNotificationSender) GroupMemberInfoSetNotification(
+ ctx context.Context,
+ groupID, groupMemberUserID string,
+) (err error) {
group, err := g.getGroupInfo(ctx, groupID)
if err != nil {
return err
@@ -499,14 +637,21 @@ func (g *GroupNotificationSender) GroupMemberInfoSetNotification(ctx context.Con
if err != nil {
return err
}
- tips := &sdkws.GroupMemberInfoSetTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], ChangedUser: user[groupMemberUserID]}
+ tips := &sdkws.GroupMemberInfoSetTips{
+ Group: group,
+ OpUser: user[mcontext.GetOpUserID(ctx)],
+ ChangedUser: user[groupMemberUserID],
+ }
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberInfoSetNotification, tips)
}
-func (g *GroupNotificationSender) GroupMemberSetToAdminNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) {
+func (g *GroupNotificationSender) GroupMemberSetToAdminNotification(
+ ctx context.Context,
+ groupID, groupMemberUserID string,
+) (err error) {
group, err := g.getGroupInfo(ctx, groupID)
if err != nil {
return err
@@ -515,14 +660,27 @@ func (g *GroupNotificationSender) GroupMemberSetToAdminNotification(ctx context.
if err != nil {
return err
}
- tips := &sdkws.GroupMemberInfoSetTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], ChangedUser: user[groupMemberUserID]}
+ tips := &sdkws.GroupMemberInfoSetTips{
+ Group: group,
+ OpUser: user[mcontext.GetOpUserID(ctx)],
+ ChangedUser: user[groupMemberUserID],
+ }
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberSetToAdminNotification, tips)
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ group.GroupID,
+ constant.GroupMemberSetToAdminNotification,
+ tips,
+ )
}
-func (g *GroupNotificationSender) GroupMemberSetToOrdinaryUserNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) {
+func (g *GroupNotificationSender) GroupMemberSetToOrdinaryUserNotification(
+ ctx context.Context,
+ groupID, groupMemberUserID string,
+) (err error) {
group, err := g.getGroupInfo(ctx, groupID)
if err != nil {
return err
@@ -531,14 +689,28 @@ func (g *GroupNotificationSender) GroupMemberSetToOrdinaryUserNotification(ctx c
if err != nil {
return err
}
- tips := &sdkws.GroupMemberInfoSetTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], ChangedUser: user[groupMemberUserID]}
+ tips := &sdkws.GroupMemberInfoSetTips{
+ Group: group,
+ OpUser: user[mcontext.GetOpUserID(ctx)],
+ ChangedUser: user[groupMemberUserID],
+ }
if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil {
return err
}
- return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberSetToOrdinaryUserNotification, tips)
+ return g.Notification(
+ ctx,
+ mcontext.GetOpUserID(ctx),
+ group.GroupID,
+ constant.GroupMemberSetToOrdinaryUserNotification,
+ tips,
+ )
}
-func (g *GroupNotificationSender) MemberEnterDirectlyNotification(ctx context.Context, groupID string, entrantUserID string) (err error) {
+func (g *GroupNotificationSender) MemberEnterDirectlyNotification(
+ ctx context.Context,
+ groupID string,
+ entrantUserID string,
+) (err error) {
defer log.ZDebug(ctx, "return")
defer func() {
if err != nil {
diff --git a/pkg/rpcclient/notification/msg.go b/pkg/rpcclient/notification/msg.go
index 97724f727..8cd7b019e 100644
--- a/pkg/rpcclient/notification/msg.go
+++ b/pkg/rpcclient/notification/msg.go
@@ -16,7 +16,11 @@ func NewMsgNotificationSender(opts ...rpcclient.NotificationSenderOptions) *MsgN
return &MsgNotificationSender{rpcclient.NewNotificationSender(opts...)}
}
-func (m *MsgNotificationSender) UserDeleteMsgsNotification(ctx context.Context, userID, conversationID string, seqs []int64) error {
+func (m *MsgNotificationSender) UserDeleteMsgsNotification(
+ ctx context.Context,
+ userID, conversationID string,
+ seqs []int64,
+) error {
tips := sdkws.DeleteMsgsTips{
UserID: userID,
ConversationID: conversationID,
@@ -25,7 +29,14 @@ func (m *MsgNotificationSender) UserDeleteMsgsNotification(ctx context.Context,
return m.Notification(ctx, userID, userID, constant.MsgDeleteNotification, &tips)
}
-func (m *MsgNotificationSender) MarkAsReadNotification(ctx context.Context, conversationID string, sesstionType int32, sendID, recvID string, seqs []int64, hasReadSeq int64) error {
+func (m *MsgNotificationSender) MarkAsReadNotification(
+ ctx context.Context,
+ conversationID string,
+ sesstionType int32,
+ sendID, recvID string,
+ seqs []int64,
+ hasReadSeq int64,
+) error {
tips := &sdkws.MarkAsReadTips{
MarkAsReadUserID: sendID,
ConversationID: conversationID,
diff --git a/scripts/build_all_service.sh b/scripts/build_all_service.sh
index 7cb290ea6..3fd56b420 100755
--- a/scripts/build_all_service.sh
+++ b/scripts/build_all_service.sh
@@ -35,8 +35,8 @@ echo -e "${BOLD_PREFIX}_________________________________________________________
bin_dir="$BIN_DIR"
-logs_dir="../logs"
-sdk_db_dir="../db/sdk/"
+logs_dir="$OPENIM_ROOT/logs"
+sdk_db_dir="$OPENIM_ROOT/db/sdk/"
# Automatically created when there is no bin, logs folder
if [ ! -d $bin_dir ]; then
mkdir -p $bin_dir
diff --git a/scripts/enterprise/check_all.sh b/scripts/enterprise/check_all.sh
index 973a6a962..271dfb452 100755
--- a/scripts/enterprise/check_all.sh
+++ b/scripts/enterprise/check_all.sh
@@ -43,7 +43,7 @@ for i in ${service_port_name[*]}; do
port=$(ss -tunlp| grep openim | awk '{print $5}' | grep -w ${j} | awk -F '[:]' '{print $NF}')
if [[ ${port} -ne ${j} ]]; then
echo -e ${BACKGROUND_GREEN}${i}${COLOR_SUFFIX}${RED_PREFIX}" service does not start normally,not initiated port is "${COLOR_SUFFIX}${BACKGROUND_GREEN}${j}${COLOR_SUFFIX}
- echo -e ${RED_PREFIX}"please check $OPENIM_ROOT/logs/openIM.log "${COLOR_SUFFIX}
+ echo -e ${RED_PREFIX}"please check $OPENIM_ROOT/logs/openIM.log"${COLOR_SUFFIX}
exit -1
else
echo -e ${j}${GREEN_PREFIX}" port has been listening,belongs service is "${i}${COLOR_SUFFIX}
diff --git a/scripts/githooks/pre-commit b/scripts/githooks/pre-commit
index c14d1a967..cad60e163 100644
--- a/scripts/githooks/pre-commit
+++ b/scripts/githooks/pre-commit
@@ -26,7 +26,7 @@
LC_ALL=C
local_branch="$(git rev-parse --abbrev-ref HEAD)"
-valid_branch_regex="^(main|master|develop|release)$|(feature|feat|openim|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$"
+valid_branch_regex="^(main|master|develop|release(-[a-zA-Z0-9._-]+)?)$|(feature|feat|openim|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$"
YELLOW="\e[93m"
GREEN="\e[32m"
diff --git a/scripts/githooks/pre-push b/scripts/githooks/pre-push
index 2ed9736be..2985313b7 100644
--- a/scripts/githooks/pre-push
+++ b/scripts/githooks/pre-push
@@ -21,6 +21,9 @@ GREEN="\e[32m"
RED="\e[31m"
ENDCOLOR="\e[0m"
+local_branch="$(git rev-parse --abbrev-ref HEAD)"
+valid_branch_regex="^(main|master|develop|release(-[a-zA-Z0-9._-]+)?)$|(feature|feat|openim|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$"
+
printMessage() {
printf "${YELLOW}OpenIM : $1${ENDCOLOR}\n"
}
@@ -96,6 +99,14 @@ print_color "Added Files: ${added_files}" "${BACKGROUND_GREEN}"
print_color "Modified Files: ${modified_files}" "${BACKGROUND_GREEN}"
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."
+ printError "For more on this, read on: https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694"
+ exit 1
+fi
+
#
#printMessage "Running the Flutter analyzer"
#flutter analyze
diff --git a/scripts/msg_gateway_start.sh b/scripts/msg_gateway_start.sh
index f99ce9017..70267c85b 100755
--- a/scripts/msg_gateway_start.sh
+++ b/scripts/msg_gateway_start.sh
@@ -61,7 +61,7 @@ sleep 1
cd ${msg_gateway_binary_root}
for ((i = 0; i < ${#ws_ports[@]}; i++)); do
echo "==========================start msg_gateway server===========================">>$OPENIM_ROOT/logs/openIM.log
- nohup ./${openim_msggateway} --port ${rpc_ports[$i]} --ws_port ${ws_ports[$i]} --prometheus_port ${prome_ports[$i]} --config_folder_path ${configfile_path} >>$OPENIM_ROOT/logs/openIM.log 2>&1 &
+ nohup ./${openim_msggateway} --port ${rpc_ports[$i]} --ws_port ${ws_ports[$i]} --prometheus_port ${prome_ports[$i]} --config_folder_path ${configfile_path} --configFolderPath ${log_path} >>$OPENIM_ROOT/logs/openIM.log 2>&1 &
done
#Check launched service process
diff --git a/scripts/msg_transfer_start.sh b/scripts/msg_transfer_start.sh
index a4dcf1fe7..cfc0efd30 100755
--- a/scripts/msg_transfer_start.sh
+++ b/scripts/msg_transfer_start.sh
@@ -55,9 +55,9 @@ sleep 1
cd ${msg_transfer_binary_root}
for ((i = 0; i < ${msg_transfer_service_num}; i++)); do
prome_port=${prome_ports[$i]}
- cmd="nohup ./${openim_msgtransfer} --config_folder_path ${configfile_path}"
+ cmd="nohup ./${openim_msgtransfer} --config_folder_path ${configfile_path} --configFolderPath ${log_path}"
if [ $prome_port != "" ]; then
- cmd="$cmd --prometheus_port $prome_port --config_folder_path ${configfile_path}"
+ cmd="$cmd --prometheus_port $prome_port --config_folder_path ${configfile_path} --configFolderPath ${log_path}"
fi
echo "==========================start msg_transfer server===========================">>$OPENIM_ROOT/logs/openIM.log
$cmd >>$OPENIM_ROOT/logs/openIM.log 2>&1 &
diff --git a/scripts/path_info.sh b/scripts/path_info.sh
index 5d2832efc..d3f6f4e1c 100755
--- a/scripts/path_info.sh
+++ b/scripts/path_info.sh
@@ -82,6 +82,7 @@ cmd_utils_source_root="$OPENIM_ROOT/cmd/openim-cmdutils/"
# Global configuration file default dir
config_path="$OPENIM_ROOT/config/config.yaml"
configfile_path="$OPENIM_ROOT/config"
+log_path="$OPENIM_ROOT/log"
# servicefile dir path
service_source_root=(
diff --git a/scripts/start_all.sh b/scripts/start_all.sh
index 3554b7d14..244428539 100755
--- a/scripts/start_all.sh
+++ b/scripts/start_all.sh
@@ -35,6 +35,18 @@ bin_dir="$BIN_DIR"
logs_dir="$OPENIM_ROOT/logs"
sdk_db_dir="$OPENIM_ROOT/sdk/db/"
+if [ ! -d "$bin_dir" ]; then
+ mkdir -p "$bin_dir"
+fi
+
+if [ ! -d "$logs_dir" ]; then
+ mkdir -p "$logs_dir"
+fi
+
+if [ ! -d "$sdk_db_dir" ]; then
+ mkdir -p "$sdk_db_dir"
+fi
+
# Print title
echo -e "${BOLD_PREFIX}${BLUE_PREFIX}================> OpenIM Server Start${COLOR_SUFFIX}"
diff --git a/scripts/start_rpc_service.sh b/scripts/start_rpc_service.sh
index 436ffc690..09b7f69c5 100755
--- a/scripts/start_rpc_service.sh
+++ b/scripts/start_rpc_service.sh
@@ -100,9 +100,9 @@ for ((i = 0; i < ${#service_filename[*]}; i++)); do
for ((j = 0; j < ${#service_ports[*]}; j++)); do
#Start the service in the background
if [ -z "${prome_ports[$j]}" ]; then
- cmd="./${service_filename[$i]} --port ${service_ports[$j]} --config_folder_path ${configfile_path}"
+ cmd="./${service_filename[$i]} --port ${service_ports[$j]} --config_folder_path ${configfile_path} --configFolderPath ${log_path}"
else
- cmd="./${service_filename[$i]} --port ${service_ports[$j]} --prometheus_port ${prome_ports[$j]} --config_folder_path ${configfile_path}"
+ cmd="./${service_filename[$i]} --port ${service_ports[$j]} --prometheus_port ${prome_ports[$j]} --config_folder_path ${configfile_path} --configFolderPath ${log_path}"
fi
if [ $i -eq 0 -o $i -eq 1 ]; then
cmd="./${service_filename[$i]} --port ${service_ports[$j]}"
From 058e2eee32e744d60a7a26e433ba9d9d76df28c9 Mon Sep 17 00:00:00 2001
From: pluto <83957921+plutoyty@users.noreply.github.com>
Date: Thu, 13 Jul 2023 12:26:09 +0800
Subject: [PATCH 6/9] add MongoDB,Redis,Kafka retry mechanism (#518)
---
.gitignore | 1 +
config/config.yaml | 61 ++++++++++++++++----------
pkg/common/db/cache/init_redis.go | 31 ++++++++-----
pkg/common/db/cache/init_redis_test.go | 36 +++++++++++++++
pkg/common/db/unrelation/mongo.go | 41 +++++++++++------
pkg/common/http/http_client.go | 21 ++++++---
pkg/common/kafka/producer.go | 26 ++++++++++-
pkg/common/mw/gin.go | 9 ++--
8 files changed, 167 insertions(+), 59 deletions(-)
create mode 100644 pkg/common/db/cache/init_redis_test.go
diff --git a/.gitignore b/.gitignore
index bac199fc2..d8c6b0286 100644
--- a/.gitignore
+++ b/.gitignore
@@ -391,3 +391,4 @@ Sessionx.vim
[._]*.un~
# End of https://www.toptal.com/developers/gitignore/api/go,git,vim,tags,test,emacs,backup,jetbrains
+.idea
\ No newline at end of file
diff --git a/config/config.yaml b/config/config.yaml
index 5170e9a83..2bea593ba 100644
--- a/config/config.yaml
+++ b/config/config.yaml
@@ -36,7 +36,7 @@ mysql:
mongo:
uri: #不为空则直接使用该值
address: [ 127.0.0.1:37017 ] #单机时为mongo地址,使用分片集群时,为mongos地址
- database: openIM_v3 #mongo db 默认即可
+ database: openIM_v3 #mongo db 默认即可
username: root #用户名
password: openIM123 #密码
maxPoolSize: 100
@@ -56,11 +56,14 @@ kafka:
topic: "offlineMsgToMongoMysql" #不建议修改
msgToPush:
topic: "msgToPush" #不建议修改
+ msgToModify:
+ topic: "msgToModify" #不建议修改
consumerGroupID: #消费者组,不建议修改
msgToRedis: redis #
msgToMongo: mongo #
msgToMySql: mysql #
msgToPush: push #
+ msgToModify: modify #
rpc:
@@ -73,26 +76,41 @@ api:
listenIP: #默认为0.0.0.0
object:
- enable: "minio" #使用minio
- apiURL: "http://127.0.0.1:10002/object/"
+ enable: minio #使用minio
+ apiURL: http://127.0.0.1:10002/third/object
minio:
- bucket: "openim" #不建议修改
- endpoint: "http://127.0.0.1:10005" #minio对外服务的ip和端口,app要能访问此ip和端口
- accessKeyID: "root" #ID
- secretAccessKey: "openIM123" #秘钥
- sessionToken: "" #token
- cos: #tencent cos
- bucketURL: "https://temp-1252357374.cos.ap-chengdu.myqcloud.com"
- secretID: ""
- secretKey: ""
- sessionToken: ""
- oss: #ali oss
- endpoint: "https://oss-cn-chengdu.aliyuncs.com"
- bucket: "demo-9999999"
- bucketURL: "https://demo-9999999.oss-cn-chengdu.aliyuncs.com"
- accessKeyID: ""
- accessKeySecret: ""
- sessionToken: ""
+ tempBucket: "openim" #不建议修改
+ dataBucket: "openim" #不建议修改
+ location: us-east-1 #不建议修改
+ endpoint: http://127.0.0.1:10005 #minio对外服务的ip和端口,app要能访问此ip和端口
+ accessKeyID: root #ID
+ secretAccessKey: openIM123 #秘钥
+ isDistributedMod: false #是否分布式多硬盘部署,如果是多硬盘部署,需要修改为true
+ tencent: #tencent cos
+ appID:
+ region:
+ bucket:
+ secretID:
+ secretKey:
+ ali: #ali oss
+ regionID:
+ accessKeyID:
+ accessKeySecret:
+ stsEndpoint:
+ ossEndpoint:
+ bucket:
+ finalHost:
+ stsDurationSeconds:
+ OssRoleArn:
+ aws:
+ accessKeyID:
+ accessKeySecret:
+ region:
+ bucket:
+ finalHost:
+ roleArn:
+ externalId:
+ roleSessionName:
rpcPort: #rpc服务端口,不建议修改,端口由脚本读取后传入程序,如启动多个程序,只需要填入多个端口,用逗号隔开,如 [10110, 10111]
openImUserPort: [ 10110 ]
@@ -164,8 +182,7 @@ groupMessageHasReadReceiptEnable: true #群聊已读是否开
singleMessageHasReadReceiptEnable: true #单聊已读是否开启
retainChatRecords: 365 #mongo保存离线消息时间(天)
-chatRecordsClearTime: "0 2 * * 3" #每周三凌晨2点清理mongo中的过期(超过retainChatRecords时间)消息,这个删除是为了清理满足上个配置retainChatRecords的过期消息,不会发送通知,仅仅作为清理磁盘使用
-msgDestructTime: "0 2 * * *" #消息自动删除时间,每天凌晨2点删除过期消息,这个删除是为了删除保留时间超过超过会话字段msg_destruct_time(秒)的消息。
+chatRecordsClearTime: "0 2 * * 3" #每周三凌晨2点清理mongo中的过期(超过retainChatRecords时间)消息
secret: tuoyun #秘钥,获取token时校验
diff --git a/pkg/common/db/cache/init_redis.go b/pkg/common/db/cache/init_redis.go
index 72dfc8caf..be0431adf 100644
--- a/pkg/common/db/cache/init_redis.go
+++ b/pkg/common/db/cache/init_redis.go
@@ -27,6 +27,11 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
)
+const (
+ maxRetry = 10 //number of retries
+)
+
+// NewRedis Initialize redis connection
func NewRedis() (redis.UniversalClient, error) {
if len(config.Config.Redis.Address) == 0 {
return nil, errors.New("redis address is empty")
@@ -35,25 +40,29 @@ func NewRedis() (redis.UniversalClient, error) {
var rdb redis.UniversalClient
if len(config.Config.Redis.Address) > 1 {
rdb = redis.NewClusterClient(&redis.ClusterOptions{
- Addrs: config.Config.Redis.Address,
- Username: config.Config.Redis.Username,
- Password: config.Config.Redis.Password, // no password set
- PoolSize: 50,
+ Addrs: config.Config.Redis.Address,
+ Username: config.Config.Redis.Username,
+ Password: config.Config.Redis.Password, // no password set
+ PoolSize: 50,
+ MaxRetries: maxRetry,
})
} else {
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, // 连接池大小
+ 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
+ MaxRetries: maxRetry,
})
}
+
+ var err error = nil
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
- err := rdb.Ping(ctx).Err()
+ err = rdb.Ping(ctx).Err()
if err != nil {
return nil, fmt.Errorf("redis ping %w", err)
}
- return rdb, nil
+ return rdb, err
}
diff --git a/pkg/common/db/cache/init_redis_test.go b/pkg/common/db/cache/init_redis_test.go
new file mode 100644
index 000000000..7bf1a4a7d
--- /dev/null
+++ b/pkg/common/db/cache/init_redis_test.go
@@ -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.
+
+package cache
+
+import (
+ "fmt"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
+ "testing"
+)
+
+//TestNewRedis Test redis connection
+func TestNewRedis(t *testing.T) {
+ err := config.InitConfig("config_folder_path")
+ if err != nil {
+ fmt.Println("config load error")
+ return
+ }
+ redis, err := NewRedis()
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(redis)
+}
diff --git a/pkg/common/db/unrelation/mongo.go b/pkg/common/db/unrelation/mongo.go
index fd13bb2aa..b2a99891e 100644
--- a/pkg/common/db/unrelation/mongo.go
+++ b/pkg/common/db/unrelation/mongo.go
@@ -31,19 +31,21 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
)
+const (
+ maxRetry = 10 //number of retries
+)
+
type Mongo struct {
db *mongo.Client
}
+// NewMongo Initialize MongoDB connection
func NewMongo() (*Mongo, error) {
specialerror.AddReplace(mongo.ErrNoDocuments, errs.ErrRecordNotFound)
- uri := "mongodb://sample.host:27017/?maxPoolSize=20&w=majority"
+ url := "mongodb://sample.host:27017/?maxPoolSize=20&w=majority"
if config.Config.Mongo.Uri != "" {
- // example:
- // mongodb://$user:$password@mongo1.mongo:27017,mongo2.mongo:27017,mongo3.mongo:27017/$DBDatabase/?replicaSet=rs0&readPreference=secondary&authSource=admin&maxPoolSize=$DBMaxPoolSize
- uri = config.Config.Mongo.Uri
+ url = config.Config.Mongo.Uri
} else {
- //mongodb://mongodb1.example.com:27317,mongodb2.example.com:27017/?replicaSet=mySet&authSource=authDB
mongodbHosts := ""
for i, v := range config.Config.Mongo.Address {
if i == len(config.Config.Mongo.Address)-1 {
@@ -53,23 +55,34 @@ func NewMongo() (*Mongo, error) {
}
}
if config.Config.Mongo.Password != "" && config.Config.Mongo.Username != "" {
- uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin",
+ url = 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",
+ url = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin",
mongodbHosts, config.Config.Mongo.Database,
config.Config.Mongo.MaxPoolSize)
}
}
- fmt.Println("mongo:", uri)
- ctx, cancel := context.WithTimeout(context.Background(), time.Second*60)
- defer cancel()
- mongoClient, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
- if err != nil {
- return nil, err
+ fmt.Println("mongo:", url)
+ var mongoClient *mongo.Client
+ var err error = nil
+ for i := 0; i <= maxRetry; i++ {
+ ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+ defer cancel()
+ mongoClient, err = mongo.Connect(ctx, options.Client().ApplyURI(url))
+ 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)
+ }
+ }
}
- return &Mongo{db: mongoClient}, nil
+ return nil, err
}
func (m *Mongo) GetClient() *mongo.Client {
diff --git a/pkg/common/http/http_client.go b/pkg/common/http/http_client.go
index 72e3fae62..153deb30e 100644
--- a/pkg/common/http/http_client.go
+++ b/pkg/common/http/http_client.go
@@ -1,9 +1,18 @@
-/*
-** description("").
-** copyright('open-im,www.open-im.io').
-** author("fg,Gordon@tuoyun.net").
-** time(2021/5/27 10:31).
- */package http
+// 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 http
import (
"bytes"
diff --git a/pkg/common/kafka/producer.go b/pkg/common/kafka/producer.go
index 4c4ebc460..a749c76f8 100644
--- a/pkg/common/kafka/producer.go
+++ b/pkg/common/kafka/producer.go
@@ -17,12 +17,12 @@ package kafka
import (
"context"
"errors"
-
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
log "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
+ "time"
"github.com/Shopify/sarama"
"google.golang.org/protobuf/proto"
@@ -30,6 +30,10 @@ import (
prome "github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
)
+const (
+ maxRetry = 10 //number of retries
+)
+
var errEmptyMsg = errors.New("binary msg is empty")
type Producer struct {
@@ -39,6 +43,7 @@ type Producer struct {
producer sarama.SyncProducer
}
+// NewKafkaProducer Initialize kafka producer
func NewKafkaProducer(addr []string, topic string) *Producer {
p := Producer{}
p.config = sarama.NewConfig() //Instantiate a sarama Config
@@ -53,7 +58,24 @@ func NewKafkaProducer(addr []string, topic string) *Producer {
}
p.addr = addr
p.topic = topic
- producer, err := sarama.NewSyncProducer(p.addr, p.config) //Initialize the client
+ var producer sarama.SyncProducer
+ var err error
+ for i := 0; i <= maxRetry; i++ {
+ producer, err = sarama.NewSyncProducer(p.addr, p.config) //Initialize the client
+ 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)
+ }
if err != nil {
panic(err.Error())
}
diff --git a/pkg/common/mw/gin.go b/pkg/common/mw/gin.go
index 65f98dca3..a544c2a25 100644
--- a/pkg/common/mw/gin.go
+++ b/pkg/common/mw/gin.go
@@ -31,6 +31,7 @@ import (
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
)
+// CorsHandler gin cross-domain configuration.
func CorsHandler() gin.HandlerFunc {
return func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
@@ -39,19 +40,19 @@ func CorsHandler() gin.HandlerFunc {
c.Header(
"Access-Control-Expose-Headers",
"Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar",
- ) // 跨域关键设置 让浏览器可以解析
+ ) // Cross-domain key settings allow browsers to resolve.
c.Header(
"Access-Control-Max-Age",
"172800",
- ) // 缓存请求信息 单位为秒
+ ) // Cache request information in seconds.
c.Header(
"Access-Control-Allow-Credentials",
"false",
- ) // 跨域请求是否需要带cookie信息 默认设置为true
+ ) // Whether cross-domain requests need to carry cookie information, the default setting is true.
c.Header(
"content-type",
"application/json",
- ) // 设置返回格式是json
+ ) // Set the return format to json.
//Release all option pre-requests
if c.Request.Method == http.MethodOptions {
c.JSON(http.StatusOK, "Options Request!")
From 0b306d996dcd9f938e64a2d13eee17f77c252981 Mon Sep 17 00:00:00 2001
From: Alan <68671759+hanzhixiao@users.noreply.github.com>
Date: Thu, 13 Jul 2023 15:11:33 +0800
Subject: [PATCH 7/9] all back-office api (#533)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix conflict
Signed-off-by: ‘hanzhixiao’ <‘709674996@qq.com’>
* all Back-office management api
Signed-off-by: ‘hanzhixiao’ <‘709674996@qq.com’>
---------
Signed-off-by: ‘hanzhixiao’ <‘709674996@qq.com’>
Co-authored-by: ‘hanzhixiao’ <‘709674996@qq.com’>
---
internal/api/group.go | 3 +
internal/api/msg.go | 113 ++-
internal/api/route.go | 5 +
internal/api/third.go | 59 ++
internal/msgtransfer/init.go | 5 +-
internal/rpc/msg/revoke.go | 21 +
internal/rpc/msg/server.go | 5 +-
internal/rpc/msg/sync_msg.go | 49 +
internal/tools/msg.go | 2 +-
pkg/common/db/controller/msg.go | 25 +-
pkg/common/db/relation/group_model.go | 5 +-
pkg/common/db/table/unrelation/msg.go | 2 +
pkg/common/db/unrelation/msg.go | 134 +++
pkg/proto/auth/auth.pb.go | 19 +-
pkg/proto/conversation/conversation.pb.go | 22 +-
pkg/proto/errinfo/errinfo.pb.go | 19 +-
pkg/proto/friend/friend.pb.go | 22 +-
pkg/proto/group/group.pb.go | 24 +-
pkg/proto/msg/msg.pb.go | 1092 +++++++++++++++++----
pkg/proto/msg/msg.proto | 54 +
pkg/proto/msggateway/msggateway.pb.go | 22 +-
pkg/proto/push/push.pb.go | 22 +-
pkg/proto/sdkws/sdkws.pb.go | 22 +-
pkg/proto/statistics/statistics.pb.go | 17 +-
pkg/proto/third/third.pb.go | 19 +-
pkg/proto/user/user.pb.go | 24 +-
pkg/proto/wrapperspb/wrapperspb.pb.go | 19 +-
pkg/rpcclient/msg.go | 14 +
pkg/rpcclient/third.go | 37 +-
29 files changed, 1627 insertions(+), 249 deletions(-)
diff --git a/internal/api/group.go b/internal/api/group.go
index 2e293f72a..a87af8e6b 100644
--- a/internal/api/group.go
+++ b/internal/api/group.go
@@ -132,3 +132,6 @@ func (o *GroupApi) GetSuperGroupsInfo(c *gin.Context) {
func (o *GroupApi) GroupCreateCount(c *gin.Context) {
a2r.Call(group.GroupClient.GroupCreateCount, o.Client, c)
}
+func (o *GroupApi) GetGroups(c *gin.Context) {
+ a2r.Call(group.GroupClient.GetGroups, o.Client, c)
+}
diff --git a/internal/api/msg.go b/internal/api/msg.go
index 7e9101681..45a551cc2 100644
--- a/internal/api/msg.go
+++ b/internal/api/msg.go
@@ -15,6 +15,7 @@
package api
import (
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"github.com/mitchellh/mapstructure"
@@ -204,7 +205,7 @@ func (m *MessageApi) SendMessage(c *gin.Context) {
if err := mapstructure.WeakDecode(params.Content, &data); err != nil {
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
return
- } else if err := m.validate.Struct(data); err != nil {
+ } else if err := m.validate.Struct(params); err != nil {
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
return
}
@@ -227,7 +228,107 @@ func (m *MessageApi) SendMessage(c *gin.Context) {
}
func (m *MessageApi) ManagementBatchSendMsg(c *gin.Context) {
- a2r.Call(msg.MsgClient.SendMsg, m.Client, c)
+ params := apistruct.ManagementBatchSendMsgReq{}
+ resp := apistruct.ManagementBatchSendMsgResp{}
+ var msgSendFailedFlag bool
+ if err := c.BindJSON(¶ms); err != nil {
+ apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
+ return
+ }
+ if !tokenverify.IsAppManagerUid(c) {
+ apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
+ return
+ }
+
+ var data interface{}
+ switch params.ContentType {
+ case constant.Text:
+ data = apistruct.TextElem{}
+ case constant.Picture:
+ data = apistruct.PictureElem{}
+ case constant.Voice:
+ data = apistruct.SoundElem{}
+ case constant.Video:
+ data = apistruct.VideoElem{}
+ case constant.File:
+ data = apistruct.FileElem{}
+ case constant.Custom:
+ data = apistruct.CustomElem{}
+ case constant.Revoke:
+ data = apistruct.RevokeElem{}
+ case constant.OANotification:
+ data = apistruct.OANotificationElem{}
+ params.SessionType = constant.NotificationChatType
+ case constant.CustomNotTriggerConversation:
+ data = apistruct.CustomElem{}
+ case constant.CustomOnlineOnly:
+ data = apistruct.CustomElem{}
+ default:
+ apiresp.GinError(c, errs.ErrArgs.WithDetail("not support err contentType").Wrap())
+ return
+ }
+ if err := mapstructure.WeakDecode(params.Content, &data); err != nil {
+ apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
+ return
+ } else if err := m.validate.Struct(params); err != nil {
+ apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
+ return
+ }
+
+ t := &apistruct.ManagementSendMsgReq{
+ SendID: params.SendID,
+ GroupID: params.GroupID,
+ SenderNickname: params.SenderNickname,
+ SenderFaceURL: params.SenderFaceURL,
+ SenderPlatformID: params.SenderPlatformID,
+ Content: params.Content,
+ ContentType: params.ContentType,
+ SessionType: params.SessionType,
+ IsOnlineOnly: params.IsOnlineOnly,
+ NotOfflinePush: params.NotOfflinePush,
+ OfflinePushInfo: params.OfflinePushInfo,
+ }
+ pbReq := m.newUserSendMsgReq(c, t)
+ var recvList []string
+ if params.IsSendAll {
+ req2 := &user.GetAllUserIDReq{}
+ resp2, err := m.Message.GetAllUserID(c, req2)
+ if err != nil {
+ apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
+ return
+ }
+ recvList = resp2.UserIDs
+ } else {
+ recvList = params.RecvIDList
+ }
+
+ for _, recvID := range recvList {
+ pbReq.MsgData.RecvID = recvID
+ rpcResp, err := m.Client.SendMsg(c, pbReq)
+ if err != nil {
+ resp.Data.FailedIDList = append(resp.Data.FailedIDList, recvID)
+ msgSendFailedFlag = true
+ continue
+ }
+ resp.Data.ResultList = append(resp.Data.ResultList, &apistruct.SingleReturnResult{
+ ServerMsgID: rpcResp.ServerMsgID,
+ ClientMsgID: rpcResp.ClientMsgID,
+ SendTime: rpcResp.SendTime,
+ RecvID: recvID,
+ })
+ }
+ var status int32
+ if msgSendFailedFlag {
+ status = constant.MsgSendFailed
+ } else {
+ status = constant.MsgSendSuccessed
+ }
+ _, err := m.Client.SetSendMsgStatus(c, &msg.SetSendMsgStatusReq{Status: status})
+ if err != nil {
+ apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
+ return
+ }
+ apiresp.GinSuccess(c, resp)
}
func (m *MessageApi) CheckMsgIsSendSuccess(c *gin.Context) {
@@ -245,3 +346,11 @@ func (m *MessageApi) GetActiveUser(c *gin.Context) {
func (m *MessageApi) GetActiveGroup(c *gin.Context) {
a2r.Call(msg.MsgClient.GetActiveGroup, m.Client, c)
}
+
+func (m *MessageApi) SearchMsg(c *gin.Context) {
+ a2r.Call(msg.MsgClient.SearchMessage, m.Client, c)
+}
+
+func (m *MessageApi) ManagementMsg(c *gin.Context) {
+ a2r.Call(msg.MsgClient.ManageMsg, m.Client, c)
+}
diff --git a/internal/api/route.go b/internal/api/route.go
index b37e5a3f7..273386853 100644
--- a/internal/api/route.go
+++ b/internal/api/route.go
@@ -103,6 +103,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
groupRouterGroup.POST("/cancel_mute_group", g.CancelMuteGroup)
groupRouterGroup.POST("/set_group_member_info", g.SetGroupMemberInfo)
groupRouterGroup.POST("/get_group_abstract_info", g.GetGroupAbstractInfo)
+ groupRouterGroup.POST("/get_groups", g.GetGroups)
}
superGroupRouterGroup := r.Group("/super_group", ParseToken)
{
@@ -124,6 +125,8 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
thirdGroup.POST("/fcm_update_token", t.FcmUpdateToken)
thirdGroup.POST("/set_app_badge", t.SetAppBadge)
+ thirdGroup.POST("/minio_upload", t.MinioUploadFile)
+
objectGroup := r.Group("/object", ParseToken)
objectGroup.POST("/part_limit", t.PartLimit)
@@ -138,10 +141,12 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
msgGroup := r.Group("/msg", ParseToken)
{
msgGroup.POST("/newest_seq", m.GetSeq)
+ msgGroup.POST("/search_msg", m.SearchMsg)
msgGroup.POST("/send_msg", m.SendMessage)
msgGroup.POST("/pull_msg_by_seq", m.PullMsgBySeqs)
msgGroup.POST("/revoke_msg", m.RevokeMsg)
msgGroup.POST("/mark_msgs_as_read", m.MarkMsgsAsRead)
+ msgGroup.POST("/manage_msg", m.ManagementMsg)
msgGroup.POST("/mark_conversation_as_read", m.MarkConversationAsRead)
msgGroup.POST("/get_conversations_has_read_and_max_seq", m.GetConversationsHasReadAndMaxSeq)
msgGroup.POST("/set_conversation_has_read_seq", m.SetConversationHasReadSeq)
diff --git a/internal/api/third.go b/internal/api/third.go
index 895e3784f..19beeeb11 100644
--- a/internal/api/third.go
+++ b/internal/api/third.go
@@ -1,6 +1,11 @@
package api
import (
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/apistruct"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
+ "github.com/minio/minio-go/v7"
"math/rand"
"net/http"
"strconv"
@@ -84,3 +89,57 @@ func (o *ThirdApi) ObjectRedirect(c *gin.Context) {
}
c.Redirect(http.StatusTemporaryRedirect, resp.Url)
}
+
+func (o *ThirdApi) MinioUploadFile(c *gin.Context) {
+ var (
+ req apistruct.MinioUploadFileReq
+ resp apistruct.MinioUploadFile
+ )
+
+ if err := c.Bind(&req); err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
+ return
+ }
+ switch req.FileType {
+ // videoType upload snapShot
+ case constant.VideoType:
+ snapShotFile, err := c.FormFile("snapShot")
+ if err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing snapshot arg: " + err.Error()})
+ return
+ }
+ snapShotFileObj, err := snapShotFile.Open()
+ if err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
+ return
+ }
+ snapShotNewName, snapShotNewType := utils.GetNewFileNameAndContentType(snapShotFile.Filename, constant.ImageType)
+ _, err = o.MinioClient.PutObject(c, config.Config.Object.Minio.Bucket, snapShotNewName, snapShotFileObj, snapShotFile.Size, minio.PutObjectOptions{ContentType: snapShotNewType})
+ if err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
+ return
+ }
+ resp.SnapshotURL = config.Config.Object.Minio.Endpoint + "/" + config.Config.Object.Minio.Bucket + "/" + snapShotNewName
+ resp.SnapshotNewName = snapShotNewName
+ }
+ file, err := c.FormFile("file")
+ if err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing file arg: " + err.Error()})
+ return
+ }
+ fileObj, err := file.Open()
+ if err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "invalid file path" + err.Error()})
+ return
+ }
+ newName, newType := utils.GetNewFileNameAndContentType(file.Filename, req.FileType)
+ _, err = o.MinioClient.PutObject(c, config.Config.Object.Minio.Bucket, newName, fileObj, file.Size, minio.PutObjectOptions{ContentType: newType})
+ if err != nil {
+ c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "upload file error" + err.Error()})
+ return
+ }
+ resp.NewName = newName
+ resp.URL = config.Config.Object.Minio.Endpoint + "/" + config.Config.Object.Minio.Bucket + "/" + newName
+ c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp})
+ return
+}
diff --git a/internal/msgtransfer/init.go b/internal/msgtransfer/init.go
index 3bad5f12e..8b812bac9 100644
--- a/internal/msgtransfer/init.go
+++ b/internal/msgtransfer/init.go
@@ -68,8 +68,9 @@ func StartTransfer(prometheusPort int) error {
client.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
msgModel := cache.NewMsgCacheModel(rdb)
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
- chatLogDatabase := controller.NewChatLogDatabase(relation.NewChatLogGorm(db))
- msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel)
+ msgMysModel := relation.NewChatLogGorm(db)
+ chatLogDatabase := controller.NewChatLogDatabase(msgMysModel)
+ msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel, msgMysModel)
conversationRpcClient := rpcclient.NewConversationRpcClient(client)
groupRpcClient := rpcclient.NewGroupRpcClient(client)
msgTransfer := NewMsgTransfer(chatLogDatabase, msgDatabase, &conversationRpcClient, &groupRpcClient)
diff --git a/internal/rpc/msg/revoke.go b/internal/rpc/msg/revoke.go
index c95d347e7..8ad8d9d4a 100644
--- a/internal/rpc/msg/revoke.go
+++ b/internal/rpc/msg/revoke.go
@@ -124,3 +124,24 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
}
return &msg.RevokeMsgResp{}, nil
}
+
+func (m *msgServer) ManageMsg(ctx context.Context, req *msg.ManageMsgReq) (*msg.ManageMsgResp, error) {
+ resp := &msg.ManageMsgResp{}
+ msgData := &sdkws.MsgData{
+ SendID: req.SendID,
+ RecvID: req.RecvID,
+ SessionType: req.SessionType,
+ GroupID: req.GroupID,
+ }
+ conversationID := utils.GetChatConversationIDByMsg(msgData)
+ revokeReq := &msg.RevokeMsgReq{
+ ConversationID: conversationID,
+ Seq: req.Seq,
+ UserID: req.SendID,
+ }
+ _, err := m.RevokeMsg(ctx, revokeReq)
+ if err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
diff --git a/internal/rpc/msg/server.go b/internal/rpc/msg/server.go
index 15fc696d8..17aac5040 100644
--- a/internal/rpc/msg/server.go
+++ b/internal/rpc/msg/server.go
@@ -2,6 +2,7 @@ package msg
import (
"context"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
"google.golang.org/grpc"
@@ -61,11 +62,13 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
}
cacheModel := cache.NewMsgCacheModel(rdb)
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
- msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel)
conversationClient := rpcclient.NewConversationRpcClient(client)
userRpcClient := rpcclient.NewUserRpcClient(client)
groupRpcClient := rpcclient.NewGroupRpcClient(client)
friendRpcClient := rpcclient.NewFriendRpcClient(client)
+ mysql, err := relation.NewGormDB()
+ msgMysModel := relation.NewChatLogGorm(mysql)
+ msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel, msgMysModel)
s := &msgServer{
Conversation: &conversationClient,
User: &userRpcClient,
diff --git a/internal/rpc/msg/sync_msg.go b/internal/rpc/msg/sync_msg.go
index 7ac30ff1a..01510ffef 100644
--- a/internal/rpc/msg/sync_msg.go
+++ b/internal/rpc/msg/sync_msg.go
@@ -16,6 +16,8 @@ package msg
import (
"context"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
@@ -102,3 +104,50 @@ func (m *msgServer) GetMaxSeq(ctx context.Context, req *sdkws.GetMaxSeqReq) (*sd
resp.MaxSeqs = maxSeqs
return resp, nil
}
+
+func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) (resp *msg.SearchMessageResp, err error) {
+ var chatLogs []*sdkws.MsgData
+ resp = &msg.SearchMessageResp{}
+ if chatLogs, err = m.MsgDatabase.SearchMessage(ctx, req); err != nil {
+ return nil, err
+ }
+ var num int
+ for _, chatLog := range chatLogs {
+ pbChatLog := &msg.ChatLog{}
+ utils.CopyStructFields(pbChatLog, chatLog)
+ pbChatLog.SendTime = chatLog.SendTime
+ pbChatLog.CreateTime = chatLog.CreateTime
+ if chatLog.SenderNickname == "" {
+ sendUser, err := m.User.GetUserInfo(ctx, chatLog.SendID)
+ if err != nil {
+ return nil, err
+ }
+ pbChatLog.SenderNickname = sendUser.Nickname
+ }
+ switch chatLog.SessionType {
+ case constant.SingleChatType:
+ recvUser, err := m.User.GetUserInfo(ctx, chatLog.RecvID)
+ if err != nil {
+ return nil, err
+ }
+ pbChatLog.SenderNickname = recvUser.Nickname
+
+ case constant.GroupChatType, constant.SuperGroupChatType:
+ group, err := m.Group.GetGroupInfo(ctx, chatLog.GroupID)
+ if err != nil {
+ return nil, err
+ }
+ pbChatLog.SenderFaceURL = group.FaceURL
+ pbChatLog.GroupMemberCount = group.MemberCount
+ pbChatLog.RecvID = group.GroupID
+ pbChatLog.GroupName = group.GroupName
+ pbChatLog.GroupOwner = group.OwnerUserID
+ pbChatLog.GroupType = group.GroupType
+ }
+ resp.ChatLogs = append(resp.ChatLogs, pbChatLog)
+ num++
+ }
+
+ resp.ChatLogsNum = int32(num)
+ return resp, nil
+}
diff --git a/internal/tools/msg.go b/internal/tools/msg.go
index aa7f52f23..9d57da768 100644
--- a/internal/tools/msg.go
+++ b/internal/tools/msg.go
@@ -80,7 +80,7 @@ func InitMsgTool() (*MsgTool, error) {
}
discov.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
userDB := relation.NewUserGorm(db)
- msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase())
+ msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase(), db)
userDatabase := controller.NewUserDatabase(
userDB,
cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()),
diff --git a/pkg/common/db/controller/msg.go b/pkg/common/db/controller/msg.go
index b2855819f..b9aefdc72 100644
--- a/pkg/common/db/controller/msg.go
+++ b/pkg/common/db/controller/msg.go
@@ -1,6 +1,9 @@
package controller
import (
+ relation2 "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
+ "gorm.io/gorm"
"time"
"github.com/redis/go-redis/v9"
@@ -102,6 +105,7 @@ type CommonMsgDatabase interface {
) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
SetSendMsgStatus(ctx context.Context, id string, status int32) error
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
+ SearchMessage(ctx context.Context, req *pbMsg.SearchMessageReq) (msgData []*sdkws.MsgData, err error)
// to mq
MsgToMQ(ctx context.Context, key string, msg2mq *sdkws.MsgData) error
@@ -128,8 +132,9 @@ type CommonMsgDatabase interface {
) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error)
}
-func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheModel cache.MsgModel) CommonMsgDatabase {
+func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheModel cache.MsgModel, msgMyqModel relation.ChatLogModelInterface) CommonMsgDatabase {
return &commonMsgDatabase{
+ msgMyq: msgMyqModel,
msgDocDatabase: msgDocModel,
cache: cacheModel,
producer: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.LatestMsgToRedis.Topic),
@@ -138,16 +143,18 @@ func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheMo
}
}
-func InitCommonMsgDatabase(rdb redis.UniversalClient, database *mongo.Database) CommonMsgDatabase {
+func InitCommonMsgDatabase(rdb redis.UniversalClient, database *mongo.Database, dbGrom *gorm.DB) CommonMsgDatabase {
cacheModel := cache.NewMsgCacheModel(rdb)
msgDocModel := unrelation.NewMsgMongoDriver(database)
- CommonMsgDatabase := NewCommonMsgDatabase(msgDocModel, cacheModel)
+ msgMyqModel := relation2.NewChatLogGorm(dbGrom)
+ CommonMsgDatabase := NewCommonMsgDatabase(msgDocModel, cacheModel, msgMyqModel)
return CommonMsgDatabase
}
type commonMsgDatabase struct {
msgDocDatabase unRelationTb.MsgDocModelInterface
msg unRelationTb.MsgDocModel
+ msgMyq relation.ChatLogModelInterface
cache cache.MsgModel
producer *kafka.Producer
producerToMongo *kafka.Producer
@@ -1163,3 +1170,15 @@ func (db *commonMsgDatabase) RangeGroupSendCount(
) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) {
return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber)
}
+
+func (db *commonMsgDatabase) SearchMessage(ctx context.Context, req *pbMsg.SearchMessageReq) (msgData []*sdkws.MsgData, err error) {
+ var totalMsgs []*sdkws.MsgData
+ msgs, err := db.msgDocDatabase.SearchMessage(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ for _, msg := range msgs {
+ totalMsgs = append(totalMsgs, convert.MsgDB2Pb(msg.Msg))
+ }
+ return totalMsgs, nil
+}
diff --git a/pkg/common/db/relation/group_model.go b/pkg/common/db/relation/group_model.go
index 402c77682..d115dd016 100644
--- a/pkg/common/db/relation/group_model.go
+++ b/pkg/common/db/relation/group_model.go
@@ -2,6 +2,7 @@ package relation
import (
"context"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"time"
"gorm.io/gorm"
@@ -58,7 +59,9 @@ func (g *GroupGorm) Search(
keyword string,
pageNumber, showNumber int32,
) (total uint32, groups []*relation.GroupModel, err error) {
- return ormutil.GormSearch[relation.GroupModel](g.DB, []string{"name"}, keyword, pageNumber, showNumber)
+ db := g.DB
+ db = db.WithContext(ctx).Where("status!=?", constant.GroupStatusDismissed)
+ return ormutil.GormSearch[relation.GroupModel](db, []string{"name"}, keyword, pageNumber, showNumber)
}
func (g *GroupGorm) GetGroupIDsByGroupType(ctx context.Context, groupType int) (groupIDs []string, err error) {
diff --git a/pkg/common/db/table/unrelation/msg.go b/pkg/common/db/table/unrelation/msg.go
index 103e68c22..3a8725f36 100644
--- a/pkg/common/db/table/unrelation/msg.go
+++ b/pkg/common/db/table/unrelation/msg.go
@@ -16,6 +16,7 @@ package unrelation
import (
"context"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"strconv"
"time"
@@ -108,6 +109,7 @@ type MsgDocModelInterface interface {
GetMsgDocModelByIndex(ctx context.Context, conversationID string, index, sort int64) (*MsgDocModel, error)
DeleteMsgsInOneDocByIndex(ctx context.Context, docID string, indexes []int) error
MarkSingleChatMsgsAsRead(ctx context.Context, userID string, docID string, indexes []int64) error
+ SearchMessage(ctx context.Context, req *msg.SearchMessageReq) ([]*MsgInfoModel, error)
RangeUserSendCount(
ctx context.Context,
start time.Time,
diff --git a/pkg/common/db/unrelation/msg.go b/pkg/common/db/unrelation/msg.go
index b7bf42ef4..5d26d45b2 100644
--- a/pkg/common/db/unrelation/msg.go
+++ b/pkg/common/db/unrelation/msg.go
@@ -19,6 +19,7 @@ import (
"encoding/json"
"errors"
"fmt"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
"time"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
@@ -1064,3 +1065,136 @@ func (m *MsgMongoDriver) RangeGroupSendCount(
}
return result[0].MsgCount, result[0].UserCount, groups, dateCount, nil
}
+
+func (m *MsgMongoDriver) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) ([]*table.MsgInfoModel, error) {
+ msgs, err := m.searchMessage(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ for _, msg1 := range msgs {
+ if msg1.IsRead {
+ msg1.Msg.IsRead = true
+ }
+ }
+ return msgs, nil
+}
+
+func (m *MsgMongoDriver) searchMessage(ctx context.Context, req *msg.SearchMessageReq) ([]*table.MsgInfoModel, error) {
+ var pipe mongo.Pipeline
+ conditon := bson.A{}
+ if req.SendTime != "" {
+ conditon = append(conditon, bson.M{"$eq": bson.A{bson.M{"$dateToString": bson.M{"format": "%Y-%m-%d", "date": bson.M{"$toDate": "$$item.msg.send_time"}}}, req.SendTime}})
+ }
+ if req.MsgType != 0 {
+ conditon = append(conditon, bson.M{"$eq": bson.A{"$$item.msg.content_type", req.MsgType}})
+ }
+ if req.SessionType != 0 {
+ conditon = append(conditon, bson.M{"$eq": bson.A{"$$item.msg.session_type", req.SessionType}})
+ }
+ if req.RecvID != "" {
+ conditon = append(conditon, bson.M{"$regexFind": bson.M{"input": "$$item.msg.recv_id", "regex": req.RecvID}})
+ }
+ if req.SendID != "" {
+ conditon = append(conditon, bson.M{"$regexFind": bson.M{"input": "$$item.msg.send_id", "regex": req.SendID}})
+ }
+
+ or := bson.A{
+ bson.M{
+ "doc_id": bson.M{
+ "$regex": "^si_",
+ "$options": "i",
+ },
+ },
+ }
+ or = append(or,
+ bson.M{
+ "doc_id": bson.M{
+ "$regex": "^g_",
+ "$options": "i",
+ },
+ },
+ bson.M{
+ "doc_id": bson.M{
+ "$regex": "^sg_",
+ "$options": "i",
+ },
+ },
+ )
+
+ pipe = mongo.Pipeline{
+ {
+ {"$match", bson.D{
+ {
+ "$or", or,
+ },
+ }},
+ },
+ {
+ {"$project", bson.D{
+ {"msgs", bson.D{
+ {"$filter", bson.D{
+ {"input", "$msgs"},
+ {"as", "item"},
+ {"cond", bson.D{
+ {"$and", conditon},
+ },
+ }},
+ }},
+ },
+ {"doc_id", 1},
+ }},
+ },
+ }
+ cursor, err := m.MsgCollection.Aggregate(ctx, pipe)
+ if err != nil {
+ return nil, err
+ }
+
+ var msgsDocs []table.MsgDocModel
+ err = cursor.All(ctx, &msgsDocs)
+ if err != nil {
+ return nil, err
+ }
+ if len(msgsDocs) == 0 {
+ return nil, errs.Wrap(mongo.ErrNoDocuments)
+ }
+ msgs := make([]*table.MsgInfoModel, 0)
+ for index, _ := range msgsDocs {
+ for i := range msgsDocs[index].Msg {
+ msg := msgsDocs[index].Msg[i]
+ if msg == nil || msg.Msg == nil {
+ continue
+ }
+ if msg.Revoke != nil {
+ revokeContent := sdkws.MessageRevokedContent{
+ RevokerID: msg.Revoke.UserID,
+ RevokerRole: msg.Revoke.Role,
+ ClientMsgID: msg.Msg.ClientMsgID,
+ RevokerNickname: msg.Revoke.Nickname,
+ RevokeTime: msg.Revoke.Time,
+ SourceMessageSendTime: msg.Msg.SendTime,
+ SourceMessageSendID: msg.Msg.SendID,
+ SourceMessageSenderNickname: msg.Msg.SenderNickname,
+ SessionType: msg.Msg.SessionType,
+ Seq: msg.Msg.Seq,
+ Ex: msg.Msg.Ex,
+ }
+ data, err := json.Marshal(&revokeContent)
+ if err != nil {
+ return nil, err
+ }
+ elem := sdkws.NotificationElem{
+ Detail: string(data),
+ }
+ content, err := json.Marshal(&elem)
+ if err != nil {
+ return nil, err
+ }
+ msg.Msg.ContentType = constant.MsgRevokeNotification
+ msg.Msg.Content = string(content)
+ }
+ msgs = append(msgs, msg)
+ }
+ }
+ return msgs, nil
+}
diff --git a/pkg/proto/auth/auth.pb.go b/pkg/proto/auth/auth.pb.go
index 095998cc6..2d1e0493c 100644
--- a/pkg/proto/auth/auth.pb.go
+++ b/pkg/proto/auth/auth.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,14 +22,13 @@ package auth
import (
context "context"
- reflect "reflect"
- sync "sync"
-
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/conversation/conversation.pb.go b/pkg/proto/conversation/conversation.pb.go
index 7ec352420..cf5de48a7 100644
--- a/pkg/proto/conversation/conversation.pb.go
+++ b/pkg/proto/conversation/conversation.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,16 +22,14 @@ package conversation
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/errinfo/errinfo.pb.go b/pkg/proto/errinfo/errinfo.pb.go
index ae10fe976..44f906d86 100644
--- a/pkg/proto/errinfo/errinfo.pb.go
+++ b/pkg/proto/errinfo/errinfo.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -7,11 +21,10 @@
package errinfo
import (
- reflect "reflect"
- sync "sync"
-
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/friend/friend.pb.go b/pkg/proto/friend/friend.pb.go
index c49a13999..5745fcd3c 100644
--- a/pkg/proto/friend/friend.pb.go
+++ b/pkg/proto/friend/friend.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,16 +22,14 @@ package friend
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/group/group.pb.go b/pkg/proto/group/group.pb.go
index 9541496e2..f4230c794 100644
--- a/pkg/proto/group/group.pb.go
+++ b/pkg/proto/group/group.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,17 +22,15 @@ package group
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
- wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/msg/msg.pb.go b/pkg/proto/msg/msg.pb.go
index 544483074..d11d46de3 100644
--- a/pkg/proto/msg/msg.pb.go
+++ b/pkg/proto/msg/msg.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,16 +22,14 @@ package msg
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ reflect "reflect"
+ sync "sync"
)
const (
@@ -2361,6 +2373,488 @@ func (x *GetActiveGroupResp) GetGroups() []*ActiveGroup {
return nil
}
+type SearchMessageReq struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ SendID string `protobuf:"bytes,1,opt,name=sendID,proto3" json:"sendID"` //发送者ID
+ RecvID string `protobuf:"bytes,2,opt,name=recvID,proto3" json:"recvID"` //接收者ID
+ MsgType int32 `protobuf:"varint,3,opt,name=msgType,proto3" json:"msgType"`
+ SendTime string `protobuf:"bytes,4,opt,name=sendTime,proto3" json:"sendTime"`
+ SessionType int32 `protobuf:"varint,5,opt,name=sessionType,proto3" json:"sessionType"`
+ Pagination *sdkws.RequestPagination `protobuf:"bytes,6,opt,name=pagination,proto3" json:"pagination"`
+}
+
+func (x *SearchMessageReq) Reset() {
+ *x = SearchMessageReq{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_msg_msg_proto_msgTypes[45]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SearchMessageReq) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchMessageReq) ProtoMessage() {}
+
+func (x *SearchMessageReq) ProtoReflect() protoreflect.Message {
+ mi := &file_msg_msg_proto_msgTypes[45]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SearchMessageReq.ProtoReflect.Descriptor instead.
+func (*SearchMessageReq) Descriptor() ([]byte, []int) {
+ return file_msg_msg_proto_rawDescGZIP(), []int{45}
+}
+
+func (x *SearchMessageReq) GetSendID() string {
+ if x != nil {
+ return x.SendID
+ }
+ return ""
+}
+
+func (x *SearchMessageReq) GetRecvID() string {
+ if x != nil {
+ return x.RecvID
+ }
+ return ""
+}
+
+func (x *SearchMessageReq) GetMsgType() int32 {
+ if x != nil {
+ return x.MsgType
+ }
+ return 0
+}
+
+func (x *SearchMessageReq) GetSendTime() string {
+ if x != nil {
+ return x.SendTime
+ }
+ return ""
+}
+
+func (x *SearchMessageReq) GetSessionType() int32 {
+ if x != nil {
+ return x.SessionType
+ }
+ return 0
+}
+
+func (x *SearchMessageReq) GetPagination() *sdkws.RequestPagination {
+ if x != nil {
+ return x.Pagination
+ }
+ return nil
+}
+
+type SearchMessageResp struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ChatLogs []*ChatLog `protobuf:"bytes,1,rep,name=chatLogs,proto3" json:"chatLogs"`
+ ChatLogsNum int32 `protobuf:"varint,2,opt,name=chatLogsNum,proto3" json:"chatLogsNum"`
+}
+
+func (x *SearchMessageResp) Reset() {
+ *x = SearchMessageResp{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_msg_msg_proto_msgTypes[46]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SearchMessageResp) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchMessageResp) ProtoMessage() {}
+
+func (x *SearchMessageResp) ProtoReflect() protoreflect.Message {
+ mi := &file_msg_msg_proto_msgTypes[46]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SearchMessageResp.ProtoReflect.Descriptor instead.
+func (*SearchMessageResp) Descriptor() ([]byte, []int) {
+ return file_msg_msg_proto_rawDescGZIP(), []int{46}
+}
+
+func (x *SearchMessageResp) GetChatLogs() []*ChatLog {
+ if x != nil {
+ return x.ChatLogs
+ }
+ return nil
+}
+
+func (x *SearchMessageResp) GetChatLogsNum() int32 {
+ if x != nil {
+ return x.ChatLogsNum
+ }
+ return 0
+}
+
+type ManageMsgReq struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ RecvID string `protobuf:"bytes,1,opt,name=recvID,proto3" json:"recvID"`
+ SendID string `protobuf:"bytes,2,opt,name=sendID,proto3" json:"sendID"`
+ GroupID string `protobuf:"bytes,3,opt,name=groupID,proto3" json:"groupID"`
+ Seq int64 `protobuf:"varint,4,opt,name=seq,proto3" json:"seq"`
+ SessionType int32 `protobuf:"varint,5,opt,name=sessionType,proto3" json:"sessionType"`
+}
+
+func (x *ManageMsgReq) Reset() {
+ *x = ManageMsgReq{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_msg_msg_proto_msgTypes[47]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ManageMsgReq) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ManageMsgReq) ProtoMessage() {}
+
+func (x *ManageMsgReq) ProtoReflect() protoreflect.Message {
+ mi := &file_msg_msg_proto_msgTypes[47]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ManageMsgReq.ProtoReflect.Descriptor instead.
+func (*ManageMsgReq) Descriptor() ([]byte, []int) {
+ return file_msg_msg_proto_rawDescGZIP(), []int{47}
+}
+
+func (x *ManageMsgReq) GetRecvID() string {
+ if x != nil {
+ return x.RecvID
+ }
+ return ""
+}
+
+func (x *ManageMsgReq) GetSendID() string {
+ if x != nil {
+ return x.SendID
+ }
+ return ""
+}
+
+func (x *ManageMsgReq) GetGroupID() string {
+ if x != nil {
+ return x.GroupID
+ }
+ return ""
+}
+
+func (x *ManageMsgReq) GetSeq() int64 {
+ if x != nil {
+ return x.Seq
+ }
+ return 0
+}
+
+func (x *ManageMsgReq) GetSessionType() int32 {
+ if x != nil {
+ return x.SessionType
+ }
+ return 0
+}
+
+type ManageMsgResp struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *ManageMsgResp) Reset() {
+ *x = ManageMsgResp{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_msg_msg_proto_msgTypes[48]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ManageMsgResp) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ManageMsgResp) ProtoMessage() {}
+
+func (x *ManageMsgResp) ProtoReflect() protoreflect.Message {
+ mi := &file_msg_msg_proto_msgTypes[48]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ManageMsgResp.ProtoReflect.Descriptor instead.
+func (*ManageMsgResp) Descriptor() ([]byte, []int) {
+ return file_msg_msg_proto_rawDescGZIP(), []int{48}
+}
+
+type ChatLog struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ServerMsgID string `protobuf:"bytes,1,opt,name=serverMsgID,proto3" json:"serverMsgID"`
+ ClientMsgID string `protobuf:"bytes,2,opt,name=clientMsgID,proto3" json:"clientMsgID"`
+ SendID string `protobuf:"bytes,3,opt,name=sendID,proto3" json:"sendID"`
+ RecvID string `protobuf:"bytes,4,opt,name=recvID,proto3" json:"recvID"`
+ GroupID string `protobuf:"bytes,5,opt,name=groupID,proto3" json:"groupID"`
+ RecvNickname string `protobuf:"bytes,6,opt,name=recvNickname,proto3" json:"recvNickname"`
+ SenderPlatformID int32 `protobuf:"varint,7,opt,name=senderPlatformID,proto3" json:"senderPlatformID"`
+ SenderNickname string `protobuf:"bytes,8,opt,name=senderNickname,proto3" json:"senderNickname"`
+ SenderFaceURL string `protobuf:"bytes,9,opt,name=senderFaceURL,proto3" json:"senderFaceURL"`
+ GroupName string `protobuf:"bytes,10,opt,name=groupName,proto3" json:"groupName"`
+ SessionType int32 `protobuf:"varint,11,opt,name=sessionType,proto3" json:"sessionType"`
+ MsgFrom int32 `protobuf:"varint,12,opt,name=msgFrom,proto3" json:"msgFrom"`
+ ContentType int32 `protobuf:"varint,13,opt,name=contentType,proto3" json:"contentType"`
+ Content string `protobuf:"bytes,14,opt,name=content,proto3" json:"content"`
+ Status int32 `protobuf:"varint,15,opt,name=status,proto3" json:"status"`
+ SendTime int64 `protobuf:"varint,16,opt,name=sendTime,proto3" json:"sendTime"`
+ CreateTime int64 `protobuf:"varint,17,opt,name=createTime,proto3" json:"createTime"`
+ Ex string `protobuf:"bytes,18,opt,name=ex,proto3" json:"ex"`
+ GroupFaceURL string `protobuf:"bytes,19,opt,name=groupFaceURL,proto3" json:"groupFaceURL"`
+ GroupMemberCount uint32 `protobuf:"varint,20,opt,name=groupMemberCount,proto3" json:"groupMemberCount"`
+ Seq int64 `protobuf:"varint,21,opt,name=seq,proto3" json:"seq"`
+ GroupOwner string `protobuf:"bytes,22,opt,name=groupOwner,proto3" json:"groupOwner"`
+ GroupType int32 `protobuf:"varint,23,opt,name=groupType,proto3" json:"groupType"`
+}
+
+func (x *ChatLog) Reset() {
+ *x = ChatLog{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_msg_msg_proto_msgTypes[49]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatLog) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatLog) ProtoMessage() {}
+
+func (x *ChatLog) ProtoReflect() protoreflect.Message {
+ mi := &file_msg_msg_proto_msgTypes[49]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatLog.ProtoReflect.Descriptor instead.
+func (*ChatLog) Descriptor() ([]byte, []int) {
+ return file_msg_msg_proto_rawDescGZIP(), []int{49}
+}
+
+func (x *ChatLog) GetServerMsgID() string {
+ if x != nil {
+ return x.ServerMsgID
+ }
+ return ""
+}
+
+func (x *ChatLog) GetClientMsgID() string {
+ if x != nil {
+ return x.ClientMsgID
+ }
+ return ""
+}
+
+func (x *ChatLog) GetSendID() string {
+ if x != nil {
+ return x.SendID
+ }
+ return ""
+}
+
+func (x *ChatLog) GetRecvID() string {
+ if x != nil {
+ return x.RecvID
+ }
+ return ""
+}
+
+func (x *ChatLog) GetGroupID() string {
+ if x != nil {
+ return x.GroupID
+ }
+ return ""
+}
+
+func (x *ChatLog) GetRecvNickname() string {
+ if x != nil {
+ return x.RecvNickname
+ }
+ return ""
+}
+
+func (x *ChatLog) GetSenderPlatformID() int32 {
+ if x != nil {
+ return x.SenderPlatformID
+ }
+ return 0
+}
+
+func (x *ChatLog) GetSenderNickname() string {
+ if x != nil {
+ return x.SenderNickname
+ }
+ return ""
+}
+
+func (x *ChatLog) GetSenderFaceURL() string {
+ if x != nil {
+ return x.SenderFaceURL
+ }
+ return ""
+}
+
+func (x *ChatLog) GetGroupName() string {
+ if x != nil {
+ return x.GroupName
+ }
+ return ""
+}
+
+func (x *ChatLog) GetSessionType() int32 {
+ if x != nil {
+ return x.SessionType
+ }
+ return 0
+}
+
+func (x *ChatLog) GetMsgFrom() int32 {
+ if x != nil {
+ return x.MsgFrom
+ }
+ return 0
+}
+
+func (x *ChatLog) GetContentType() int32 {
+ if x != nil {
+ return x.ContentType
+ }
+ return 0
+}
+
+func (x *ChatLog) GetContent() string {
+ if x != nil {
+ return x.Content
+ }
+ return ""
+}
+
+func (x *ChatLog) GetStatus() int32 {
+ if x != nil {
+ return x.Status
+ }
+ return 0
+}
+
+func (x *ChatLog) GetSendTime() int64 {
+ if x != nil {
+ return x.SendTime
+ }
+ return 0
+}
+
+func (x *ChatLog) GetCreateTime() int64 {
+ if x != nil {
+ return x.CreateTime
+ }
+ return 0
+}
+
+func (x *ChatLog) GetEx() string {
+ if x != nil {
+ return x.Ex
+ }
+ return ""
+}
+
+func (x *ChatLog) GetGroupFaceURL() string {
+ if x != nil {
+ return x.GroupFaceURL
+ }
+ return ""
+}
+
+func (x *ChatLog) GetGroupMemberCount() uint32 {
+ if x != nil {
+ return x.GroupMemberCount
+ }
+ return 0
+}
+
+func (x *ChatLog) GetSeq() int64 {
+ if x != nil {
+ return x.Seq
+ }
+ return 0
+}
+
+func (x *ChatLog) GetGroupOwner() string {
+ if x != nil {
+ return x.GroupOwner
+ }
+ return ""
+}
+
+func (x *ChatLog) GetGroupType() int32 {
+ if x != nil {
+ return x.GroupType
+ }
+ return 0
+}
+
var File_msg_msg_proto protoreflect.FileDescriptor
var file_msg_msg_proto_rawDesc = []byte{
@@ -2614,125 +3108,212 @@ var file_msg_msg_proto_rawDesc = []byte{
0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
- 0x38, 0x01, 0x32, 0xa8, 0x0e, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x50, 0x0a, 0x09, 0x47, 0x65,
- 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
- 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47, 0x65, 0x74,
- 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
- 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47,
- 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x15,
- 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
- 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
+ 0x38, 0x01, 0x22, 0xe1, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49,
+ 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49, 0x44, 0x12,
+ 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79,
+ 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70,
+ 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a,
+ 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12,
+ 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
+ 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69,
+ 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6c, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x35, 0x0a, 0x08, 0x63,
+ 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
+ 0x2e, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x63, 0x68, 0x61, 0x74, 0x4c, 0x6f,
+ 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x4e, 0x75,
+ 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67,
+ 0x73, 0x4e, 0x75, 0x6d, 0x22, 0x8c, 0x01, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4d,
+ 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x12, 0x16, 0x0a,
+ 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73,
+ 0x65, 0x6e, 0x64, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x12,
+ 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65,
+ 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54,
+ 0x79, 0x70, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4d, 0x73, 0x67,
+ 0x52, 0x65, 0x73, 0x70, 0x22, 0xcf, 0x05, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67,
+ 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x73, 0x67,
+ 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49,
+ 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d,
+ 0x73, 0x67, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49, 0x44, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06,
+ 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65,
+ 0x63, 0x76, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x12, 0x22,
+ 0x0a, 0x0c, 0x72, 0x65, 0x63, 0x76, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x76, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61,
+ 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x74,
+ 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x65,
+ 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x12, 0x26,
+ 0x0a, 0x0e, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4e, 0x69,
+ 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72,
+ 0x46, 0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,
+ 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x12, 0x1c, 0x0a, 0x09,
+ 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65,
+ 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52,
+ 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07,
+ 0x6d, 0x73, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d,
+ 0x73, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65,
+ 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65,
+ 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x54, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x12, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x46,
+ 0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x72,
+ 0x6f, 0x75, 0x70, 0x46, 0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x12, 0x2a, 0x0a, 0x10, 0x67, 0x72,
+ 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14,
+ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x15, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x72,
+ 0x6f, 0x75, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x54, 0x79, 0x70, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x72, 0x6f,
+ 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x32, 0xd0, 0x0f, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x50,
+ 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x20, 0x2e, 0x4f, 0x70,
+ 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73,
+ 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b,
+ 0x77, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70,
+ 0x12, 0x70, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
+ 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74,
+ 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53,
+ 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76,
0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65,
- 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x68,
- 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53,
- 0x65, 0x71, 0x73, 0x12, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
- 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e,
- 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b,
- 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79,
- 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64,
- 0x4d, 0x73, 0x67, 0x12, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
- 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65,
- 0x71, 0x1a, 0x1d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70,
- 0x12, 0x70, 0x0a, 0x15, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
- 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65,
- 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d,
- 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
+ 0x73, 0x70, 0x12, 0x68, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x12, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
+ 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c,
+ 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x52, 0x65,
+ 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x0d,
+ 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
+ 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65,
+ 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x09, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+ 0x4d, 0x73, 0x67, 0x12, 0x1e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
+ 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4d, 0x73, 0x67,
+ 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
+ 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4d, 0x73, 0x67,
+ 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x12,
+ 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d,
+ 0x73, 0x67, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
+ 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x15,
+ 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f,
0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65,
- 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41,
- 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
- 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65,
- 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70,
- 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x55,
- 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65,
- 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73,
- 0x12, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
- 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65,
- 0x71, 0x1a, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52,
- 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67,
- 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x12, 0x2b, 0x2e,
+ 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+ 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e,
+ 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73,
+ 0x67, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c,
+ 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
+ 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43,
+ 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f,
+ 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x12, 0x1f, 0x2e, 0x4f,
+ 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e,
0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
- 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63,
- 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65,
- 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65,
- 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42,
- 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65,
- 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x26, 0x2e,
+ 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12,
+ 0x73, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73,
+ 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
+ 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c,
+ 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79,
+ 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53,
+ 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71,
+ 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73,
+ 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
+ 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c,
+ 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65,
+ 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68,
+ 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x10, 0x53, 0x65,
+ 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25,
+ 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73,
+ 0x67, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
+ 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64,
+ 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a,
+ 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49,
+ 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x53,
+ 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,
+ 0x12, 0x4c, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x1e, 0x2e,
0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
- 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63,
- 0x61, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
- 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d,
- 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61,
- 0x0a, 0x10, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74,
- 0x75, 0x73, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65,
- 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67,
- 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
- 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74,
- 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
- 0x70, 0x12, 0x61, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53,
- 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
- 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64,
- 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f,
- 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e,
- 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
- 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73,
- 0x67, 0x12, 0x1e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65,
- 0x71, 0x1a, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65,
- 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73,
- 0x52, 0x65, 0x61, 0x64, 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72,
- 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73,
- 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
- 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72,
- 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12,
- 0x73, 0x0a, 0x16, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
- 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72,
- 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52,
- 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53,
- 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f,
- 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64,
- 0x52, 0x65, 0x73, 0x70, 0x12, 0x7c, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65,
- 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65,
- 0x71, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65,
- 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
- 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65,
- 0x73, 0x70, 0x12, 0x91, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+ 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
+ 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b,
+ 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64,
+ 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
+ 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65,
+ 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
+ 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67,
+ 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x16, 0x4d,
+ 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41,
+ 0x73, 0x52, 0x65, 0x61, 0x64, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65,
+ 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e,
+ 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52,
+ 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65,
+ 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+ 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70,
+ 0x12, 0x7c, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x12, 0x2e, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
+ 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e,
+ 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67,
+ 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x91,
+ 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78,
+ 0x53, 0x65, 0x71, 0x12, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
+ 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72,
0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e,
- 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
- 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f,
- 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65,
- 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x36,
- 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73,
- 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53,
- 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74,
- 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
+ 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x36, 0x2e, 0x4f, 0x70, 0x65,
+ 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65,
+ 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61,
+ 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65,
+ 0x73, 0x70, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55,
+ 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
+ 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65,
+ 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63,
- 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70,
- 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47,
- 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
- 0x12, 0x5b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f,
- 0x75, 0x70, 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65,
- 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47,
- 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d,
- 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63,
- 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x42, 0x33, 0x5a,
- 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e,
- 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65,
- 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d,
- 0x73, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x0e,
+ 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23,
+ 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73,
+ 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
+ 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76,
+ 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65,
+ 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74,
+ 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44,
+ 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x73, 0x67, 0x62, 0x06,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -2747,7 +3328,7 @@ func file_msg_msg_proto_rawDescGZIP() []byte {
return file_msg_msg_proto_rawDescData
}
-var file_msg_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 48)
+var file_msg_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 53)
var file_msg_msg_proto_goTypes = []interface{}{
(*MsgDataToMQ)(nil), // 0: OpenIMServer.msg.MsgDataToMQ
(*MsgDataToDB)(nil), // 1: OpenIMServer.msg.MsgDataToDB
@@ -2794,79 +3375,90 @@ var file_msg_msg_proto_goTypes = []interface{}{
(*GetActiveGroupReq)(nil), // 42: OpenIMServer.msg.GetActiveGroupReq
(*ActiveGroup)(nil), // 43: OpenIMServer.msg.ActiveGroup
(*GetActiveGroupResp)(nil), // 44: OpenIMServer.msg.GetActiveGroupResp
- nil, // 45: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry
- nil, // 46: OpenIMServer.msg.GetActiveUserResp.DateCountEntry
- nil, // 47: OpenIMServer.msg.GetActiveGroupResp.DateCountEntry
- (*sdkws.MsgData)(nil), // 48: OpenIMServer.sdkws.MsgData
- (*sdkws.RequestPagination)(nil), // 49: OpenIMServer.sdkws.RequestPagination
- (*sdkws.UserInfo)(nil), // 50: OpenIMServer.sdkws.UserInfo
- (*sdkws.GroupInfo)(nil), // 51: OpenIMServer.sdkws.GroupInfo
- (*sdkws.GetMaxSeqReq)(nil), // 52: OpenIMServer.sdkws.GetMaxSeqReq
- (*sdkws.PullMessageBySeqsReq)(nil), // 53: OpenIMServer.sdkws.PullMessageBySeqsReq
- (*sdkws.GetMaxSeqResp)(nil), // 54: OpenIMServer.sdkws.GetMaxSeqResp
- (*sdkws.PullMessageBySeqsResp)(nil), // 55: OpenIMServer.sdkws.PullMessageBySeqsResp
+ (*SearchMessageReq)(nil), // 45: OpenIMServer.msg.SearchMessageReq
+ (*SearchMessageResp)(nil), // 46: OpenIMServer.msg.SearchMessageResp
+ (*ManageMsgReq)(nil), // 47: OpenIMServer.msg.manageMsgReq
+ (*ManageMsgResp)(nil), // 48: OpenIMServer.msg.manageMsgResp
+ (*ChatLog)(nil), // 49: OpenIMServer.msg.ChatLog
+ nil, // 50: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry
+ nil, // 51: OpenIMServer.msg.GetActiveUserResp.DateCountEntry
+ nil, // 52: OpenIMServer.msg.GetActiveGroupResp.DateCountEntry
+ (*sdkws.MsgData)(nil), // 53: OpenIMServer.sdkws.MsgData
+ (*sdkws.RequestPagination)(nil), // 54: OpenIMServer.sdkws.RequestPagination
+ (*sdkws.UserInfo)(nil), // 55: OpenIMServer.sdkws.UserInfo
+ (*sdkws.GroupInfo)(nil), // 56: OpenIMServer.sdkws.GroupInfo
+ (*sdkws.GetMaxSeqReq)(nil), // 57: OpenIMServer.sdkws.GetMaxSeqReq
+ (*sdkws.PullMessageBySeqsReq)(nil), // 58: OpenIMServer.sdkws.PullMessageBySeqsReq
+ (*sdkws.GetMaxSeqResp)(nil), // 59: OpenIMServer.sdkws.GetMaxSeqResp
+ (*sdkws.PullMessageBySeqsResp)(nil), // 60: OpenIMServer.sdkws.PullMessageBySeqsResp
}
var file_msg_msg_proto_depIdxs = []int32{
- 48, // 0: OpenIMServer.msg.MsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData
- 48, // 1: OpenIMServer.msg.MsgDataToDB.msgData:type_name -> OpenIMServer.sdkws.MsgData
- 48, // 2: OpenIMServer.msg.PushMsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData
- 48, // 3: OpenIMServer.msg.MsgDataToMongoByMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData
- 48, // 4: OpenIMServer.msg.SendMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData
- 48, // 5: OpenIMServer.msg.MsgDataToModifyByMQ.messages:type_name -> OpenIMServer.sdkws.MsgData
+ 53, // 0: OpenIMServer.msg.MsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData
+ 53, // 1: OpenIMServer.msg.MsgDataToDB.msgData:type_name -> OpenIMServer.sdkws.MsgData
+ 53, // 2: OpenIMServer.msg.PushMsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData
+ 53, // 3: OpenIMServer.msg.MsgDataToMongoByMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData
+ 53, // 4: OpenIMServer.msg.SendMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData
+ 53, // 5: OpenIMServer.msg.MsgDataToModifyByMQ.messages:type_name -> OpenIMServer.sdkws.MsgData
23, // 6: OpenIMServer.msg.ClearConversationsMsgReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt
23, // 7: OpenIMServer.msg.UserClearAllMsgReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt
23, // 8: OpenIMServer.msg.DeleteMsgsReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt
- 45, // 9: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.seqs:type_name -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry
- 49, // 10: OpenIMServer.msg.GetActiveUserReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination
- 50, // 11: OpenIMServer.msg.ActiveUser.user:type_name -> OpenIMServer.sdkws.UserInfo
- 46, // 12: OpenIMServer.msg.GetActiveUserResp.dateCount:type_name -> OpenIMServer.msg.GetActiveUserResp.DateCountEntry
+ 50, // 9: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.seqs:type_name -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry
+ 54, // 10: OpenIMServer.msg.GetActiveUserReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination
+ 55, // 11: OpenIMServer.msg.ActiveUser.user:type_name -> OpenIMServer.sdkws.UserInfo
+ 51, // 12: OpenIMServer.msg.GetActiveUserResp.dateCount:type_name -> OpenIMServer.msg.GetActiveUserResp.DateCountEntry
40, // 13: OpenIMServer.msg.GetActiveUserResp.users:type_name -> OpenIMServer.msg.ActiveUser
- 49, // 14: OpenIMServer.msg.GetActiveGroupReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination
- 51, // 15: OpenIMServer.msg.ActiveGroup.group:type_name -> OpenIMServer.sdkws.GroupInfo
- 47, // 16: OpenIMServer.msg.GetActiveGroupResp.dateCount:type_name -> OpenIMServer.msg.GetActiveGroupResp.DateCountEntry
+ 54, // 14: OpenIMServer.msg.GetActiveGroupReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination
+ 56, // 15: OpenIMServer.msg.ActiveGroup.group:type_name -> OpenIMServer.sdkws.GroupInfo
+ 52, // 16: OpenIMServer.msg.GetActiveGroupResp.dateCount:type_name -> OpenIMServer.msg.GetActiveGroupResp.DateCountEntry
43, // 17: OpenIMServer.msg.GetActiveGroupResp.groups:type_name -> OpenIMServer.msg.ActiveGroup
- 37, // 18: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry.value:type_name -> OpenIMServer.msg.Seqs
- 52, // 19: OpenIMServer.msg.msg.GetMaxSeq:input_type -> OpenIMServer.sdkws.GetMaxSeqReq
- 34, // 20: OpenIMServer.msg.msg.GetConversationMaxSeq:input_type -> OpenIMServer.msg.GetConversationMaxSeqReq
- 53, // 21: OpenIMServer.msg.msg.PullMessageBySeqs:input_type -> OpenIMServer.sdkws.PullMessageBySeqsReq
- 6, // 22: OpenIMServer.msg.msg.SendMsg:input_type -> OpenIMServer.msg.SendMsgReq
- 24, // 23: OpenIMServer.msg.msg.ClearConversationsMsg:input_type -> OpenIMServer.msg.ClearConversationsMsgReq
- 26, // 24: OpenIMServer.msg.msg.UserClearAllMsg:input_type -> OpenIMServer.msg.UserClearAllMsgReq
- 28, // 25: OpenIMServer.msg.msg.DeleteMsgs:input_type -> OpenIMServer.msg.DeleteMsgsReq
- 32, // 26: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:input_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqReq
- 30, // 27: OpenIMServer.msg.msg.DeleteMsgPhysical:input_type -> OpenIMServer.msg.DeleteMsgPhysicalReq
- 8, // 28: OpenIMServer.msg.msg.SetSendMsgStatus:input_type -> OpenIMServer.msg.SetSendMsgStatusReq
- 10, // 29: OpenIMServer.msg.msg.GetSendMsgStatus:input_type -> OpenIMServer.msg.GetSendMsgStatusReq
- 15, // 30: OpenIMServer.msg.msg.RevokeMsg:input_type -> OpenIMServer.msg.RevokeMsgReq
- 17, // 31: OpenIMServer.msg.msg.MarkMsgsAsRead:input_type -> OpenIMServer.msg.MarkMsgsAsReadReq
- 19, // 32: OpenIMServer.msg.msg.MarkConversationAsRead:input_type -> OpenIMServer.msg.MarkConversationAsReadReq
- 21, // 33: OpenIMServer.msg.msg.SetConversationHasReadSeq:input_type -> OpenIMServer.msg.SetConversationHasReadSeqReq
- 36, // 34: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:input_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqReq
- 39, // 35: OpenIMServer.msg.msg.GetActiveUser:input_type -> OpenIMServer.msg.GetActiveUserReq
- 42, // 36: OpenIMServer.msg.msg.GetActiveGroup:input_type -> OpenIMServer.msg.GetActiveGroupReq
- 54, // 37: OpenIMServer.msg.msg.GetMaxSeq:output_type -> OpenIMServer.sdkws.GetMaxSeqResp
- 35, // 38: OpenIMServer.msg.msg.GetConversationMaxSeq:output_type -> OpenIMServer.msg.GetConversationMaxSeqResp
- 55, // 39: OpenIMServer.msg.msg.PullMessageBySeqs:output_type -> OpenIMServer.sdkws.PullMessageBySeqsResp
- 7, // 40: OpenIMServer.msg.msg.SendMsg:output_type -> OpenIMServer.msg.SendMsgResp
- 25, // 41: OpenIMServer.msg.msg.ClearConversationsMsg:output_type -> OpenIMServer.msg.ClearConversationsMsgResp
- 27, // 42: OpenIMServer.msg.msg.UserClearAllMsg:output_type -> OpenIMServer.msg.UserClearAllMsgResp
- 29, // 43: OpenIMServer.msg.msg.DeleteMsgs:output_type -> OpenIMServer.msg.DeleteMsgsResp
- 33, // 44: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:output_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqResp
- 31, // 45: OpenIMServer.msg.msg.DeleteMsgPhysical:output_type -> OpenIMServer.msg.DeleteMsgPhysicalResp
- 9, // 46: OpenIMServer.msg.msg.SetSendMsgStatus:output_type -> OpenIMServer.msg.SetSendMsgStatusResp
- 11, // 47: OpenIMServer.msg.msg.GetSendMsgStatus:output_type -> OpenIMServer.msg.GetSendMsgStatusResp
- 16, // 48: OpenIMServer.msg.msg.RevokeMsg:output_type -> OpenIMServer.msg.RevokeMsgResp
- 18, // 49: OpenIMServer.msg.msg.MarkMsgsAsRead:output_type -> OpenIMServer.msg.MarkMsgsAsReadResp
- 20, // 50: OpenIMServer.msg.msg.MarkConversationAsRead:output_type -> OpenIMServer.msg.MarkConversationAsReadResp
- 22, // 51: OpenIMServer.msg.msg.SetConversationHasReadSeq:output_type -> OpenIMServer.msg.SetConversationHasReadSeqResp
- 38, // 52: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:output_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp
- 41, // 53: OpenIMServer.msg.msg.GetActiveUser:output_type -> OpenIMServer.msg.GetActiveUserResp
- 44, // 54: OpenIMServer.msg.msg.GetActiveGroup:output_type -> OpenIMServer.msg.GetActiveGroupResp
- 37, // [37:55] is the sub-list for method output_type
- 19, // [19:37] is the sub-list for method input_type
- 19, // [19:19] is the sub-list for extension type_name
- 19, // [19:19] is the sub-list for extension extendee
- 0, // [0:19] is the sub-list for field type_name
+ 54, // 18: OpenIMServer.msg.SearchMessageReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination
+ 49, // 19: OpenIMServer.msg.SearchMessageResp.chatLogs:type_name -> OpenIMServer.msg.ChatLog
+ 37, // 20: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry.value:type_name -> OpenIMServer.msg.Seqs
+ 57, // 21: OpenIMServer.msg.msg.GetMaxSeq:input_type -> OpenIMServer.sdkws.GetMaxSeqReq
+ 34, // 22: OpenIMServer.msg.msg.GetConversationMaxSeq:input_type -> OpenIMServer.msg.GetConversationMaxSeqReq
+ 58, // 23: OpenIMServer.msg.msg.PullMessageBySeqs:input_type -> OpenIMServer.sdkws.PullMessageBySeqsReq
+ 45, // 24: OpenIMServer.msg.msg.SearchMessage:input_type -> OpenIMServer.msg.SearchMessageReq
+ 47, // 25: OpenIMServer.msg.msg.ManageMsg:input_type -> OpenIMServer.msg.manageMsgReq
+ 6, // 26: OpenIMServer.msg.msg.SendMsg:input_type -> OpenIMServer.msg.SendMsgReq
+ 24, // 27: OpenIMServer.msg.msg.ClearConversationsMsg:input_type -> OpenIMServer.msg.ClearConversationsMsgReq
+ 26, // 28: OpenIMServer.msg.msg.UserClearAllMsg:input_type -> OpenIMServer.msg.UserClearAllMsgReq
+ 28, // 29: OpenIMServer.msg.msg.DeleteMsgs:input_type -> OpenIMServer.msg.DeleteMsgsReq
+ 32, // 30: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:input_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqReq
+ 30, // 31: OpenIMServer.msg.msg.DeleteMsgPhysical:input_type -> OpenIMServer.msg.DeleteMsgPhysicalReq
+ 8, // 32: OpenIMServer.msg.msg.SetSendMsgStatus:input_type -> OpenIMServer.msg.SetSendMsgStatusReq
+ 10, // 33: OpenIMServer.msg.msg.GetSendMsgStatus:input_type -> OpenIMServer.msg.GetSendMsgStatusReq
+ 15, // 34: OpenIMServer.msg.msg.RevokeMsg:input_type -> OpenIMServer.msg.RevokeMsgReq
+ 17, // 35: OpenIMServer.msg.msg.MarkMsgsAsRead:input_type -> OpenIMServer.msg.MarkMsgsAsReadReq
+ 19, // 36: OpenIMServer.msg.msg.MarkConversationAsRead:input_type -> OpenIMServer.msg.MarkConversationAsReadReq
+ 21, // 37: OpenIMServer.msg.msg.SetConversationHasReadSeq:input_type -> OpenIMServer.msg.SetConversationHasReadSeqReq
+ 36, // 38: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:input_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqReq
+ 39, // 39: OpenIMServer.msg.msg.GetActiveUser:input_type -> OpenIMServer.msg.GetActiveUserReq
+ 42, // 40: OpenIMServer.msg.msg.GetActiveGroup:input_type -> OpenIMServer.msg.GetActiveGroupReq
+ 59, // 41: OpenIMServer.msg.msg.GetMaxSeq:output_type -> OpenIMServer.sdkws.GetMaxSeqResp
+ 35, // 42: OpenIMServer.msg.msg.GetConversationMaxSeq:output_type -> OpenIMServer.msg.GetConversationMaxSeqResp
+ 60, // 43: OpenIMServer.msg.msg.PullMessageBySeqs:output_type -> OpenIMServer.sdkws.PullMessageBySeqsResp
+ 46, // 44: OpenIMServer.msg.msg.SearchMessage:output_type -> OpenIMServer.msg.SearchMessageResp
+ 48, // 45: OpenIMServer.msg.msg.ManageMsg:output_type -> OpenIMServer.msg.manageMsgResp
+ 7, // 46: OpenIMServer.msg.msg.SendMsg:output_type -> OpenIMServer.msg.SendMsgResp
+ 25, // 47: OpenIMServer.msg.msg.ClearConversationsMsg:output_type -> OpenIMServer.msg.ClearConversationsMsgResp
+ 27, // 48: OpenIMServer.msg.msg.UserClearAllMsg:output_type -> OpenIMServer.msg.UserClearAllMsgResp
+ 29, // 49: OpenIMServer.msg.msg.DeleteMsgs:output_type -> OpenIMServer.msg.DeleteMsgsResp
+ 33, // 50: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:output_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqResp
+ 31, // 51: OpenIMServer.msg.msg.DeleteMsgPhysical:output_type -> OpenIMServer.msg.DeleteMsgPhysicalResp
+ 9, // 52: OpenIMServer.msg.msg.SetSendMsgStatus:output_type -> OpenIMServer.msg.SetSendMsgStatusResp
+ 11, // 53: OpenIMServer.msg.msg.GetSendMsgStatus:output_type -> OpenIMServer.msg.GetSendMsgStatusResp
+ 16, // 54: OpenIMServer.msg.msg.RevokeMsg:output_type -> OpenIMServer.msg.RevokeMsgResp
+ 18, // 55: OpenIMServer.msg.msg.MarkMsgsAsRead:output_type -> OpenIMServer.msg.MarkMsgsAsReadResp
+ 20, // 56: OpenIMServer.msg.msg.MarkConversationAsRead:output_type -> OpenIMServer.msg.MarkConversationAsReadResp
+ 22, // 57: OpenIMServer.msg.msg.SetConversationHasReadSeq:output_type -> OpenIMServer.msg.SetConversationHasReadSeqResp
+ 38, // 58: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:output_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp
+ 41, // 59: OpenIMServer.msg.msg.GetActiveUser:output_type -> OpenIMServer.msg.GetActiveUserResp
+ 44, // 60: OpenIMServer.msg.msg.GetActiveGroup:output_type -> OpenIMServer.msg.GetActiveGroupResp
+ 41, // [41:61] is the sub-list for method output_type
+ 21, // [21:41] is the sub-list for method input_type
+ 21, // [21:21] is the sub-list for extension type_name
+ 21, // [21:21] is the sub-list for extension extendee
+ 0, // [0:21] is the sub-list for field type_name
}
func init() { file_msg_msg_proto_init() }
@@ -3415,6 +4007,66 @@ func file_msg_msg_proto_init() {
return nil
}
}
+ file_msg_msg_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SearchMessageReq); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_msg_msg_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SearchMessageResp); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_msg_msg_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ManageMsgReq); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_msg_msg_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ManageMsgResp); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_msg_msg_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatLog); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
@@ -3422,7 +4074,7 @@ func file_msg_msg_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_msg_msg_proto_rawDesc,
NumEnums: 0,
- NumMessages: 48,
+ NumMessages: 53,
NumExtensions: 0,
NumServices: 1,
},
@@ -3453,6 +4105,8 @@ type MsgClient interface {
GetConversationMaxSeq(ctx context.Context, in *GetConversationMaxSeqReq, opts ...grpc.CallOption) (*GetConversationMaxSeqResp, error)
// 拉取历史消息(包括用户的,以及指定群组的)
PullMessageBySeqs(ctx context.Context, in *sdkws.PullMessageBySeqsReq, opts ...grpc.CallOption) (*sdkws.PullMessageBySeqsResp, error)
+ SearchMessage(ctx context.Context, in *SearchMessageReq, opts ...grpc.CallOption) (*SearchMessageResp, error)
+ ManageMsg(ctx context.Context, in *ManageMsgReq, opts ...grpc.CallOption) (*ManageMsgResp, error)
// 发送消息
SendMsg(ctx context.Context, in *SendMsgReq, opts ...grpc.CallOption) (*SendMsgResp, error)
// 全量清空指定会话消息 重置min seq 比最大seq大1
@@ -3514,6 +4168,24 @@ func (c *msgClient) PullMessageBySeqs(ctx context.Context, in *sdkws.PullMessage
return out, nil
}
+func (c *msgClient) SearchMessage(ctx context.Context, in *SearchMessageReq, opts ...grpc.CallOption) (*SearchMessageResp, error) {
+ out := new(SearchMessageResp)
+ err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/SearchMessage", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *msgClient) ManageMsg(ctx context.Context, in *ManageMsgReq, opts ...grpc.CallOption) (*ManageMsgResp, error) {
+ out := new(ManageMsgResp)
+ err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/ManageMsg", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *msgClient) SendMsg(ctx context.Context, in *SendMsgReq, opts ...grpc.CallOption) (*SendMsgResp, error) {
out := new(SendMsgResp)
err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/SendMsg", in, out, opts...)
@@ -3656,6 +4328,8 @@ type MsgServer interface {
GetConversationMaxSeq(context.Context, *GetConversationMaxSeqReq) (*GetConversationMaxSeqResp, error)
// 拉取历史消息(包括用户的,以及指定群组的)
PullMessageBySeqs(context.Context, *sdkws.PullMessageBySeqsReq) (*sdkws.PullMessageBySeqsResp, error)
+ SearchMessage(context.Context, *SearchMessageReq) (*SearchMessageResp, error)
+ ManageMsg(context.Context, *ManageMsgReq) (*ManageMsgResp, error)
// 发送消息
SendMsg(context.Context, *SendMsgReq) (*SendMsgResp, error)
// 全量清空指定会话消息 重置min seq 比最大seq大1
@@ -3695,6 +4369,12 @@ func (*UnimplementedMsgServer) GetConversationMaxSeq(context.Context, *GetConver
func (*UnimplementedMsgServer) PullMessageBySeqs(context.Context, *sdkws.PullMessageBySeqsReq) (*sdkws.PullMessageBySeqsResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method PullMessageBySeqs not implemented")
}
+func (*UnimplementedMsgServer) SearchMessage(context.Context, *SearchMessageReq) (*SearchMessageResp, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SearchMessage not implemented")
+}
+func (*UnimplementedMsgServer) ManageMsg(context.Context, *ManageMsgReq) (*ManageMsgResp, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ManageMsg not implemented")
+}
func (*UnimplementedMsgServer) SendMsg(context.Context, *SendMsgReq) (*SendMsgResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method SendMsg not implemented")
}
@@ -3799,6 +4479,42 @@ func _Msg_PullMessageBySeqs_Handler(srv interface{}, ctx context.Context, dec fu
return interceptor(ctx, in, info, handler)
}
+func _Msg_SearchMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SearchMessageReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(MsgServer).SearchMessage(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/OpenIMServer.msg.msg/SearchMessage",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(MsgServer).SearchMessage(ctx, req.(*SearchMessageReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_ManageMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ManageMsgReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(MsgServer).ManageMsg(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/OpenIMServer.msg.msg/ManageMsg",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(MsgServer).ManageMsg(ctx, req.(*ManageMsgReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _Msg_SendMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SendMsgReq)
if err := dec(in); err != nil {
@@ -4085,6 +4801,14 @@ var _Msg_serviceDesc = grpc.ServiceDesc{
MethodName: "PullMessageBySeqs",
Handler: _Msg_PullMessageBySeqs_Handler,
},
+ {
+ MethodName: "SearchMessage",
+ Handler: _Msg_SearchMessage_Handler,
+ },
+ {
+ MethodName: "ManageMsg",
+ Handler: _Msg_ManageMsg_Handler,
+ },
{
MethodName: "SendMsg",
Handler: _Msg_SendMsg_Handler,
diff --git a/pkg/proto/msg/msg.proto b/pkg/proto/msg/msg.proto
index d67195d44..ba9852740 100644
--- a/pkg/proto/msg/msg.proto
+++ b/pkg/proto/msg/msg.proto
@@ -232,12 +232,66 @@ message GetActiveGroupResp {
repeated ActiveGroup groups = 4;
}
+message SearchMessageReq{
+ string sendID=1;//发送者ID
+ string recvID=2;//接收者ID
+ int32 msgType=3;
+ string sendTime=4;
+ int32 sessionType=5;
+ sdkws.RequestPagination pagination = 6;
+}
+
+message SearchMessageResp{
+ repeated ChatLog chatLogs=1;
+ int32 chatLogsNum = 2;
+}
+
+message manageMsgReq{
+ string recvID=1;
+ string sendID=2;
+ string groupID=3;
+ int64 seq=4;
+ int32 sessionType=5;
+}
+
+message manageMsgResp{
+}
+
+message ChatLog {
+ string serverMsgID = 1;
+ string clientMsgID = 2;
+ string sendID = 3;
+ string recvID = 4;
+ string groupID = 5;
+ string recvNickname = 6;
+ int32 senderPlatformID = 7;
+ string senderNickname = 8;
+ string senderFaceURL = 9;
+ string groupName = 10;
+ int32 sessionType = 11;
+ int32 msgFrom = 12;
+ int32 contentType = 13;
+ string content = 14;
+ int32 status = 15;
+ int64 sendTime = 16;
+ int64 createTime = 17;
+ string ex = 18;
+ string groupFaceURL=19;
+ uint32 groupMemberCount=20;
+ int64 seq=21;
+ string groupOwner=22;
+ int32 groupType=23;
+}
+
+
service msg {
//获取最小最大seq(包括用户的,以及指定群组的)
rpc GetMaxSeq(sdkws.GetMaxSeqReq) returns(sdkws.GetMaxSeqResp);
rpc GetConversationMaxSeq(GetConversationMaxSeqReq) returns(GetConversationMaxSeqResp);
//拉取历史消息(包括用户的,以及指定群组的)
rpc PullMessageBySeqs(sdkws.PullMessageBySeqsReq) returns(sdkws.PullMessageBySeqsResp);
+ rpc SearchMessage(SearchMessageReq) returns(SearchMessageResp);
+ rpc ManageMsg(manageMsgReq) returns (manageMsgResp);
//发送消息
rpc SendMsg(SendMsgReq) returns(SendMsgResp);
diff --git a/pkg/proto/msggateway/msggateway.pb.go b/pkg/proto/msggateway/msggateway.pb.go
index 6d3aa576a..d922d98b4 100644
--- a/pkg/proto/msggateway/msggateway.pb.go
+++ b/pkg/proto/msggateway/msggateway.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,16 +22,14 @@ package msggateway
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/push/push.pb.go b/pkg/proto/push/push.pb.go
index f9ef4a08a..1dc9d2ab9 100644
--- a/pkg/proto/push/push.pb.go
+++ b/pkg/proto/push/push.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,16 +22,14 @@ package push
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/sdkws/sdkws.pb.go b/pkg/proto/sdkws/sdkws.pb.go
index f2038ee5a..b45d46d4c 100644
--- a/pkg/proto/sdkws/sdkws.pb.go
+++ b/pkg/proto/sdkws/sdkws.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -7,13 +21,11 @@
package sdkws
import (
- reflect "reflect"
- sync "sync"
-
+ wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/statistics/statistics.pb.go b/pkg/proto/statistics/statistics.pb.go
index 092f67b52..5660758f9 100644
--- a/pkg/proto/statistics/statistics.pb.go
+++ b/pkg/proto/statistics/statistics.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -7,10 +21,9 @@
package statistics
import (
- reflect "reflect"
-
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
)
const (
diff --git a/pkg/proto/third/third.pb.go b/pkg/proto/third/third.pb.go
index 1ba6c3a05..155b5f7cc 100644
--- a/pkg/proto/third/third.pb.go
+++ b/pkg/proto/third/third.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,14 +22,13 @@ package third
import (
context "context"
- reflect "reflect"
- sync "sync"
-
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/user/user.pb.go b/pkg/proto/user/user.pb.go
index c96acb4a4..5046505db 100644
--- a/pkg/proto/user/user.pb.go
+++ b/pkg/proto/user/user.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -8,17 +22,15 @@ package user
import (
context "context"
- reflect "reflect"
- sync "sync"
-
+ conversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
+ sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-
- conversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
- sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/proto/wrapperspb/wrapperspb.pb.go b/pkg/proto/wrapperspb/wrapperspb.pb.go
index 2bb8b39db..9678bb2a0 100644
--- a/pkg/proto/wrapperspb/wrapperspb.pb.go
+++ b/pkg/proto/wrapperspb/wrapperspb.pb.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.
+
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.29.1
@@ -7,11 +21,10 @@
package wrapperspb
import (
- reflect "reflect"
- sync "sync"
-
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
)
const (
diff --git a/pkg/rpcclient/msg.go b/pkg/rpcclient/msg.go
index 9e7b481cd..df7e24194 100644
--- a/pkg/rpcclient/msg.go
+++ b/pkg/rpcclient/msg.go
@@ -3,6 +3,7 @@ package rpcclient
import (
"context"
"encoding/json"
+ "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
"google.golang.org/grpc"
"google.golang.org/protobuf/proto"
@@ -283,3 +284,16 @@ func (s *NotificationSender) Notification(
) error {
return s.NotificationWithSesstionType(ctx, sendID, recvID, contentType, s.sessionTypeConf[contentType], m, opts...)
}
+
+func (m *Message) GetAllUserID(ctx context.Context, req *user.GetAllUserIDReq) (*user.GetAllUserIDResp, error) {
+ conn, err := m.discov.GetConn(context.Background(), config.Config.RpcRegisterName.OpenImMsgName)
+ if err != nil {
+ panic(err)
+ }
+ client := user.NewUserClient(conn)
+ resp, err := client.GetAllUserID(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
diff --git a/pkg/rpcclient/third.go b/pkg/rpcclient/third.go
index 4f57cbd69..578586ca3 100644
--- a/pkg/rpcclient/third.go
+++ b/pkg/rpcclient/third.go
@@ -16,6 +16,9 @@ package rpcclient
import (
"context"
+ "github.com/minio/minio-go/v7"
+ "github.com/minio/minio-go/v7/pkg/credentials"
+ "net/url"
"google.golang.org/grpc"
@@ -25,9 +28,10 @@ import (
)
type Third struct {
- conn grpc.ClientConnInterface
- Client third.ThirdClient
- discov discoveryregistry.SvcDiscoveryRegistry
+ conn grpc.ClientConnInterface
+ Client third.ThirdClient
+ discov discoveryregistry.SvcDiscoveryRegistry
+ MinioClient *minio.Client
}
func NewThird(discov discoveryregistry.SvcDiscoveryRegistry) *Third {
@@ -36,5 +40,30 @@ func NewThird(discov discoveryregistry.SvcDiscoveryRegistry) *Third {
panic(err)
}
client := third.NewThirdClient(conn)
- return &Third{discov: discov, Client: client, conn: conn}
+ minioClient, err := minioInit()
+ return &Third{discov: discov, Client: client, conn: conn, MinioClient: minioClient}
+}
+
+func minioInit() (*minio.Client, error) {
+ minioClient := &minio.Client{}
+ var initUrl string
+ initUrl = config.Config.Object.Minio.Endpoint
+ minioUrl, err := url.Parse(initUrl)
+ if err != nil {
+ return nil, err
+ }
+ opts := &minio.Options{
+ Creds: credentials.NewStaticV4(config.Config.Object.Minio.AccessKeyID, config.Config.Object.Minio.SecretAccessKey, ""),
+ //Region: config.Config.Credential.Minio.Location,
+ }
+ if minioUrl.Scheme == "http" {
+ opts.Secure = false
+ } else if minioUrl.Scheme == "https" {
+ opts.Secure = true
+ }
+ minioClient, err = minio.New(minioUrl.Host, opts)
+ if err != nil {
+ return nil, err
+ }
+ return minioClient, nil
}
From e5ab278be5d4443987fa7520d017da41607af945 Mon Sep 17 00:00:00 2001
From: Gordon <46924906+FGadvancer@users.noreply.github.com>
Date: Thu, 13 Jul 2023 15:17:05 +0800
Subject: [PATCH 8/9] fix: get user online status #472 (#527)
* statistics user register
* refactor: router change
* minio init
* UserRegisterCount
* push use local conn
* refactor: user pb update
* remove online push close grpc conn
* refactor: user pb update
* refactor:pb file
* msgs statistics
* msgs statistics
* revoke userID
* refactor: errcode update
* active user
* active user
* active user
* refactor: errcode update
* feat: conn update token
* active user
* active user
* feat: conn update token
* active user
* feat: conn update token
* feat: conn update token
* feat: conn update token
* add tx_oss cos
* active user
* active user
* group create
* group create
* feat: group notification show to conversation
* feat: group notification show to conversation
* group active
* user active
* sendNotificationWithName
* withname
* privateChat
* a2r call option
* grpc with detail return error
* change log error
* chain unary interceptor
* api nil slice map
* fix sync has read
* fix: text update
* fix: update add model
* set conversations update
* set privateChat
* fix: content update
* remove unuse rpc
* msgDestruct
* cron use rpc mw
* set IsMsgDestruct
* msg destruct
* msgDestruct
* s3 minio, cos, oss support
* feat: add implement of GetUsersOnlineStatus, #472 (#477)
* s3 minio, cos, oss support
* s3 route
* remove extendMsg code
* s3 route
* remove unuse code
* s3 pb
* s3 pb
* s3 pb
* s3 presigned put
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* Update .gitignore (#482)
* s3 debug log
* s3 debug log
* cron add log and fix cron
* add log
* cron
* s3 config
* fix kick user bug
* s3 cos
* add kick log
* s3 cos test
* s3 cos test
* s3 cos test
* kick user log
* kickuserlog
* s3 cos copy
* s3 cos copy
* s3 url
* s3 url
* s3 AccessURL
* log
* s3 InitiateMultipartUpload add ExpireTime
* feat: regenerate pb file
* feat: regenerate pb file
* Revert "feat: regenerate pb file"
This reverts commit 434f22564a89f816cbe944ab61bd9ff3414f0885.
* Delete .idea directory
* feat: regenerate pb file
* fix: remove import C
* fix: add msg transfer main file
* fix: get user online status fix
---------
Co-authored-by: withchao <993506633@qq.com>
Co-authored-by: wangchuxiao
Co-authored-by: BanTanger <88583317+BanTanger@users.noreply.github.com>
Co-authored-by: withchao <48119764+withchao@users.noreply.github.com>
Co-authored-by: Alan <68671759+hanzhixiao@users.noreply.github.com>
---
internal/api/user.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/api/user.go b/internal/api/user.go
index 4e3fb7f7f..4e9d1b0c7 100644
--- a/internal/api/user.go
+++ b/internal/api/user.go
@@ -107,7 +107,7 @@ func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) {
}
if !flag {
res.UserID = v1
- res.Status = constant.OnlineStatus
+ res.Status = constant.OfflineStatus
}
respResult = append(respResult, res)
}
From 4cacc3f6216c01b390ea99a96c69e54d3be52cd8 Mon Sep 17 00:00:00 2001
From: WangchuXiao
Date: Thu, 13 Jul 2023 15:26:25 +0800
Subject: [PATCH 9/9] fix bug: friend, args error (#534)
* fix bug: args error
* fix bug: args error
* fix bug: add friend need update both request
* fix bug: add friend need update both request
---
internal/rpc/friend/friend.go | 2 +-
pkg/common/constant/constant.go | 5 +++--
pkg/common/convert/black.go | 3 +++
pkg/common/convert/friend.go | 6 ++++++
pkg/common/db/controller/friend.go | 17 ++++++++++++++++-
pkg/proto/group/group.go | 3 ---
pkg/proto/msg/msg.go | 12 ------------
7 files changed, 29 insertions(+), 19 deletions(-)
diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go
index c07b1423c..4c528d1d1 100644
--- a/internal/rpc/friend/friend.go
+++ b/internal/rpc/friend/friend.go
@@ -246,7 +246,6 @@ func (s *friendServer) GetPaginationFriendsApplyTo(
req *pbfriend.GetPaginationFriendsApplyToReq,
) (resp *pbfriend.GetPaginationFriendsApplyToResp, err error) {
defer log.ZInfo(ctx, utils.GetFuncName()+" Return")
- resp = &pbfriend.GetPaginationFriendsApplyToResp{}
if err := s.userRpcClient.Access(ctx, req.UserID); err != nil {
return nil, err
}
@@ -255,6 +254,7 @@ func (s *friendServer) GetPaginationFriendsApplyTo(
if err != nil {
return nil, err
}
+ resp = &pbfriend.GetPaginationFriendsApplyToResp{}
resp.FriendRequests, err = convert.FriendRequestDB2Pb(ctx, friendRequests, s.userRpcClient.GetUsersInfoMap)
if err != nil {
return nil, err
diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go
index ef33b9867..2e5432b48 100644
--- a/pkg/common/constant/constant.go
+++ b/pkg/common/constant/constant.go
@@ -291,8 +291,9 @@ const (
GroupResponseAgree = 1
GroupResponseRefuse = -1
- FriendResponseAgree = 1
- FriendResponseRefuse = -1
+ FriendResponseNotHandle = 0
+ FriendResponseAgree = 1
+ FriendResponseRefuse = -1
Male = 1
Female = 2
diff --git a/pkg/common/convert/black.go b/pkg/common/convert/black.go
index 684a40d0d..ba0e2a5da 100644
--- a/pkg/common/convert/black.go
+++ b/pkg/common/convert/black.go
@@ -27,6 +27,9 @@ func BlackDB2Pb(
blackDBs []*relation.BlackModel,
f func(ctx context.Context, userIDs []string) (map[string]*sdkws.UserInfo, error),
) (blackPbs []*sdk.BlackInfo, err error) {
+ if len(blackDBs) == 0 {
+ return nil, nil
+ }
var userIDs []string
for _, blackDB := range blackDBs {
userIDs = append(userIDs, blackDB.BlockUserID)
diff --git a/pkg/common/convert/friend.go b/pkg/common/convert/friend.go
index 018aee42f..0531ad195 100644
--- a/pkg/common/convert/friend.go
+++ b/pkg/common/convert/friend.go
@@ -54,6 +54,9 @@ func FriendsDB2Pb(
friendsDB []*relation.FriendModel,
getUsers func(ctx context.Context, userIDs []string) (map[string]*sdkws.UserInfo, error),
) (friendsPb []*sdkws.FriendInfo, err error) {
+ if len(friendsDB) == 0 {
+ return nil, nil
+ }
var userID []string
for _, friendDB := range friendsDB {
userID = append(userID, friendDB.FriendUserID)
@@ -80,6 +83,9 @@ func FriendRequestDB2Pb(
friendRequests []*relation.FriendRequestModel,
getUsers func(ctx context.Context, userIDs []string) (map[string]*sdkws.UserInfo, error),
) ([]*sdkws.FriendRequest, error) {
+ if len(friendRequests) == 0 {
+ return nil, nil
+ }
userIDMap := make(map[string]struct{})
for _, friendRequest := range friendRequests {
userIDMap[friendRequest.ToUserID] = struct{}{}
diff --git a/pkg/common/db/controller/friend.go b/pkg/common/db/controller/friend.go
index 116345219..4d549efcf 100644
--- a/pkg/common/db/controller/friend.go
+++ b/pkg/common/db/controller/friend.go
@@ -221,6 +221,7 @@ func (f *friendDatabase) AgreeFriendRequest(
friendRequest *relation.FriendRequestModel,
) (err error) {
return f.tx.Transaction(func(tx any) error {
+ now := time.Now()
fr, err := f.friendRequest.NewTx(tx).Take(ctx, friendRequest.FromUserID, friendRequest.ToUserID)
if err != nil {
return err
@@ -230,11 +231,25 @@ func (f *friendDatabase) AgreeFriendRequest(
}
friendRequest.HandlerUserID = mcontext.GetOpUserID(ctx)
friendRequest.HandleResult = constant.FriendResponseAgree
- friendRequest.HandleTime = time.Now()
+ friendRequest.HandleTime = now
err = f.friendRequest.NewTx(tx).Update(ctx, friendRequest)
if err != nil {
return err
}
+
+ fr2, err := f.friendRequest.NewTx(tx).Take(ctx, friendRequest.ToUserID, friendRequest.FromUserID)
+ if err == nil && fr2.HandleResult == constant.FriendResponseNotHandle {
+ fr2.HandlerUserID = mcontext.GetOpUserID(ctx)
+ fr2.HandleResult = constant.FriendResponseAgree
+ fr2.HandleTime = now
+ err = f.friendRequest.NewTx(tx).Update(ctx, fr2)
+ if err != nil {
+ return err
+ }
+ } else if errs.Unwrap(err) != gorm.ErrRecordNotFound {
+ return err
+ }
+
exists, err := f.friend.NewTx(tx).FindUserState(ctx, friendRequest.FromUserID, friendRequest.ToUserID)
if err != nil {
return err
diff --git a/pkg/proto/group/group.go b/pkg/proto/group/group.go
index 64e7f0f61..5b387cb3a 100644
--- a/pkg/proto/group/group.go
+++ b/pkg/proto/group/group.go
@@ -23,9 +23,6 @@ func (x *CreateGroupReq) Check() error {
if x.GroupInfo == nil {
return errs.ErrArgs.Wrap("groupInfo is empty")
}
- if x.GroupInfo.OwnerUserID == "" {
- return errs.ErrArgs.Wrap("GroupInfo.ownerUserID")
- }
if x.GroupInfo.GroupType > 2 || x.GroupInfo.GroupType < 0 {
return errs.ErrArgs.Wrap("GroupType is invalid")
}
diff --git a/pkg/proto/msg/msg.go b/pkg/proto/msg/msg.go
index aeb6deece..62b776856 100644
--- a/pkg/proto/msg/msg.go
+++ b/pkg/proto/msg/msg.go
@@ -133,9 +133,6 @@ func (x *MarkConversationAsReadReq) Check() error {
if x.ConversationID == "" {
return errs.ErrArgs.Wrap("conversationID is empty")
}
- if x.Seqs == nil {
- return errs.ErrArgs.Wrap("seqs is empty")
- }
if x.UserID == "" {
return errs.ErrArgs.Wrap("userID is empty")
}
@@ -165,9 +162,6 @@ func (x *ClearConversationsMsgReq) Check() error {
if x.UserID == "" {
return errs.ErrArgs.Wrap("userID is empty")
}
- if x.DeleteSyncOpt == nil {
- return errs.ErrArgs.Wrap("deleteSyncOpt is empty")
- }
return nil
}
@@ -175,9 +169,6 @@ func (x *UserClearAllMsgReq) Check() error {
if x.UserID == "" {
return errs.ErrArgs.Wrap("userID is empty")
}
- if x.DeleteSyncOpt == nil {
- return errs.ErrArgs.Wrap("deleteSyncOpt is empty")
- }
return nil
}
@@ -191,9 +182,6 @@ func (x *DeleteMsgsReq) Check() error {
if x.Seqs == nil {
return errs.ErrArgs.Wrap("seqs is empty")
}
- if x.DeleteSyncOpt == nil {
- return errs.ErrArgs.Wrap("deleteSyncOpt is empty")
- }
return nil
}