commit 39dbe3a57d344ec102ed1a3b9d3a8197b3afc75b
Author: wehub-resource-sync to make links put returns between paragraphs _italic_ or **bold** indent code by 4 spaces quote by placing backtick escapes create code fences with backticks We do not allow deleting tag with posts. Please remove this tag from the posts first. Are you sure you want to add another answer? You could use the edit link to refine and improve your existing answer, instead.
+
+
+# Apache Answer - Build Q&A platform
+
+A Q&A platform software for teams at any scales. Whether it’s a community forum, help center, or knowledge management platform, you can always count on Answer.
+
+To learn more about the project, visit [answer.apache.org](https://answer.apache.org).
+
+[](https://github.com/apache/answer/blob/main/LICENSE)
+[](https://golang.org/)
+[](https://reactjs.org/)
+[](https://goreportcard.com/report/github.com/apache/answer)
+[](https://discord.gg/Jm7Y4cbUej)
+
+## Screenshots
+
+
+
+## Quick start
+
+### Running with docker
+
+```bash
+docker run -d -p 9080:80 -v answer-data:/data --name answer apache/answer:2.0.2
+```
+
+For more information, see [Installation](https://answer.apache.org/docs/installation).
+
+### Plugins
+
+Answer provides a plugin system for developers to create custom plugins and expand Answer’s features. You can find the [plugin documentation here](https://answer.apache.org/community/plugins).
+
+We value your feedback and suggestions to improve our documentation. If you have any comments or questions, please feel free to contact us. We’re excited to see what you can create using our plugin system!
+
+You can also check out the [plugins here](https://answer.apache.org/plugins).
+
+## Building from Source
+
+### Prerequisites
+
+- Golang >= 1.23
+- Node.js >= 20
+- pnpm >= 9
+- [mockgen](https://github.com/uber-go/mock?tab=readme-ov-file#installation) >= 0.6.0
+- [wire](https://github.com/google/wire/) >= 0.5.0
+
+### Build
+
+```bash
+# Install wire and mockgen for building. You can run `make check` to check if they are installed.
+$ make generate
+# Install frontend dependencies and build
+$ make ui
+# Install backend dependencies and build
+$ make build
+```
+
+## Contributing
+
+Contributions are always welcome!
+
+See [CONTRIBUTING](https://answer.apache.org/community/contributing) for ways to get started.
+
+## License
+
+[Apache License 2.0](https://github.com/apache/answer/blob/main/LICENSE)
diff --git a/README.wehub.md b/README.wehub.md
new file mode 100644
index 0000000..3dd0078
--- /dev/null
+++ b/README.wehub.md
@@ -0,0 +1,7 @@
+# WeHub 来源说明
+
+- 原始项目:`apache/answer`
+- 原始仓库:https://github.com/apache/answer
+- 导入方式:上游默认分支的最新快照
+- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准
+- 本文件仅用于记录来源,不代表 WeHub 是原项目作者
diff --git a/build/README.md b/build/README.md
new file mode 100644
index 0000000..caac98d
--- /dev/null
+++ b/build/README.md
@@ -0,0 +1,2 @@
+# /build
+Packaging and Continuous Integration.
diff --git a/charts/.helmignore b/charts/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/charts/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/charts/Chart.yaml b/charts/Chart.yaml
new file mode 100644
index 0000000..ff77995
--- /dev/null
+++ b/charts/Chart.yaml
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+apiVersion: v2
+name: answer
+description: A simple answer deployments for kubernetes
+type: application
+version: 0.1.0
+appVersion: "1.0.7"
\ No newline at end of file
diff --git a/charts/README.md b/charts/README.md
new file mode 100644
index 0000000..26cd6a9
--- /dev/null
+++ b/charts/README.md
@@ -0,0 +1,75 @@
+# answer
+
+An open-source knowledge-based community software. You can use it quickly to build Q&A community for your products, customers, teams, and more.
+## Prerequisites
+
+- Kubernetes 1.20+
+## Configuration
+
+The following table lists the configurable parameters of the answer chart and their default values.
+
+| Parameter | Description | Default |
+| --------- | ----------- | ------- |
+| `replicaCount` | Number of answer replicas | `1` |
+| `image.repository` | Image repository | `apache/answer` |
+| `image.pullPolicy` | Image pull policy | `Always` |
+| `image.tag` | Image tag | `latest` |
+| `env` | Optional environment variables for answer | `LOG_LEVEL: INFO` |
+| `extraContainers` | Optional sidecar containers to run along side answer | `[]` |
+| `persistence.enabled` | Enable or disable persistence for the /data volume | `true` |
+| `persistence.accessMode` | Specify the access mode of the persistent volume | `ReadWriteOnce` |
+| `persistence.size` | The size of the persistent volume | `5Gi` |
+| `persistence.annotations` | Annotations to add to the volume claim | `{}` |
+| `imagePullSecrets` | Reference to one or more secrets to be used when pulling images | `[]` |
+| `nameOverride` | nameOverride replaces the name of the chart in the Chart.yaml file, when this is used to construct Kubernetes object names. | |
+| `fullnameOverride` | fullnameOverride completely replaces the generated name. | |
+| `serviceAccount.create` | If `true`, create a new service account | `true` |
+| `serviceAccount.annotations` | Annotations to add to the service account | `{}` |
+| `serviceAccount.name` | Service account to be used. If not set and `serviceAccount.create` is `true`, a name is generated using the fullname template | |
+| `podAnnotations` | Annotations to add to the answer pod | `{}` |
+| `podSecurityContext` | Security context for the answer pod | `{}` refer to [Default Security Contexts](#default-security-contexts) |
+| `securityContext` | Security context for the answer container | `{}` refer to [Default Security Contexts](#default-security-contexts) |
+| `service.type` | The type of service to be used | `ClusterIP` |
+| `service.port` | The port that the service should listen on for requests. Also used as the container port. | `80` |
+| `ingress.enabled` | Enable or disable ingress. | `false` |
+| `resources` | CPU/memory resource requests/limits | `{}` |
+| `autoscaling.enabled` | Enable or disable pod autoscaling. If enabled, replicas are disabled. | `false` |
+| `nodeSelector` | Node labels for pod assignment | `{}` |
+| `tolerations` | Node tolerations for pod assignment | `[]` |
+| `affinity` | Node affinity for pod assignment | `{}` |
+
+### Default Security Contexts
+
+The default pod-level and container-level security contexts, below, adhere to the [restricted](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted) Pod Security Standards policies.
+
+Default pod-level securityContext:
+```yaml
+runAsNonRoot: true
+seccompProfile:
+ type: RuntimeDefault
+```
+
+Default containerSecurityContext:
+```yaml
+allowPrivilegeEscalation: false
+capabilities:
+ drop:
+ - ALL
+```
+### Installing with a Values file
+
+```console
+$ helm install answer -f values.yaml .
+```
+> **Tip**: You can use the default [values.yaml]
+
+## TODO
+
+Publish the chart to Artifacthub and add proper installation instructions. E.G.
+> **NOTE**: This is not currently a valid installation option.
+
+```console
+$ helm repo add apache https://charts.answer.apache.org/
+$ helm repo update
+$ helm install apache/answer -n mynamespace
+```
\ No newline at end of file
diff --git a/charts/templates/_helpers.tpl b/charts/templates/_helpers.tpl
new file mode 100644
index 0000000..660cd33
--- /dev/null
+++ b/charts/templates/_helpers.tpl
@@ -0,0 +1,79 @@
+{{/*
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+*/}}
+{{- define "answer.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "answer.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "answer.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "answer.labels" -}}
+helm.sh/chart: {{ include "answer.chart" . }}
+{{ include "answer.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "answer.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "answer.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "answer.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "answer.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/charts/templates/deployment.yaml b/charts/templates/deployment.yaml
new file mode 100644
index 0000000..f1b9d18
--- /dev/null
+++ b/charts/templates/deployment.yaml
@@ -0,0 +1,119 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "answer.fullname" . }}
+ labels:
+ {{- include "answer.labels" . | nindent 4 }}
+spec:
+ {{- if not .Values.autoscaling.enabled }}
+ replicas: {{ .Values.replicaCount }}
+ {{- end }}
+ selector:
+ matchLabels:
+ {{- include "answer.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "answer.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ serviceAccountName: {{ include "answer.serviceAccountName" . }}
+ securityContext:
+ {{- toYaml .Values.podSecurityContext | nindent 8 }}
+ containers:
+ - name: {{ .Chart.Name }}
+ securityContext:
+ {{- toYaml .Values.securityContext | nindent 12 }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - name: http
+ containerPort: {{ .Values.service.port }}
+ protocol: TCP
+ livenessProbe:
+ httpGet:
+ path: /
+ port: http
+ readinessProbe:
+ httpGet:
+ path: /
+ port: http
+ resources:
+ {{- toYaml .Values.resources | nindent 12 }}
+ {{- $envNames := list }}
+ {{- range .Values.env }}
+ {{- $envNames = append $envNames .name }}
+ {{- end }}
+ env:
+ {{- if not (has "INSTALL_PORT" $envNames) }}
+ - name: INSTALL_PORT
+ value: {{ .Values.service.port | quote }}
+ {{- end }}
+ {{- if not (has "SITE_ADDR" $envNames) }}
+ - name: SITE_ADDR
+ value: {{ printf "0.0.0.0:%v" .Values.service.port | quote }}
+ {{- end }}
+ {{- if not (has "SWAGGER_ADDRESS_PORT" $envNames) }}
+ - name: SWAGGER_ADDRESS_PORT
+ value: {{ printf ":%v" .Values.service.port | quote }}
+ {{- end }}
+ {{- range .Values.env }}
+ - name: {{ .name }}
+ {{- if .value | quote }}
+ value: {{ .value | quote }}
+ {{- end }}
+ {{- if .valueFrom }}
+ valueFrom:
+ {{- toYaml .valueFrom | nindent 16 }}
+ {{- end }}
+ {{- end }}
+ volumeMounts:
+ - name: data
+ mountPath: "/data"
+ {{- if .Values.extraContainers }}
+ {{- toYaml .Values.extraContainers | nindent 8 }}
+ {{- end }}
+ volumes:
+ - name: data
+ {{- if .Values.persistence.enabled }}
+ persistentVolumeClaim:
+ claimName: {{ include "answer.fullname" . }}-claim
+ {{- else }}
+ emptyDir: {}
+ {{- end -}}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
diff --git a/charts/templates/hpa.yaml b/charts/templates/hpa.yaml
new file mode 100644
index 0000000..fee246e
--- /dev/null
+++ b/charts/templates/hpa.yaml
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{ if .Values.autoscaling.enabled -}}
+apiVersion: autoscaling/v2beta1
+kind: HorizontalPodAutoscaler
+metadata:
+ name: {{ include "answer.fullname" . }}
+ labels:
+ {{- include "answer.labels" . | nindent 4 }}
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: {{ include "answer.fullname" . }}
+ minReplicas: {{ .Values.autoscaling.minReplicas }}
+ maxReplicas: {{ .Values.autoscaling.maxReplicas }}
+ metrics:
+ {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: cpu
+ targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
+ {{- end }}
+ {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: memory
+ targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ {{- end }}
+{{- end }}
diff --git a/charts/templates/ingress.yaml b/charts/templates/ingress.yaml
new file mode 100644
index 0000000..c43cf72
--- /dev/null
+++ b/charts/templates/ingress.yaml
@@ -0,0 +1,78 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{ if .Values.ingress.enabled -}}
+{{- $fullName := include "answer.fullname" . -}}
+{{- $svcPort := .Values.service.port -}}
+{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
+ {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
+ {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
+ {{- end }}
+{{- end }}
+{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1
+{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+ name: {{ $fullName }}
+ labels:
+ {{- include "answer.labels" . | nindent 4 }}
+ {{- with .Values.ingress.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
+ ingressClassName: {{ .Values.ingress.className }}
+ {{- end }}
+ {{- if .Values.ingress.tls }}
+ tls:
+ {{- range .Values.ingress.tls }}
+ - hosts:
+ {{- range .hosts }}
+ - {{ . | quote }}
+ {{- end }}
+ secretName: {{ .secretName }}
+ {{- end }}
+ {{- end }}
+ rules:
+ {{- range .Values.ingress.hosts }}
+ - host: {{ .host | quote }}
+ http:
+ paths:
+ {{- range .paths }}
+ - path: {{ .path }}
+ {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
+ pathType: {{ .pathType }}
+ {{- end }}
+ backend:
+ {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+ service:
+ name: {{ $fullName }}
+ port:
+ number: {{ $svcPort }}
+ {{- else }}
+ serviceName: {{ $fullName }}
+ servicePort: {{ $svcPort }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/charts/templates/pvc.yaml b/charts/templates/pvc.yaml
new file mode 100644
index 0000000..640fb9f
--- /dev/null
+++ b/charts/templates/pvc.yaml
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{ if .Values.persistence.enabled -}}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ include "answer.fullname" . }}-claim
+ {{- with .Values.persistence.annotations }}
+ annotations:
+ {{ toYaml . | indent 4 }}
+ {{- end }}
+ labels:
+ {{- include "answer.labels" . | nindent 4 }}
+spec:
+ {{- if .Values.persistence.storageClass }}
+ {{- if (eq "-" .Values.persistence.storageClass) }}
+ storageClassName: ""
+ {{- else }}
+ storageClassName: "{{ .Values.persistence.storageClass }}"
+ {{- end }}
+ {{- end }}
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{- with .Values.persistence.dataSource }}
+ dataSource:
+ name: {{ .name }}
+ kind: {{ .kind | default "VolumeSnapshot" }}
+ apiGroup: {{ .apiGroup | default "snapshot.storage.k8s.io" }}
+ {{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/charts/templates/service.yaml b/charts/templates/service.yaml
new file mode 100644
index 0000000..6531226
--- /dev/null
+++ b/charts/templates/service.yaml
@@ -0,0 +1,32 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "answer.fullname" . }}
+ labels:
+ {{- include "answer.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.port }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ selector:
+ {{- include "answer.selectorLabels" . | nindent 4 }}
diff --git a/charts/templates/serviceaccount.yaml b/charts/templates/serviceaccount.yaml
new file mode 100644
index 0000000..65cc297
--- /dev/null
+++ b/charts/templates/serviceaccount.yaml
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{ if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "answer.serviceAccountName" . }}
+ labels:
+ {{- include "answer.labels" . | nindent 4 }}
+ {{- with .Values.serviceAccount.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end }}
diff --git a/charts/values.yaml b/charts/values.yaml
new file mode 100644
index 0000000..d932db8
--- /dev/null
+++ b/charts/values.yaml
@@ -0,0 +1,170 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Default values for answer.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+ repository: apache/answer
+ pullPolicy: Always
+ # Overrides the image tag whose default is the chart appVersion.
+ tag: "latest"
+
+# Environment variables
+# Configure environment variables below
+# https://answer.apache.org/docs/env
+env:
+ - name: LOG_LEVEL
+ # [DEBUG INFO WARN ERROR]
+ value: "INFO"
+ # uncomment the below values to use AUTO_INSTALL and not have to go through the setup process.
+ # Once used to do the initial setup, these variables won't be used moving forward.
+ # You must at a minimum comment AUTO_INSTALL after initial setup to prevent an error about the database already being initiated.
+ # - name: AUTO_INSTALL
+ # value: "true"
+ # - name: DB_TYPE
+ # value: "sqlite3"
+ # # DB_FILE Only for sqlite3
+ # - name: DB_FILE
+ # value: "/data/answer.db"
+ # - name: LANGUAGE
+ # value: "en-US"
+ # - name: SITE_NAME
+ # value: "MyAnswer"
+ # - name: SITE_URL
+ # value: "http://localhost:80"
+ # - name: CONTACT_EMAIL
+ # value: "support@mydomain.com"
+ # - name: ADMIN_NAME
+ # # lowercase
+ # value: "myadmin"
+ # - name: ADMIN_PASSWORD
+ # # 32 Characters MAX
+ # value: "MyInsecurePasswordInTheRepo!"
+ # # Use valueFrom to use a secret
+ # # valueFrom:
+ # # secretKeyRef:
+ # # key: answer-admin-password
+ # # name: answer-secrets
+ # - name: ADMIN_EMAIL
+ # value: "myAdmin@mydomain.com"
+
+# Configure extra containers
+extraContainers: []
+ # - name: cloudsql-proxy
+ # image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.1.2
+ # command:
+ # - /cloud-sql-proxy
+ # args:
+ # - project:region:instance
+ # - --port=5432
+ # - --auto-iam-authn
+ # ports:
+ # - containerPort: 5432
+
+# Persistence for the /data volume
+# Without persistence, your uploads and config.yaml will not be remembered between restarts.
+persistence:
+ enabled: true
+ # If set to "-", storageClassName: "", which disables dynamic provisioning
+ # If undefined (the default) or set to null, no storageClassName spec is
+ # set, choosing the default provisioner. (gp2 on AWS, standard on
+ # GKE, AWS & OpenStack)
+ # storageClass: "-"
+ accessMode: ReadWriteOnce
+ size: 5Gi
+ annotations: {}
+ # To restore a PVC from a VolumeSnapshot, set the dataSource;
+ # the kind and apiGroup are optional and default to the shown values
+ dataSource: {}
+ # name: my-volume-snapshot
+ # kind: VolumeSnapshot
+ # apiGroup: snapshot.storage.k8s.io
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+ # Specifies whether a service account should be created
+ create: true
+ # Annotations to add to the service account
+ annotations: {}
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name: ""
+
+podAnnotations: {}
+
+podSecurityContext: {}
+ # fsGroup: 2000
+
+securityContext: {}
+ # capabilities:
+ # drop:
+ # - ALL
+ # readOnlyRootFilesystem: true
+ # runAsNonRoot: true
+ # runAsUser: 1000
+
+service:
+ type: ClusterIP
+ port: 80
+
+ingress:
+ enabled: false
+ className: ""
+ annotations: {}
+ # kubernetes.io/ingress.class: nginx
+ # kubernetes.io/tls-acme: "true"
+ hosts:
+ - host: answer.local
+ paths:
+ - path: /
+ pathType: ImplementationSpecific
+ tls: []
+ # - secretName: answer-tls
+ # hosts:
+ # - answer.local
+
+resources: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+ # limits:
+ # cpu: 100m
+ # memory: 128Mi
+ # requests:
+ # cpu: 100m
+ # memory: 128Mi
+
+autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 100
+ targetCPUUtilizationPercentage: 80
+ # targetMemoryUtilizationPercentage: 80
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
\ No newline at end of file
diff --git a/cmd/answer/main.go b/cmd/answer/main.go
new file mode 100644
index 0000000..c11da2a
--- /dev/null
+++ b/cmd/answer/main.go
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+//go:generate go run github.com/swaggo/swag/cmd/swag init -g ./cmd/answer/main.go -d ../../ -o ../../docs
+
+package main
+
+import (
+ answercmd "github.com/apache/answer/cmd"
+)
+
+// main godoc
+// @title Apache Answer
+// @description Apache Answer API
+// @BasePath /
+// @securityDefinitions.apikey ApiKeyAuth
+// @in header
+// @name Authorization
+func main() {
+ answercmd.Main()
+}
diff --git a/cmd/command.go b/cmd/command.go
new file mode 100644
index 0000000..ca01aa8
--- /dev/null
+++ b/cmd/command.go
@@ -0,0 +1,344 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 answercmd
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "strings"
+
+ "github.com/apache/answer/internal/base/conf"
+ "github.com/apache/answer/internal/base/path"
+ "github.com/apache/answer/internal/cli"
+ "github.com/apache/answer/internal/install"
+ "github.com/apache/answer/internal/migrations"
+ "github.com/apache/answer/plugin"
+ "github.com/segmentfault/pacman/log"
+ "github.com/spf13/cobra"
+)
+
+var (
+ // dataDirPath save all answer application data in this directory. like config file, upload file...
+ dataDirPath string
+ // dumpDataPath dump data path
+ dumpDataPath string
+ // place to build new answer
+ buildDir string
+ // plugins needed to build in answer application
+ buildWithPlugins []string
+ // build output path
+ buildOutput string
+ // This config is used to upgrade the database from a specific version manually.
+ // If you want to upgrade the database to version 1.1.0, you can use `answer upgrade -f v1.1.0`.
+ upgradeVersion string
+ // The fields that need to be set to the default value
+ configFields []string
+ // i18nSourcePath i18n from path
+ i18nSourcePath string
+ // i18nTargetPath i18n to path
+ i18nTargetPath string
+ // resetPasswordEmail user email for password reset
+ resetPasswordEmail string
+ // resetPasswordPassword new password for password reset
+ resetPasswordPassword string
+)
+
+func init() {
+ rootCmd.Version = fmt.Sprintf("%s\nrevision: %s\nbuild time: %s", Version, Revision, Time)
+
+ rootCmd.PersistentFlags().StringVarP(&dataDirPath, "data-path", "C", "/data/", "data path, eg: -C ./data/")
+
+ dumpCmd.Flags().StringVarP(&dumpDataPath, "path", "p", "./", "dump data path, eg: -p ./dump/data/")
+
+ buildCmd.Flags().StringSliceVarP(&buildWithPlugins, "with", "w", []string{}, "plugins needed to build")
+
+ buildCmd.Flags().StringVarP(&buildOutput, "output", "o", "", "build output path")
+
+ buildCmd.Flags().StringVarP(&buildDir, "build-dir", "b", "", "dir for build process")
+
+ upgradeCmd.Flags().StringVarP(&upgradeVersion, "from", "f", "", "upgrade from specific version, eg: -f v1.1.0")
+
+ configCmd.Flags().StringSliceVarP(&configFields, "with", "w", []string{}, "the fields that need to be set to the default value, eg: -w allow_password_login")
+
+ i18nCmd.Flags().StringVarP(&i18nSourcePath, "source", "s", "", "i18n source path, eg: -s ./i18n/source")
+
+ i18nCmd.Flags().StringVarP(&i18nTargetPath, "target", "t", "", "i18n target path, eg: -t ./i18n/target")
+
+ resetPasswordCmd.Flags().StringVarP(&resetPasswordEmail, "email", "e", "", "user email address")
+ resetPasswordCmd.Flags().StringVarP(&resetPasswordPassword, "password", "p", "", "new password (not recommended, will be recorded in shell history)")
+
+ for _, cmd := range []*cobra.Command{initCmd, checkCmd, runCmd, dumpCmd, upgradeCmd, buildCmd, pluginCmd, configCmd, i18nCmd, resetPasswordCmd} {
+ rootCmd.AddCommand(cmd)
+ }
+}
+
+var (
+ rootCmd = &cobra.Command{
+ Use: "answer",
+ Short: "Answer is a minimalist open source Q&A community.",
+ Long: `Answer is a minimalist open source Q&A community.
+To run answer, use:
+ - 'answer init' to initialize the required environment.
+ - 'answer run' to launch application.`,
+ }
+
+ runCmd = &cobra.Command{
+ Use: "run",
+ Short: "Run Answer",
+ Long: `Start running Answer`,
+ Run: func(_ *cobra.Command, _ []string) {
+ path.FormatAllPath(dataDirPath)
+ fmt.Println("config file path: ", path.GetConfigFilePath())
+ fmt.Println("Answer is starting..........................")
+ runApp()
+ },
+ }
+
+ initCmd = &cobra.Command{
+ Use: "init",
+ Short: "Initialize Answer",
+ Long: `Initialize Answer with specified configuration`,
+ Run: func(_ *cobra.Command, _ []string) {
+ // check config file and database. if config file exists and database is already created, init done
+ cli.InstallAllInitialEnvironment(dataDirPath)
+
+ configFileExist := cli.CheckConfigFile(path.GetConfigFilePath())
+ if configFileExist {
+ fmt.Println("config file exists, try to read the config...")
+ c, err := conf.ReadConfig(path.GetConfigFilePath())
+ if err != nil {
+ fmt.Println("read config failed: ", err.Error())
+ return
+ }
+
+ fmt.Println("config file read successfully, try to connect database...")
+ if cli.CheckDBTableExist(c.Data.Database) {
+ fmt.Println("connect to database successfully and table already exists, do nothing.")
+ return
+ }
+ }
+
+ // start installation server to install
+ install.Run(path.GetConfigFilePath())
+ },
+ }
+
+ upgradeCmd = &cobra.Command{
+ Use: "upgrade",
+ Short: "Upgrade Answer",
+ Long: `Upgrade Answer to the latest version`,
+ Run: func(_ *cobra.Command, _ []string) {
+ log.SetLogger(log.NewStdLogger(os.Stdout))
+ path.FormatAllPath(dataDirPath)
+ cli.InstallI18nBundle(true)
+ c, err := conf.ReadConfig(path.GetConfigFilePath())
+ if err != nil {
+ fmt.Println("read config failed: ", err.Error())
+ return
+ }
+ if err = migrations.Migrate(c.Debug, c.Data.Database, c.Data.Cache, upgradeVersion); err != nil {
+ fmt.Println("migrate failed: ", err.Error())
+ return
+ }
+ fmt.Println("upgrade done")
+ },
+ }
+
+ dumpCmd = &cobra.Command{
+ Use: "dump",
+ Short: "Back up data",
+ Long: `Back up database into an SQL file`,
+ Run: func(_ *cobra.Command, _ []string) {
+ fmt.Println("Answer is backing up data")
+ path.FormatAllPath(dataDirPath)
+ c, err := conf.ReadConfig(path.GetConfigFilePath())
+ if err != nil {
+ fmt.Println("read config failed: ", err.Error())
+ return
+ }
+ err = cli.DumpAllData(c.Data.Database, dumpDataPath)
+ if err != nil {
+ fmt.Println("dump failed: ", err.Error())
+ return
+ }
+ fmt.Println("Answer backed up the data successfully.")
+ },
+ }
+
+ checkCmd = &cobra.Command{
+ Use: "check",
+ Short: "Check the required environment",
+ Long: `Check if the current environment meets the startup requirements`,
+ Run: func(_ *cobra.Command, _ []string) {
+ path.FormatAllPath(dataDirPath)
+ fmt.Println("Start checking the required environment...")
+ if cli.CheckConfigFile(path.GetConfigFilePath()) {
+ fmt.Println("config file exists [✔]")
+ } else {
+ fmt.Println("config file not exists [x]")
+ }
+
+ if cli.CheckUploadDir() {
+ fmt.Println("upload directory exists [✔]")
+ } else {
+ fmt.Println("upload directory not exists [x]")
+ }
+
+ c, err := conf.ReadConfig(path.GetConfigFilePath())
+ if err != nil {
+ fmt.Println("read config failed: ", err.Error())
+ return
+ }
+
+ if cli.CheckDBConnection(c.Data.Database) {
+ fmt.Println("db connection successfully [✔]")
+ } else {
+ fmt.Println("db connection failed [x]")
+ }
+ fmt.Println("check environment all done")
+ },
+ }
+
+ buildCmd = &cobra.Command{
+ Use: "build",
+ Short: "Build Answer with plugins",
+ Long: `Build a new Answer with plugins that you need`,
+ Run: func(_ *cobra.Command, _ []string) {
+ fmt.Printf("try to build a new answer with plugins:\n%s\n", strings.Join(buildWithPlugins, "\n"))
+ err := cli.BuildNewAnswer(buildDir, buildOutput, buildWithPlugins, cli.OriginalAnswerInfo{
+ Version: Version,
+ Revision: Revision,
+ Time: Time,
+ })
+ if err != nil {
+ fmt.Printf("build failed %v\n", err)
+ os.Exit(1)
+ }
+
+ fmt.Printf("build new answer successfully %s\n", buildOutput)
+ },
+ }
+
+ pluginCmd = &cobra.Command{
+ Use: "plugin",
+ Short: "Print all plugins packed in the binary",
+ Long: `Print all plugins packed in the binary`,
+ Run: func(_ *cobra.Command, _ []string) {
+ _ = plugin.CallBase(func(base plugin.Base) error {
+ info := base.Info()
+ fmt.Printf("%s[%s] made by %s\n", info.SlugName, info.Version, info.Author)
+ return nil
+ })
+ },
+ }
+
+ configCmd = &cobra.Command{
+ Use: "config",
+ Short: "Set some config to default value",
+ Long: `Set some config to default value`,
+ Run: func(_ *cobra.Command, _ []string) {
+ path.FormatAllPath(dataDirPath)
+
+ c, err := conf.ReadConfig(path.GetConfigFilePath())
+ if err != nil {
+ fmt.Println("read config failed: ", err.Error())
+ return
+ }
+
+ field := &cli.ConfigField{}
+ fmt.Println(configFields)
+ if len(configFields) > 0 {
+ switch configFields[0] {
+ case "allow_password_login":
+ field.AllowPasswordLogin = true
+ case "deactivate_plugin":
+ if len(configFields) > 1 {
+ field.DeactivatePluginSlugName = configFields[1]
+ }
+ default:
+ fmt.Printf("field %s not support\n", configFields[0])
+ }
+ }
+ err = cli.SetDefaultConfig(c.Data.Database, c.Data.Cache, field)
+ if err != nil {
+ fmt.Println("set default config failed: ", err.Error())
+ } else {
+ fmt.Println("set default config successfully")
+ }
+ },
+ }
+
+ i18nCmd = &cobra.Command{
+ Use: "i18n",
+ Short: "Overwrite i18n files",
+ Long: `Merge i18n files from plugins to original i18n files. It will overwrite the original i18n files`,
+ Run: func(_ *cobra.Command, _ []string) {
+ if err := cli.ReplaceI18nFilesLocal(i18nTargetPath); err != nil {
+ fmt.Printf("replace i18n files failed %v\n", err)
+ } else {
+ fmt.Printf("replace i18n files successfully\n")
+ }
+
+ fmt.Printf("try to merge i18n files from %q to %q\n", i18nSourcePath, i18nTargetPath)
+
+ if err := cli.MergeI18nFilesLocal(i18nTargetPath, i18nSourcePath); err != nil {
+ fmt.Printf("merge i18n files failed %v\n", err)
+ } else {
+ fmt.Printf("merge i18n files successfully\n")
+ }
+ },
+ }
+
+ resetPasswordCmd = &cobra.Command{
+ Use: "passwd",
+ Aliases: []string{"password", "reset-password"},
+ Short: "Reset user password",
+ Long: "Reset user password by email address.",
+ Example: ` # Interactive mode (recommended, safest)
+ answer passwd -C ./answer-data
+
+ # Specify email only (will prompt for password securely)
+ answer passwd -C ./answer-data --email user@example.com
+ answer passwd -C ./answer-data -e user@example.com
+
+ # Specify email and password (NOT recommended, will be recorded in shell history)
+ answer passwd -C ./answer-data -e user@example.com -p newpassword123`,
+ Run: func(cmd *cobra.Command, args []string) {
+ opts := &cli.ResetPasswordOptions{
+ Email: resetPasswordEmail,
+ Password: resetPasswordPassword,
+ }
+ if err := cli.ResetPassword(context.Background(), dataDirPath, opts); err != nil {
+ fmt.Fprintf(os.Stderr, "Error: %v\n", err)
+ os.Exit(1)
+ }
+ },
+ }
+)
+
+// Execute adds all child commands to the root command and sets flags appropriately.
+// This is called by main(). It only needs to happen once to the rootCmd.
+func Execute() {
+ err := rootCmd.Execute()
+ if err != nil {
+ os.Exit(1)
+ }
+}
diff --git a/cmd/main.go b/cmd/main.go
new file mode 100644
index 0000000..1f81530
--- /dev/null
+++ b/cmd/main.go
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 answercmd
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "time"
+
+ "github.com/apache/answer/internal/base/conf"
+ "github.com/apache/answer/internal/base/constant"
+ "github.com/apache/answer/internal/base/cron"
+ "github.com/apache/answer/internal/base/path"
+ "github.com/apache/answer/internal/schema"
+ "github.com/gin-gonic/gin"
+ "github.com/joho/godotenv"
+ "github.com/segmentfault/pacman"
+ "github.com/segmentfault/pacman/contrib/log/zap"
+ "github.com/segmentfault/pacman/contrib/server/http"
+ "github.com/segmentfault/pacman/log"
+)
+
+func init() {
+ // Load .env if present, ignore error to keep backward compatibility
+ _ = godotenv.Load()
+}
+
+// go build -ldflags "-X github.com/apache/answer/cmd.Version=x.y.z"
+var (
+ // Name is the name of the project
+ Name = "answer"
+ // Version is the version of the project
+ Version = "0.0.0"
+ // Revision is the git short commit revision number
+ // If built without a Git repository, this field will be empty.
+ Revision = ""
+ // Time is the build time of the project
+ Time = ""
+ // GoVersion is the go version of the project
+ GoVersion = "1.23"
+ // log level
+ logLevel = os.Getenv("LOG_LEVEL")
+ // log path
+ logPath = os.Getenv("LOG_PATH")
+)
+
+// Main
+// @securityDefinitions.apikey ApiKeyAuth
+// @in header
+// @name Authorization
+func Main() {
+ log.SetLogger(zap.NewLogger(
+ log.ParseLevel(logLevel), zap.WithName("answer"), zap.WithPath(logPath)))
+ Execute()
+}
+
+func runApp() {
+ c, err := conf.ReadConfig(path.GetConfigFilePath())
+ if err != nil {
+ panic(err)
+ }
+ app, cleanup, err := initApplication(
+ c.Debug, c.Server, c.Data.Database, c.Data.Cache, c.I18n, c.Swaggerui, c.ServiceConfig, c.UI, log.GetLogger())
+ if err != nil {
+ panic(err)
+ }
+ constant.Version = Version
+ constant.Revision = Revision
+ constant.GoVersion = GoVersion
+ schema.AppStartTime = time.Now()
+ fmt.Println("answer Version:", constant.Version, " Revision:", constant.Revision)
+
+ defer cleanup()
+ if err := app.Run(context.Background()); err != nil {
+ panic(err)
+ }
+}
+
+func newApplication(serverConf *conf.Server, server *gin.Engine, manager *cron.ScheduledTaskManager) *pacman.Application {
+ manager.Run()
+ return pacman.NewApp(
+ pacman.WithName(Name),
+ pacman.WithVersion(Version),
+ pacman.WithServer(http.NewServer(server, serverConf.HTTP.Addr)),
+ )
+}
diff --git a/cmd/wire.go b/cmd/wire.go
new file mode 100644
index 0000000..3979ecb
--- /dev/null
+++ b/cmd/wire.go
@@ -0,0 +1,69 @@
+//go:build wireinject
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+// The build tag makes sure the stub is not built in the final build.
+
+package answercmd
+
+import (
+ "github.com/apache/answer/internal/base/conf"
+ "github.com/apache/answer/internal/base/cron"
+ "github.com/apache/answer/internal/base/data"
+ "github.com/apache/answer/internal/base/middleware"
+ "github.com/apache/answer/internal/base/server"
+ "github.com/apache/answer/internal/base/translator"
+ "github.com/apache/answer/internal/controller"
+ templaterender "github.com/apache/answer/internal/controller/template_render"
+ "github.com/apache/answer/internal/controller_admin"
+ "github.com/apache/answer/internal/repo"
+ "github.com/apache/answer/internal/router"
+ "github.com/apache/answer/internal/service"
+ "github.com/apache/answer/internal/service/service_config"
+ "github.com/google/wire"
+ "github.com/segmentfault/pacman"
+ "github.com/segmentfault/pacman/log"
+)
+
+// initApplication init application.
+func initApplication(
+ debug bool,
+ serverConf *conf.Server,
+ dbConf *data.Database,
+ cacheConf *data.CacheConf,
+ i18nConf *translator.I18n,
+ swaggerConf *router.SwaggerConfig,
+ serviceConf *service_config.ServiceConfig,
+ uiConf *server.UI,
+ logConf log.Logger) (*pacman.Application, func(), error) {
+ panic(wire.Build(
+ server.ProviderSetServer,
+ router.ProviderSetRouter,
+ controller.ProviderSetController,
+ controller_admin.ProviderSetController,
+ templaterender.ProviderSetTemplateRenderController,
+ service.ProviderSetService,
+ cron.ProviderSetService,
+ repo.ProviderSetRepo,
+ translator.ProviderSet,
+ middleware.ProviderSetMiddleware,
+ newApplication,
+ ))
+}
diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go
new file mode 100644
index 0000000..446f6cc
--- /dev/null
+++ b/cmd/wire_gen.go
@@ -0,0 +1,320 @@
+//go:build !wireinject
+// +build !wireinject
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 Wire. DO NOT EDIT.
+
+//go:generate go run github.com/google/wire/cmd/wire
+
+package answercmd
+
+import (
+ "github.com/apache/answer/internal/base/conf"
+ "github.com/apache/answer/internal/base/cron"
+ "github.com/apache/answer/internal/base/data"
+ "github.com/apache/answer/internal/base/middleware"
+ "github.com/apache/answer/internal/base/server"
+ "github.com/apache/answer/internal/base/translator"
+ "github.com/apache/answer/internal/controller"
+ "github.com/apache/answer/internal/controller/template_render"
+ "github.com/apache/answer/internal/controller_admin"
+ "github.com/apache/answer/internal/repo/activity"
+ "github.com/apache/answer/internal/repo/activity_common"
+ "github.com/apache/answer/internal/repo/ai_conversation"
+ "github.com/apache/answer/internal/repo/answer"
+ "github.com/apache/answer/internal/repo/api_key"
+ "github.com/apache/answer/internal/repo/auth"
+ "github.com/apache/answer/internal/repo/badge"
+ "github.com/apache/answer/internal/repo/badge_award"
+ "github.com/apache/answer/internal/repo/badge_group"
+ "github.com/apache/answer/internal/repo/captcha"
+ "github.com/apache/answer/internal/repo/collection"
+ "github.com/apache/answer/internal/repo/comment"
+ "github.com/apache/answer/internal/repo/config"
+ "github.com/apache/answer/internal/repo/export"
+ "github.com/apache/answer/internal/repo/file_record"
+ "github.com/apache/answer/internal/repo/limit"
+ "github.com/apache/answer/internal/repo/meta"
+ notification2 "github.com/apache/answer/internal/repo/notification"
+ "github.com/apache/answer/internal/repo/plugin_config"
+ "github.com/apache/answer/internal/repo/question"
+ "github.com/apache/answer/internal/repo/rank"
+ "github.com/apache/answer/internal/repo/reason"
+ "github.com/apache/answer/internal/repo/report"
+ "github.com/apache/answer/internal/repo/review"
+ "github.com/apache/answer/internal/repo/revision"
+ "github.com/apache/answer/internal/repo/role"
+ "github.com/apache/answer/internal/repo/search_common"
+ "github.com/apache/answer/internal/repo/site_info"
+ "github.com/apache/answer/internal/repo/tag"
+ "github.com/apache/answer/internal/repo/tag_common"
+ "github.com/apache/answer/internal/repo/unique"
+ "github.com/apache/answer/internal/repo/user"
+ "github.com/apache/answer/internal/repo/user_external_login"
+ "github.com/apache/answer/internal/repo/user_notification_config"
+ "github.com/apache/answer/internal/router"
+ "github.com/apache/answer/internal/service/action"
+ activity2 "github.com/apache/answer/internal/service/activity"
+ activity_common2 "github.com/apache/answer/internal/service/activity_common"
+ "github.com/apache/answer/internal/service/activityqueue"
+ ai_conversation2 "github.com/apache/answer/internal/service/ai_conversation"
+ "github.com/apache/answer/internal/service/answer_common"
+ "github.com/apache/answer/internal/service/apikey"
+ auth2 "github.com/apache/answer/internal/service/auth"
+ badge2 "github.com/apache/answer/internal/service/badge"
+ collection2 "github.com/apache/answer/internal/service/collection"
+ "github.com/apache/answer/internal/service/collection_common"
+ comment2 "github.com/apache/answer/internal/service/comment"
+ "github.com/apache/answer/internal/service/comment_common"
+ config2 "github.com/apache/answer/internal/service/config"
+ "github.com/apache/answer/internal/service/content"
+ "github.com/apache/answer/internal/service/dashboard"
+ "github.com/apache/answer/internal/service/embedding"
+ "github.com/apache/answer/internal/service/eventqueue"
+ export2 "github.com/apache/answer/internal/service/export"
+ "github.com/apache/answer/internal/service/feature_toggle"
+ file_record2 "github.com/apache/answer/internal/service/file_record"
+ "github.com/apache/answer/internal/service/follow"
+ "github.com/apache/answer/internal/service/importer"
+ meta2 "github.com/apache/answer/internal/service/meta"
+ "github.com/apache/answer/internal/service/meta_common"
+ "github.com/apache/answer/internal/service/noticequeue"
+ "github.com/apache/answer/internal/service/notification"
+ "github.com/apache/answer/internal/service/notification_common"
+ "github.com/apache/answer/internal/service/object_info"
+ "github.com/apache/answer/internal/service/plugin_common"
+ "github.com/apache/answer/internal/service/question_common"
+ rank2 "github.com/apache/answer/internal/service/rank"
+ reason2 "github.com/apache/answer/internal/service/reason"
+ report2 "github.com/apache/answer/internal/service/report"
+ "github.com/apache/answer/internal/service/report_handle"
+ review2 "github.com/apache/answer/internal/service/review"
+ "github.com/apache/answer/internal/service/revision_common"
+ role2 "github.com/apache/answer/internal/service/role"
+ "github.com/apache/answer/internal/service/search_parser"
+ "github.com/apache/answer/internal/service/service_config"
+ "github.com/apache/answer/internal/service/siteinfo"
+ "github.com/apache/answer/internal/service/siteinfo_common"
+ tag2 "github.com/apache/answer/internal/service/tag"
+ tag_common2 "github.com/apache/answer/internal/service/tag_common"
+ "github.com/apache/answer/internal/service/uploader"
+ "github.com/apache/answer/internal/service/user_admin"
+ "github.com/apache/answer/internal/service/user_common"
+ user_external_login2 "github.com/apache/answer/internal/service/user_external_login"
+ user_notification_config2 "github.com/apache/answer/internal/service/user_notification_config"
+ "github.com/apache/answer/internal/service/vector_sync"
+ "github.com/segmentfault/pacman"
+ "github.com/segmentfault/pacman/log"
+)
+
+// Injectors from wire.go:
+
+// initApplication init application.
+func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database, cacheConf *data.CacheConf, i18nConf *translator.I18n, swaggerConf *router.SwaggerConfig, serviceConf *service_config.ServiceConfig, uiConf *server.UI, logConf log.Logger) (*pacman.Application, func(), error) {
+ staticRouter := router.NewStaticRouter(serviceConf)
+ i18nTranslator, err := translator.NewTranslator(i18nConf)
+ if err != nil {
+ return nil, nil, err
+ }
+ engine, err := data.NewDB(debug, dbConf)
+ if err != nil {
+ return nil, nil, err
+ }
+ cache, cleanup, err := data.NewCache(cacheConf)
+ if err != nil {
+ return nil, nil, err
+ }
+ dataData, cleanup2, err := data.NewData(engine, cache)
+ if err != nil {
+ cleanup()
+ return nil, nil, err
+ }
+ siteInfoRepo := site_info.NewSiteInfo(dataData)
+ siteInfoCommonService := siteinfo_common.NewSiteInfoCommonService(siteInfoRepo)
+ langController := controller.NewLangController(i18nTranslator, siteInfoCommonService)
+ authRepo := auth.NewAuthRepo(dataData)
+ apiKeyRepo := api_key.NewAPIKeyRepo(dataData)
+ authService := auth2.NewAuthService(authRepo, apiKeyRepo)
+ userRepo := user.NewUserRepo(dataData)
+ uniqueIDRepo := unique.NewUniqueIDRepo(dataData)
+ configRepo := config.NewConfigRepo(dataData)
+ configService := config2.NewConfigService(configRepo)
+ activityRepo := activity_common.NewActivityRepo(dataData, uniqueIDRepo, configService)
+ userRankRepo := rank.NewUserRankRepo(dataData, configService)
+ userActiveActivityRepo := activity.NewUserActiveActivityRepo(dataData, activityRepo, userRankRepo, configService)
+ emailRepo := export.NewEmailRepo(dataData)
+ emailService := export2.NewEmailService(configService, emailRepo, siteInfoCommonService)
+ userRoleRelRepo := role.NewUserRoleRelRepo(dataData)
+ roleRepo := role.NewRoleRepo(dataData)
+ roleService := role2.NewRoleService(roleRepo)
+ userRoleRelService := role2.NewUserRoleRelService(userRoleRelRepo, roleService)
+ userCommon := usercommon.NewUserCommon(userRepo, userRoleRelService, authService, siteInfoCommonService)
+ userExternalLoginRepo := user_external_login.NewUserExternalLoginRepo(dataData)
+ userNotificationConfigRepo := user_notification_config.NewUserNotificationConfigRepo(dataData)
+ userNotificationConfigService := user_notification_config2.NewUserNotificationConfigService(userRepo, userNotificationConfigRepo)
+ userExternalLoginService := user_external_login2.NewUserExternalLoginService(userRepo, userCommon, userExternalLoginRepo, emailService, siteInfoCommonService, userActiveActivityRepo, userNotificationConfigService)
+ questionRepo := question.NewQuestionRepo(dataData, uniqueIDRepo)
+ answerRepo := answer.NewAnswerRepo(dataData, uniqueIDRepo, userRankRepo, activityRepo)
+ voteRepo := activity_common.NewVoteRepo(dataData, activityRepo)
+ followRepo := activity_common.NewFollowRepo(dataData, uniqueIDRepo, activityRepo)
+ tagCommonRepo := tag_common.NewTagCommonRepo(dataData, uniqueIDRepo)
+ tagRelRepo := tag.NewTagRelRepo(dataData, uniqueIDRepo)
+ tagRepo := tag.NewTagRepo(dataData, uniqueIDRepo)
+ revisionRepo := revision.NewRevisionRepo(dataData, uniqueIDRepo)
+ revisionService := revision_common.NewRevisionService(revisionRepo, userRepo)
+ service := activityqueue.NewService()
+ tagCommonService := tag_common2.NewTagCommonService(tagCommonRepo, tagRelRepo, tagRepo, revisionService, siteInfoCommonService, service)
+ collectionRepo := collection.NewCollectionRepo(dataData, uniqueIDRepo)
+ collectionCommon := collectioncommon.NewCollectionCommon(collectionRepo)
+ answerCommon := answercommon.NewAnswerCommon(answerRepo)
+ metaRepo := meta.NewMetaRepo(dataData)
+ metaCommonService := metacommon.NewMetaCommonService(metaRepo)
+ questionCommon := questioncommon.NewQuestionCommon(questionRepo, answerRepo, voteRepo, followRepo, tagCommonService, userCommon, collectionCommon, answerCommon, metaCommonService, configService, service, revisionRepo, siteInfoCommonService, dataData)
+ eventqueueService := eventqueue.NewService()
+ fileRecordRepo := file_record.NewFileRecordRepo(dataData)
+ fileRecordService := file_record2.NewFileRecordService(fileRecordRepo, revisionRepo, serviceConf, siteInfoCommonService, userCommon)
+ userService := content.NewUserService(userRepo, userActiveActivityRepo, activityRepo, emailService, authService, siteInfoCommonService, userRoleRelService, userCommon, userExternalLoginService, userNotificationConfigRepo, userNotificationConfigService, questionCommon, eventqueueService, fileRecordService)
+ captchaRepo := captcha.NewCaptchaRepo(dataData)
+ captchaService := action.NewCaptchaService(captchaRepo)
+ userController := controller.NewUserController(authService, userService, captchaService, emailService, siteInfoCommonService, userNotificationConfigService)
+ commentRepo := comment.NewCommentRepo(dataData, uniqueIDRepo)
+ commentCommonRepo := comment.NewCommentCommonRepo(dataData, uniqueIDRepo)
+ objService := object_info.NewObjService(answerRepo, questionRepo, commentCommonRepo, tagCommonRepo, tagCommonService)
+ noticequeueService := noticequeue.NewService()
+ externalService := noticequeue.NewExternalService()
+ reviewRepo := review.NewReviewRepo(dataData)
+ vector_syncService := vector_sync.NewService(dataData)
+ reviewService := review2.NewReviewService(reviewRepo, objService, userCommon, userRepo, questionRepo, answerRepo, userRoleRelService, externalService, tagCommonService, questionCommon, noticequeueService, siteInfoCommonService, commentCommonRepo, vector_syncService)
+ commentService := comment2.NewCommentService(commentRepo, commentCommonRepo, userCommon, objService, voteRepo, emailService, userRepo, noticequeueService, externalService, service, eventqueueService, reviewService, vector_syncService)
+ rolePowerRelRepo := role.NewRolePowerRelRepo(dataData)
+ rolePowerRelService := role2.NewRolePowerRelService(rolePowerRelRepo, userRoleRelService)
+ rankService := rank2.NewRankService(userCommon, userRankRepo, objService, userRoleRelService, rolePowerRelService, configService)
+ limitRepo := limit.NewRateLimitRepo(dataData)
+ rateLimitMiddleware := middleware.NewRateLimitMiddleware(limitRepo)
+ commentController := controller.NewCommentController(commentService, rankService, captchaService, rateLimitMiddleware)
+ reportRepo := report.NewReportRepo(dataData, uniqueIDRepo)
+ tagService := tag2.NewTagService(tagRepo, tagCommonService, revisionService, followRepo, siteInfoCommonService, service)
+ answerActivityRepo := activity.NewAnswerActivityRepo(dataData, activityRepo, userRankRepo, noticequeueService)
+ answerActivityService := activity2.NewAnswerActivityService(answerActivityRepo, configService)
+ externalNotificationService := notification.NewExternalNotificationService(dataData, userNotificationConfigRepo, followRepo, emailService, userRepo, externalService, userExternalLoginRepo, siteInfoCommonService)
+ questionService := content.NewQuestionService(activityRepo, questionRepo, answerRepo, tagCommonService, tagService, questionCommon, userCommon, userRepo, userRoleRelService, revisionService, metaCommonService, collectionCommon, answerActivityService, emailService, noticequeueService, externalService, service, siteInfoCommonService, externalNotificationService, reviewService, configService, eventqueueService, reviewRepo, vector_syncService)
+ answerService := content.NewAnswerService(answerRepo, questionRepo, questionCommon, userCommon, collectionCommon, userRepo, revisionService, answerActivityService, answerCommon, voteRepo, emailService, userRoleRelService, noticequeueService, externalService, service, reviewService, eventqueueService, vector_syncService)
+ reportHandle := report_handle.NewReportHandle(questionService, answerService, commentService)
+ reportService := report2.NewReportService(reportRepo, objService, userCommon, answerRepo, questionRepo, commentCommonRepo, reportHandle, configService, eventqueueService)
+ reportController := controller.NewReportController(reportService, rankService, captchaService)
+ contentVoteRepo := activity.NewVoteRepo(dataData, activityRepo, userRankRepo, noticequeueService)
+ voteService := content.NewVoteService(contentVoteRepo, configService, questionRepo, answerRepo, commentCommonRepo, objService, eventqueueService)
+ voteController := controller.NewVoteController(voteService, rankService, captchaService)
+ tagController := controller.NewTagController(tagService, tagCommonService, rankService)
+ followFollowRepo := activity.NewFollowRepo(dataData, uniqueIDRepo, activityRepo)
+ followService := follow.NewFollowService(followFollowRepo, followRepo, tagCommonRepo)
+ followController := controller.NewFollowController(followService)
+ collectionGroupRepo := collection.NewCollectionGroupRepo(dataData)
+ collectionService := collection2.NewCollectionService(collectionRepo, collectionGroupRepo, questionCommon)
+ collectionController := controller.NewCollectionController(collectionService)
+ questionController := controller.NewQuestionController(questionService, answerService, rankService, siteInfoCommonService, captchaService, rateLimitMiddleware)
+ answerController := controller.NewAnswerController(answerService, rankService, captchaService, siteInfoCommonService, rateLimitMiddleware)
+ searchParser := search_parser.NewSearchParser(tagCommonService, userCommon)
+ searchRepo := search_common.NewSearchRepo(dataData, uniqueIDRepo, userCommon, tagCommonService)
+ searchService := content.NewSearchService(searchParser, searchRepo)
+ searchController := controller.NewSearchController(searchService, captchaService)
+ reviewActivityRepo := activity.NewReviewActivityRepo(dataData, activityRepo, userRankRepo, configService)
+ contentRevisionService := content.NewRevisionService(revisionRepo, userCommon, questionCommon, answerService, objService, questionRepo, answerRepo, tagRepo, tagCommonService, noticequeueService, service, reportRepo, reviewService, reviewActivityRepo)
+ revisionController := controller.NewRevisionController(contentRevisionService, rankService)
+ rankController := controller.NewRankController(rankService)
+ userAdminRepo := user.NewUserAdminRepo(dataData, authRepo)
+ notificationRepo := notification2.NewNotificationRepo(dataData)
+ pluginUserConfigRepo := plugin_config.NewPluginUserConfigRepo(dataData)
+ badgeAwardRepo := badge_award.NewBadgeAwardRepo(dataData, uniqueIDRepo)
+ userAdminService := user_admin.NewUserAdminService(userAdminRepo, userRoleRelService, authService, userCommon, userActiveActivityRepo, siteInfoCommonService, emailService, questionRepo, answerRepo, commentCommonRepo, userExternalLoginRepo, notificationRepo, pluginUserConfigRepo, badgeAwardRepo, apiKeyRepo)
+ userAdminController := controller_admin.NewUserAdminController(userAdminService)
+ reasonRepo := reason.NewReasonRepo(configService)
+ reasonService := reason2.NewReasonService(reasonRepo)
+ reasonController := controller.NewReasonController(reasonService)
+ themeController := controller_admin.NewThemeController()
+ siteInfoService := siteinfo.NewSiteInfoService(siteInfoRepo, siteInfoCommonService, emailService, tagCommonService, configService, questionCommon, fileRecordService)
+ siteInfoController := controller_admin.NewSiteInfoController(siteInfoService)
+ controllerSiteInfoController := controller.NewSiteInfoController(siteInfoCommonService)
+ notificationCommon := notificationcommon.NewNotificationCommon(dataData, notificationRepo, userCommon, activityRepo, followRepo, objService, noticequeueService, userExternalLoginRepo, siteInfoCommonService)
+ badgeRepo := badge.NewBadgeRepo(dataData, uniqueIDRepo)
+ notificationService := notification.NewNotificationService(dataData, notificationRepo, notificationCommon, revisionService, userRepo, reportRepo, reviewService, badgeRepo)
+ notificationController := controller.NewNotificationController(notificationService, rankService)
+ dashboardService := dashboard.NewDashboardService(questionRepo, answerRepo, commentCommonRepo, voteRepo, userRepo, reportRepo, configService, siteInfoCommonService, serviceConf, reviewService, revisionRepo, dataData)
+ dashboardController := controller.NewDashboardController(dashboardService)
+ uploaderService := uploader.NewUploaderService(serviceConf, siteInfoCommonService, fileRecordService)
+ uploadController := controller.NewUploadController(uploaderService)
+ activityActivityRepo := activity.NewActivityRepo(dataData, configService)
+ activityCommon := activity_common2.NewActivityCommon(activityRepo, service)
+ commentCommonService := comment_common.NewCommentCommonService(commentCommonRepo)
+ activityService := activity2.NewActivityService(activityActivityRepo, userCommon, activityCommon, tagCommonService, objService, commentCommonService, revisionService, metaCommonService, configService)
+ activityController := controller.NewActivityController(activityService)
+ roleController := controller_admin.NewRoleController(roleService)
+ pluginConfigRepo := plugin_config.NewPluginConfigRepo(dataData)
+ importerService := importer.NewImporterService(questionService, rankService, userCommon)
+ pluginCommonService := plugin_common.NewPluginCommonService(pluginConfigRepo, pluginUserConfigRepo, configService, dataData, importerService)
+ pluginController := controller_admin.NewPluginController(pluginCommonService)
+ permissionController := controller.NewPermissionController(rankService)
+ userPluginController := controller.NewUserPluginController(pluginCommonService)
+ reviewController := controller.NewReviewController(reviewService, rankService, captchaService)
+ metaService := meta2.NewMetaService(metaCommonService, userCommon, answerRepo, questionRepo, eventqueueService)
+ metaController := controller.NewMetaController(metaService)
+ badgeGroupRepo := badge_group.NewBadgeGroupRepo(dataData, uniqueIDRepo)
+ eventRuleRepo := badge.NewEventRuleRepo(dataData)
+ badgeAwardService := badge2.NewBadgeAwardService(badgeAwardRepo, badgeRepo, userCommon, objService, noticequeueService)
+ badgeEventService := badge2.NewBadgeEventService(dataData, eventqueueService, badgeRepo, eventRuleRepo, badgeAwardService)
+ badgeService := badge2.NewBadgeService(badgeRepo, badgeGroupRepo, badgeAwardRepo, badgeEventService, siteInfoCommonService)
+ badgeController := controller.NewBadgeController(badgeService, badgeAwardService)
+ controller_adminBadgeController := controller_admin.NewBadgeController(badgeService)
+ apiKeyService := apikey.NewAPIKeyService(apiKeyRepo)
+ adminAPIKeyController := controller_admin.NewAdminAPIKeyController(apiKeyService)
+ featureToggleService := feature_toggle.NewFeatureToggleService(siteInfoRepo)
+ embeddingService := embedding.NewEmbeddingService()
+ mcpController := controller.NewMCPController(searchService, siteInfoCommonService, tagCommonService, questionCommon, commentRepo, userCommon, answerRepo, featureToggleService, embeddingService)
+ aiConversationRepo := ai_conversation.NewAIConversationRepo(dataData)
+ aiConversationService := ai_conversation2.NewAIConversationService(aiConversationRepo, userCommon)
+ aiController := controller.NewAIController(searchService, siteInfoCommonService, tagCommonService, questionCommon, commentRepo, userCommon, answerRepo, mcpController, aiConversationService, featureToggleService)
+ aiConversationController := controller.NewAIConversationController(aiConversationService, featureToggleService)
+ aiConversationAdminController := controller_admin.NewAIConversationAdminController(aiConversationService, featureToggleService)
+ answerAPIRouter := router.NewAnswerAPIRouter(langController, userController, commentController, reportController, voteController, tagController, followController, collectionController, questionController, answerController, searchController, revisionController, rankController, userAdminController, reasonController, themeController, siteInfoController, controllerSiteInfoController, notificationController, dashboardController, uploadController, activityController, roleController, pluginController, permissionController, userPluginController, reviewController, metaController, badgeController, controller_adminBadgeController, adminAPIKeyController, aiController, aiConversationController, aiConversationAdminController, mcpController)
+ swaggerRouter := router.NewSwaggerRouter(swaggerConf)
+ uiRouter := router.NewUIRouter(controllerSiteInfoController, siteInfoCommonService)
+ authUserMiddleware := middleware.NewAuthUserMiddleware(authService, siteInfoCommonService)
+ avatarMiddleware := middleware.NewAvatarMiddleware(serviceConf, uploaderService)
+ shortIDMiddleware := middleware.NewShortIDMiddleware(siteInfoCommonService)
+ templateRenderController := templaterender.NewTemplateRenderController(questionService, userService, tagService, answerService, commentService, siteInfoCommonService, questionRepo)
+ templateController := controller.NewTemplateController(templateRenderController, siteInfoCommonService, eventqueueService, userService, questionService)
+ templateRouter := router.NewTemplateRouter(templateController, templateRenderController, siteInfoController, authUserMiddleware)
+ connectorController := controller.NewConnectorController(siteInfoCommonService, emailService, userExternalLoginService)
+ userCenterLoginService := user_external_login2.NewUserCenterLoginService(userRepo, userCommon, userExternalLoginRepo, userActiveActivityRepo, siteInfoCommonService)
+ userCenterController := controller.NewUserCenterController(userCenterLoginService, siteInfoCommonService)
+ captchaController := controller.NewCaptchaController()
+ embedController := controller.NewEmbedController()
+ renderController := controller.NewRenderController()
+ sidebarController := controller.NewSidebarController()
+ pluginAPIRouter := router.NewPluginAPIRouter(connectorController, userCenterController, captchaController, embedController, renderController, sidebarController)
+ ginEngine := server.NewHTTPServer(debug, staticRouter, answerAPIRouter, swaggerRouter, uiRouter, authUserMiddleware, avatarMiddleware, shortIDMiddleware, templateRouter, pluginAPIRouter, uiConf)
+ scheduledTaskManager := cron.NewScheduledTaskManager(siteInfoCommonService, questionService, fileRecordService, userAdminService, serviceConf)
+ application := newApplication(serverConf, ginEngine, scheduledTaskManager)
+ return application, func() {
+ cleanup2()
+ cleanup()
+ }, nil
+}
diff --git a/configs/config.go b/configs/config.go
new file mode 100644
index 0000000..d6c1b50
--- /dev/null
+++ b/configs/config.go
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 configs
+
+import _ "embed"
+
+//go:embed config.yaml
+var Config []byte
+
+//go:embed path_ignore.yaml
+var PathIgnore []byte
+
+//go:embed reserved-usernames.json
+var ReservedUsernames []byte
diff --git a/configs/config.yaml b/configs/config.yaml
new file mode 100644
index 0000000..d140727
--- /dev/null
+++ b/configs/config.yaml
@@ -0,0 +1,44 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+server:
+ http:
+ addr: 0.0.0.0:80
+data:
+ database:
+ driver: "sqlite3"
+ connection: "/data/sqlite3/answer.db"
+ cache:
+ file_path: "/data/cache/cache.db"
+i18n:
+ bundle_dir: "/data/i18n"
+swaggerui:
+ show: true
+ protocol: http
+ host: 127.0.0.1
+ address: ':80'
+service_config:
+ upload_path: "/data/uploads"
+ clean_up_uploads: true
+ clean_orphan_uploads_period_hours: 48
+ purge_deleted_files_period_days: 30
+ui:
+ public_url: '/'
+ api_url: '/'
+ base_url: ''
+ api_base_url: ''
+
diff --git a/configs/path_ignore.yaml b/configs/path_ignore.yaml
new file mode 100644
index 0000000..149c6b2
--- /dev/null
+++ b/configs/path_ignore.yaml
@@ -0,0 +1,35 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+# url path reserves the keywords list
+questions:
+ - ask
+tags:
+ - create
+users:
+ - unsubscribe
+ - settings
+ - login
+ - register
+ - account-recovery
+ - change-email
+ - password-reset
+ - account-activation
+ - confirm-new-email
+ - account-suspended
+ - confirm-email
+ - auth-landing
diff --git a/configs/reserved-usernames.json b/configs/reserved-usernames.json
new file mode 100644
index 0000000..deb6c82
--- /dev/null
+++ b/configs/reserved-usernames.json
@@ -0,0 +1 @@
+["0","100","101","102","1xx","200","201","202","203","204","205","206","207","226","2xx","300","301","302","303","304","305","307","308","3xx","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","422","423","424","426","428","429","431","451","4xx","500","501","502","503","504","505","506","507","511","5xx","7xx","about","abuse","access","account","account-activation","account-recovery","account-suspended","accounts","activate","activities","activity","ad","add","address","adm","admin","administration","administrator","ads","adult","advertising","affiliate","affiliates","ajax","all","alpha","analysis","analytics","android","anon","anonymous","api","app","apps","archive","archives","article","asct","asset","atom","auth","auth-landing","authentication","autoconfig","avatar","backup","balancer-manager","bank","banner","banners","beta","billing","bin","blog","blogs","board","book","bookmark","bot","bots","broadcasthost","bug","bugs","business","cache","cadastro","calendar","call","campaign","cancel","captcha","career","careers","cart","categories","category","cgi","cgi-bin","changelog","change-email","chat","check","checking","checkout","client","cliente","clients","code","codereview","comercial","comment","comments","communities","community","company","compare","compras","config","configuration","confirm-new-email","confirm-email","connect","contact","contact-us","contact_us","contactus","contest","contribute","corp","create","crypt","css","dashboard","data","db","default","delete","demo","design","designer","destroy","dev","devel","developer","developers","diagram","diary","dict","dictionary","die","dir","direct_messages","directory","dist","dns","doc","docker","docs","documentation","domain","download","downloads","ecommerce","edit","editor","edu","education","email","employment","empty","end","enterprise","entries","entry","error","errors","eval","event","everyone","exit","explore","export","facebook","faq","favorite","favorites","fbi","feature","features","feed","feedback","feeds","file","files","firewall","first","flash","fleet","fleets","flog","follow","followers","following","forgot","forgot-password","forgot_password","forgotpassword","form","forum","forums","founder","free","friend","friends","ftp","gadget","gadgets","game","games","get","ghost","gift","gifts","gist","git","github","graph","group","groups","guest","guests","help","home","homepage","hooks","host","hosting","hostmaster","hostname","howto","hpg","html","http","httpd","https","i","iamges","icon","icons","id","idea","ideas","image","images","imap","img","index","indice","info","information","inquiry","instagram","intranet","invitations","invite","ip","ipad","iphone","irc","is","isatap","issue","issues","it","item","items","java","javascript","job","jobs","join","js","json","jump","keys","keyserver","knowledgebase","language","languages","last","ldap-status","legal","license","link","links","linux","list","lists","local","localdomain","localhost","log","log-in","log-out","log_in","log_out","login","logout","logs","m","mac","mail","mail1","mail2","mail3","mail4","mail5","mailer","mailer-daemon","mailing","maintenance","manager","manual","map","maps","marketing","master","me","media","member","members","message","messages","messenger","microblog","microblogs","mine","mis","mob","mobile","movie","movies","mp3","msg","msn","music","musicas","mx","my","mysql","name","named","names","namespace","namespaces","nan","navi","navigation","net","network","new","news","newsletter","nick","nickname","no-reply","nobody","noc","noreply","notes","noticias","notification","notifications","notify","ns","ns1","ns10","ns2","ns3","ns4","ns5","ns6","ns7","ns8","ns9","null","oauth","oauth_clients","offer","offers","official","old","online","openid","operator","ops","order","orders","organization","organizations","orgs","overview","owner","owners","package","page","pager","pages","panel","passwd","password","password-reset","patch","payment","perl","phone","photo","photoalbum","photos","php","phpmyadmin","phppgadmin","phpredisadmin","pic","pics","ping","plan","plans","plugin","plugins","policy","pop","pop3","popular","portal","post","postfix","postmaster","posts","pr","premium","press","price","pricing","privacy","privacy-policy","privacy_policy","privacypolicy","private","product","products","profile","project","projects","promo","pub","public","purpose","put","pw","python","query","random","ranking","read","readme","recent","recruit","recruitment","register","registration","release","releases","remote","remove","replies","reply","report","reports","repositories","repository","req","request","requests","res","reset","reset-password","reset_password","resetpassword","resource","resources","roc","root","rss","ruby","rule","rules","sag","sale","sales","sample","samples","save","school","script","scripts","search","secure","security","self","send","server","server-info","server-status","service","services","session","sessions","setting","settings","setup","share","shop","show","sign-in","sign-up","sign_in","sign_up","signin","signout","signup","site","sitemap","sites","smartphone","smtp","soporte","source","spec","special","sql","src","ssh","ssl","ssladmin","ssladministrator","sslwebmaster","staff","stage","staging","start","stat","state","static","stats","status","store","stores","stories","style","styleguide","styles","stylesheet","stylesheets","subdomain","subscribe","subscriptions","suporte","support","svn","swf","sys","sysadmin","sysadministrator","system","tablet","tablets","tag","tags","talk","task","tasks","team","teams","tech","telnet","term","terms","terms-of-service","terms_of_service","termsofservice","test","test1","test2","test3","teste","testing","tests","theme","themes","thread","threads","tls","tmp","todo","token","tokenserver","tool","tools","top","topic","topics","tos","tour","translations","trends","tutorial","tux","tv","twitter","undef","unfollow","unsubscribe","update","upload","uploads","uptime","url","usage","usenet","user","username","users","usr","usuario","util","uucp","vendas","ver","version","video","videos","visitor","vpn","watch","weather","web","webhook","webhooks","webmail","webmaster","website","websites","welcome","widget","widgets","wiki","win","windows","word","work","works","workshop","wpad","ww","wws","www","www1","www2","www3","www4","www5","www6","www7","wwws","wwww","xfn","xml","xmpp","xpg","xxx","yaml","year","yml","you","yourdomain","yourname","yoursite","yourusername"]
\ No newline at end of file
diff --git a/crowdin.yml b/crowdin.yml
new file mode 100644
index 0000000..cdda4e7
--- /dev/null
+++ b/crowdin.yml
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+files:
+ - source: /i18n/en_US.yaml
+ translation: /i18n/%locale_with_underscore%.yaml
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..58e8ea0
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+version: "3"
+services:
+ answer:
+ image: apache/answer
+ ports:
+ - '9080:80'
+ restart: on-failure
+ volumes:
+ - answer-data:/data
+
+volumes:
+ answer-data:
diff --git a/docs/docs.go b/docs/docs.go
new file mode 100644
index 0000000..4e48c88
--- /dev/null
+++ b/docs/docs.go
@@ -0,0 +1,13516 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 docs Code generated by swaggo/swag. DO NOT EDIT
+package docs
+
+import "github.com/swaggo/swag"
+
+const docTemplate = `{
+ "schemes": {{ marshal .Schemes }},
+ "swagger": "2.0",
+ "info": {
+ "description": "{{escape .Description}}",
+ "title": "{{.Title}}",
+ "contact": {},
+ "version": "{{.Version}}"
+ },
+ "host": "{{.Host}}",
+ "basePath": "{{.BasePath}}",
+ "paths": {
+ "/": {
+ "get": {
+ "description": "if config file not exist try to redirect to install page",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "installation"
+ ],
+ "summary": "if config file not exist try to redirect to install page",
+ "responses": {}
+ }
+ },
+ "/answer/admin/api/ai-config": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get AI configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get AI configuration",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteAIResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update AI configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update AI configuration",
+ "parameters": [
+ {
+ "description": "AI config",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteAIReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/ai-models": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get AI models",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get AI models",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetAIModelResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/ai-provider": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get AI provider configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get AI provider configuration",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetAIProviderResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/ai/conversation": {
+ "get": {
+ "description": "get conversation detail for admin",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "ai-conversation-admin"
+ ],
+ "summary": "get conversation detail for admin",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "conversation id",
+ "name": "conversation_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.AIConversationAdminDetailResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "delete": {
+ "description": "delete conversation and its related records for admin",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "ai-conversation-admin"
+ ],
+ "summary": "delete conversation for admin",
+ "parameters": [
+ {
+ "description": "apikey",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AIConversationAdminDeleteReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/ai/conversation/page": {
+ "get": {
+ "description": "get conversation list for admin",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "ai-conversation-admin"
+ ],
+ "summary": "get conversation list for admin",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.AIConversationAdminListItem"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/answer/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Status:[available,deleted,pending]",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "AdminAnswerPage admin answer page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "available",
+ "deleted",
+ "pending"
+ ],
+ "type": "string",
+ "description": "user status",
+ "name": "status",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "answer id or question title",
+ "name": "query",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "question id",
+ "name": "question_id",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/answer/status": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update answer status",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update answer status",
+ "parameters": [
+ {
+ "description": "AdminUpdateAnswerStatusReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AdminUpdateAnswerStatusReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/api-key": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update apikey",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update apikey",
+ "parameters": [
+ {
+ "description": "apikey",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateAPIKeyReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add apikey",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "add apikey",
+ "parameters": [
+ {
+ "description": "apikey",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddAPIKeyReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.AddAPIKeyResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "delete apikey",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "delete apikey",
+ "parameters": [
+ {
+ "description": "apikey",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.DeleteAPIKeyReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/api-key/all": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get all api keys",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get all api keys",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetAPIKeyResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/badge/status": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update badge status",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "AdminBadge"
+ ],
+ "summary": "update badge status",
+ "parameters": [
+ {
+ "description": "UpdateBadgeStatusReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateBadgeStatusReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/badges": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "list all badges by page",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "AdminBadge"
+ ],
+ "summary": "list all badges by page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "",
+ "active",
+ "inactive"
+ ],
+ "type": "string",
+ "description": "badge status",
+ "name": "status",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "search param",
+ "name": "q",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetBadgeListPagedResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/dashboard": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "DashboardInfo",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "DashboardInfo",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/delete/permanently": {
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "delete permanently",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "delete permanently",
+ "parameters": [
+ {
+ "description": "DeletePermanentlyReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.DeletePermanentlyReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/language/options": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Get language options",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Lang"
+ ],
+ "summary": "Get language options",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/mcp-config": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get MCP configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get MCP configuration",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteMCPResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update MCP configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update MCP configuration",
+ "parameters": [
+ {
+ "description": "MCP config",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteMCPReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/plugin/config": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get plugin config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "AdminPlugin"
+ ],
+ "summary": "get plugin config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "plugin_slug_name",
+ "name": "plugin_slug_name",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetPluginConfigResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update plugin config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "AdminPlugin"
+ ],
+ "summary": "update plugin config",
+ "parameters": [
+ {
+ "description": "UpdatePluginConfigReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdatePluginConfigReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/plugin/status": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update plugin status",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "AdminPlugin"
+ ],
+ "summary": "update plugin status",
+ "parameters": [
+ {
+ "description": "UpdatePluginStatusReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdatePluginStatusReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/plugins": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get plugin list",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "AdminPlugin"
+ ],
+ "summary": "get plugin list",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "status: active/inactive",
+ "name": "status",
+ "in": "query"
+ },
+ {
+ "type": "boolean",
+ "description": "have config",
+ "name": "have_config",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetPluginListResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/question/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Status:[available,closed,deleted,pending]",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "AdminQuestionPage admin question page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "available",
+ "closed",
+ "deleted",
+ "pending"
+ ],
+ "type": "string",
+ "description": "user status",
+ "name": "status",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "question id or title",
+ "name": "query",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/question/status": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update question status",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update question status",
+ "parameters": [
+ {
+ "description": "AdminUpdateQuestionStatusReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AdminUpdateQuestionStatusReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/reasons": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get reasons by object type and action",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "reason"
+ ],
+ "summary": "get reasons by object type and action",
+ "parameters": [
+ {
+ "enum": [
+ "question",
+ "answer",
+ "comment",
+ "user"
+ ],
+ "type": "string",
+ "description": "object_type",
+ "name": "object_type",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "status",
+ "close",
+ "flag",
+ "review"
+ ],
+ "type": "string",
+ "description": "action",
+ "name": "action",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/roles": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get role list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get role list",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetRoleResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/setting/privileges": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "GetPrivilegesConfig get privileges config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "GetPrivilegesConfig get privileges config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetPrivilegesConfigResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update privileges config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update privileges config",
+ "parameters": [
+ {
+ "description": "config",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdatePrivilegesConfigReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/setting/smtp": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "GetSMTPConfig get smtp config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "GetSMTPConfig get smtp config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetSMTPConfigResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update smtp config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update smtp config",
+ "parameters": [
+ {
+ "description": "smtp config",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateSMTPConfigReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/advanced": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site advanced setting",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site advanced setting",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteAdvancedResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site advanced info",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site advanced info",
+ "parameters": [
+ {
+ "description": "advanced settings",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteAdvancedReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/branding": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site interface",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site interface",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteBrandingResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site info branding",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site info branding",
+ "parameters": [
+ {
+ "description": "branding info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteBrandingReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/custom-css-html": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site info custom html css config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site info custom html css config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteCustomCssHTMLResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site custom css html config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site custom css html config",
+ "parameters": [
+ {
+ "description": "login info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteCustomCssHTMLReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/general": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site general information",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site general information",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteGeneralResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site general information",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site general information",
+ "parameters": [
+ {
+ "description": "general",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteGeneralReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/interface": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site interface",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site interface",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteInterfaceSettingsResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site info interface",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site info interface",
+ "parameters": [
+ {
+ "description": "general",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteInterfaceReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/login": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site info login config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site info login config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteLoginResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site login",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site login",
+ "parameters": [
+ {
+ "description": "login info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteLoginReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/polices": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Get the policies information for the site",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "Get the policies information for the site",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SitePoliciesResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site policies configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site policies configuration",
+ "parameters": [
+ {
+ "description": "write info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SitePoliciesReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/question": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site questions setting",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site questions setting",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteQuestionsResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site question settings",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site question settings",
+ "parameters": [
+ {
+ "description": "questions settings",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteQuestionsReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/security": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Get the security information for the site",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "Get the security information for the site",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteSecurityResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site security configuration",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site security configuration",
+ "parameters": [
+ {
+ "description": "write info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteSecurityReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/seo": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site seo information",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site seo information",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteSeoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site seo information",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site seo information",
+ "parameters": [
+ {
+ "description": "seo",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteSeoReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/tag": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site tags setting",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site tags setting",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteTagsResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site tag settings",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site tag settings",
+ "parameters": [
+ {
+ "description": "tags settings",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteTagsReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/theme": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site info theme config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site info theme config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteThemeResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site custom css html config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site custom css html config",
+ "parameters": [
+ {
+ "description": "login info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteThemeReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/users": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site user config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site user config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteUsersResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site info config about users",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site info config about users",
+ "parameters": [
+ {
+ "description": "users info",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteUsersReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/siteinfo/users-settings": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get site interface",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get site interface",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteUsersSettingsResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update site info users settings",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update site info users settings",
+ "parameters": [
+ {
+ "description": "general",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SiteUsersSettingsReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/theme/options": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Get theme options",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "Get theme options",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/user": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add user",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "add user",
+ "parameters": [
+ {
+ "description": "user",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddUserReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/user/activation": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user activation",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get user activation",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "user id",
+ "name": "user_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetUserActivationResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/user/password": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update user password",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update user password",
+ "parameters": [
+ {
+ "description": "user",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateUserPasswordReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/user/profile": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "edit user profile",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "edit user profile",
+ "parameters": [
+ {
+ "description": "user",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.EditUserProfileReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/user/role": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update user role",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update user role",
+ "parameters": [
+ {
+ "description": "user",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateUserRoleReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/user/status": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update user",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "update user",
+ "parameters": [
+ {
+ "description": "user",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateUserStatusReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/users": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add users",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "add users",
+ "parameters": [
+ {
+ "description": "user",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddUsersReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/users/activation": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "send user activation",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "send user activation",
+ "parameters": [
+ {
+ "description": "SendUserActivationReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.SendUserActivationReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/admin/api/users/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user page",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "admin"
+ ],
+ "summary": "get user page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "search query: email, username or id:[id]",
+ "name": "query",
+ "in": "query"
+ },
+ {
+ "type": "boolean",
+ "description": "staff user",
+ "name": "staff",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "suspended",
+ "deleted",
+ "inactive"
+ ],
+ "type": "string",
+ "description": "user status",
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "records": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetUserPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/activity/timeline": {
+ "get": {
+ "description": "get object timeline",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "get object timeline",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "object id",
+ "name": "object_id",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "tag slug name",
+ "name": "tag_slug_name",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "question",
+ "answer",
+ "tag"
+ ],
+ "type": "string",
+ "description": "object type",
+ "name": "object_type",
+ "in": "query"
+ },
+ {
+ "type": "boolean",
+ "description": "is show vote",
+ "name": "show_vote",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetObjectTimelineResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/activity/timeline/detail": {
+ "get": {
+ "description": "get object timeline detail",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "get object timeline detail",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "revision id",
+ "name": "revision_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetObjectTimelineResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/ai/conversation": {
+ "get": {
+ "description": "get conversation detail",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "ai-conversation"
+ ],
+ "summary": "get conversation detail",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "conversation id",
+ "name": "conversation_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.AIConversationDetailResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/ai/conversation/page": {
+ "get": {
+ "description": "get conversation list",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "ai-conversation"
+ ],
+ "summary": "get conversation list",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.AIConversationListItem"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/ai/conversation/vote": {
+ "post": {
+ "description": "vote record",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "ai-conversation"
+ ],
+ "summary": "vote record",
+ "parameters": [
+ {
+ "description": "vote request",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AIConversationVoteReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/answer": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Update Answer",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "Update Answer",
+ "parameters": [
+ {
+ "description": "AnswerUpdateReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AnswerUpdateReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add answer",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "Add Answer",
+ "parameters": [
+ {
+ "description": "add answer request",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AnswerAddReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "delete answer",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "delete answer",
+ "parameters": [
+ {
+ "description": "answer",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RemoveAnswerReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/answer/acceptance": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Accept Answer",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "Accept Answer",
+ "parameters": [
+ {
+ "description": "AcceptAnswerReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AcceptAnswerReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/answer/info": {
+ "get": {
+ "description": "Get Answer Detail",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "Get Answer Detail",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "id",
+ "name": "id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetAnswerInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/answer/page": {
+ "get": {
+ "description": "AnswerList \u003cbr\u003e \u003cb\u003eorder\u003c/b\u003e (default or updated)",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "AnswerList",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "question_id",
+ "name": "question_id",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "order",
+ "name": "order",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "page",
+ "name": "page",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "page_size",
+ "name": "page_size",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/answer/recover": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "recover the deleted answer",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Answer"
+ ],
+ "summary": "recover answer",
+ "parameters": [
+ {
+ "description": "answer",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RecoverAnswerReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/badge": {
+ "get": {
+ "description": "get badge info",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "api-badge"
+ ],
+ "summary": "get badge info",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "string",
+ "description": "id",
+ "name": "id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetBadgeInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/badge/awards/page": {
+ "get": {
+ "description": "get badge award list",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "api-badge"
+ ],
+ "summary": "get badge award list",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "badge id",
+ "name": "badge_id",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "only list the award by username",
+ "name": "username",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetBadgeInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/badge/user/awards": {
+ "get": {
+ "description": "get user badge award list",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "api-badge"
+ ],
+ "summary": "get user badge award list",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "user name",
+ "name": "username",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetUserBadgeAwardListResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/badge/user/awards/recent": {
+ "get": {
+ "description": "get user badge award list",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "api-badge"
+ ],
+ "summary": "get user badge award list",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "user name",
+ "name": "username",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetUserBadgeAwardListResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/badges": {
+ "get": {
+ "description": "list all badges group by group",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "api-badge"
+ ],
+ "summary": "list all badges group by group",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetBadgeListResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/collection/switch": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add collection",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Collection"
+ ],
+ "summary": "add collection",
+ "parameters": [
+ {
+ "description": "collection",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.CollectionSwitchReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.CollectionSwitchResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/comment": {
+ "get": {
+ "description": "get comment by id",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "get comment by id",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "id",
+ "name": "id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetCommentResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update comment",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "update comment",
+ "parameters": [
+ {
+ "description": "comment",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateCommentReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add comment",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "add comment",
+ "parameters": [
+ {
+ "description": "comment",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddCommentReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetCommentResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "remove comment",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "remove comment",
+ "parameters": [
+ {
+ "description": "comment",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RemoveCommentReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/comment/page": {
+ "get": {
+ "description": "get comment page",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "get comment page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "object id",
+ "name": "object_id",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "vote"
+ ],
+ "type": "string",
+ "description": "query condition",
+ "name": "query_cond",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetCommentResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/connector/binding/email": {
+ "post": {
+ "description": "external login binding user send email",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "PluginConnector"
+ ],
+ "summary": "external login binding user send email",
+ "parameters": [
+ {
+ "description": "external login binding user send email",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.ExternalLoginBindingUserSendEmailReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.ExternalLoginBindingUserSendEmailResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/connector/info": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get all enabled connectors",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "PluginConnector"
+ ],
+ "summary": "get all enabled connectors",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.ConnectorInfoResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/connector/user/info": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get all connectors info about user",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "PluginConnector"
+ ],
+ "summary": "get all connectors info about user",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.ConnectorUserInfoResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/connector/user/unbinding": {
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "unbind external user login",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "PluginConnector"
+ ],
+ "summary": "unbind external user login",
+ "parameters": [
+ {
+ "description": "ExternalLoginUnbindingReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.ExternalLoginUnbindingReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/embed/config": {
+ "get": {
+ "description": "get embed plugin config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Plugin"
+ ],
+ "summary": "get embed plugin config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/plugin.EmbedConfig"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/file": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "upload file",
+ "consumes": [
+ "multipart/form-data"
+ ],
+ "tags": [
+ "Upload"
+ ],
+ "summary": "upload file",
+ "parameters": [
+ {
+ "enum": [
+ "post",
+ "post_attachment",
+ "avatar",
+ "branding"
+ ],
+ "type": "string",
+ "description": "identify the source of the file upload",
+ "name": "source",
+ "in": "formData",
+ "required": true
+ },
+ {
+ "type": "file",
+ "description": "file",
+ "name": "file",
+ "in": "formData",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "string"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/follow": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "follow object or cancel follow operation",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Activity"
+ ],
+ "summary": "follow object or cancel follow operation",
+ "parameters": [
+ {
+ "description": "follow",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.FollowReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.FollowResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/follow/tags": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update user follow tags",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Activity"
+ ],
+ "summary": "update user follow tags",
+ "parameters": [
+ {
+ "description": "follow",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateFollowTagsReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/language/config": {
+ "get": {
+ "description": "get language config mapping",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Lang"
+ ],
+ "summary": "get language config mapping",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Accept-Language",
+ "name": "Accept-Language",
+ "in": "header",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/language/options": {
+ "get": {
+ "description": "Get language options",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Lang"
+ ],
+ "summary": "Get language options",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/meta/reaction": {
+ "get": {
+ "description": "get reaction for an object",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Meta"
+ ],
+ "summary": "get reaction",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "object_id",
+ "name": "object_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.ReactionRespItem"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update reaction. if not exist, add one",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Meta"
+ ],
+ "summary": "add or update reaction",
+ "parameters": [
+ {
+ "description": "reaction",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateReactionReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/notification/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get notification list",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notification"
+ ],
+ "summary": "get notification list",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "inbox",
+ "achievement"
+ ],
+ "type": "string",
+ "description": "type",
+ "name": "type",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "all",
+ "posts",
+ "invites",
+ "votes"
+ ],
+ "type": "string",
+ "description": "inbox_type",
+ "name": "inbox_type",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/notification/read/state": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "ClearUnRead",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notification"
+ ],
+ "summary": "ClearUnRead",
+ "parameters": [
+ {
+ "description": "NotificationClearIDRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.NotificationClearIDRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/notification/read/state/all": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "ClearUnRead",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notification"
+ ],
+ "summary": "ClearUnRead",
+ "parameters": [
+ {
+ "description": "NotificationClearRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.NotificationClearRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/notification/status": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "GetRedDot",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notification"
+ ],
+ "summary": "GetRedDot",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "DelRedDot",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notification"
+ ],
+ "summary": "DelRedDot",
+ "parameters": [
+ {
+ "description": "NotificationClearRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.NotificationClearRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/permission": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "check user permission",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Permission"
+ ],
+ "summary": "check user permission",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "access-token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "enum": [
+ "question.add",
+ "question.edit",
+ "question.edit_without_review",
+ "question.delete",
+ "question.close",
+ "question.reopen",
+ "question.vote_up",
+ "question.vote_down",
+ "question.pin",
+ "question.unpin",
+ "question.hide",
+ "question.show",
+ "answer.add",
+ "answer.edit",
+ "answer.edit_without_review",
+ "answer.delete",
+ "answer.accept",
+ "answer.vote_up",
+ "answer.vote_down",
+ "answer.invite_someone_to_answer",
+ "comment.add",
+ "comment.edit",
+ "comment.delete",
+ "comment.vote_up",
+ "comment.vote_down",
+ "report.add",
+ "tag.add",
+ "tag.edit",
+ "tag.edit_slug_name",
+ "tag.edit_without_review",
+ "tag.delete",
+ "tag.synonym",
+ "link.url_limit",
+ "vote.detail",
+ "answer.audit",
+ "question.audit",
+ "tag.audit",
+ "tag.use_reserved_tag"
+ ],
+ "type": "string",
+ "description": "permission key",
+ "name": "action",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/answer/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "list personal answers",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Personal"
+ ],
+ "summary": "list personal answers",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "newest",
+ "score"
+ ],
+ "type": "string",
+ "description": "order",
+ "name": "order",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "default": "0",
+ "description": "page",
+ "name": "page",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "default": "20",
+ "description": "page_size",
+ "name": "page_size",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/collection/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "list personal collections",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Collection"
+ ],
+ "summary": "list personal collections",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "0",
+ "description": "page",
+ "name": "page",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "default": "20",
+ "description": "page_size",
+ "name": "page_size",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/comment/page": {
+ "get": {
+ "description": "user personal comment list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Comment"
+ ],
+ "summary": "user personal comment list",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetCommentPersonalWithPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/qa/top": {
+ "get": {
+ "description": "UserTop",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "UserTop",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/rank/page": {
+ "get": {
+ "description": "user personal rank list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Rank"
+ ],
+ "summary": "user personal rank list",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetRankPersonalPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/user/info": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "GetOtherUserInfoByUsername",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "GetOtherUserInfoByUsername",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetOtherUserInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/personal/vote/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user personal votes",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Activity"
+ ],
+ "summary": "get user personal votes",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetVoteWithPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/plugin/status": {
+ "get": {
+ "description": "get all plugins status",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Plugin"
+ ],
+ "summary": "get all plugins status",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetPluginListResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/post/render": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "render post content",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Upload"
+ ],
+ "summary": "render post content",
+ "parameters": [
+ {
+ "description": "PostRenderReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.PostRenderReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "update question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "add question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionAdd"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "delete question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "delete question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RemoveQuestionReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/answer": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add question and answer",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "add question and answer",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionAddByAnswer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/info": {
+ "get": {
+ "description": "get question details",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "get question details",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "1",
+ "description": "Question TagID",
+ "name": "id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/invite": {
+ "get": {
+ "description": "get question invite user info",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "get question invite user info",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "1",
+ "description": "Question ID",
+ "name": "id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update question invite user",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "update question invite user",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionUpdateInviteUser"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/link": {
+ "get": {
+ "description": "get question link",
+ "tags": [
+ "Question"
+ ],
+ "summary": "get question link",
+ "parameters": [
+ {
+ "minimum": 1,
+ "type": "integer",
+ "name": "in_days",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "newest",
+ "active",
+ "hot",
+ "score",
+ "unanswered",
+ "recommend",
+ "frequent"
+ ],
+ "type": "string",
+ "name": "order",
+ "in": "query"
+ },
+ {
+ "minimum": 1,
+ "type": "integer",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "maximum": 100,
+ "minimum": 1,
+ "type": "integer",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "name": "question_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.QuestionPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/operation": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Operation question \\n operation [pin unpin hide show]",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "Operation question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.OperationQuestionReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/page": {
+ "get": {
+ "description": "get questions by page",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "get questions by page",
+ "parameters": [
+ {
+ "description": "QuestionPageReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionPageReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.QuestionPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/recommend/page": {
+ "get": {
+ "description": "get recommend questions by page",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "get recommend questions by page",
+ "parameters": [
+ {
+ "description": "QuestionPageReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionPageReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.QuestionPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/recover": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "recover deleted question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "recover deleted question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.QuestionRecoverReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/reopen": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "reopen question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "reopen question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.ReopenQuestionReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/similar": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "fuzzy query similar questions based on title",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "fuzzy query similar questions based on title",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "string",
+ "description": "title",
+ "name": "title",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/similar/tag": {
+ "get": {
+ "description": "Search Similar Question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "Search Similar Question",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "",
+ "description": "question_id",
+ "name": "question_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/status": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "Close question",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Question"
+ ],
+ "summary": "Close question",
+ "parameters": [
+ {
+ "description": "question",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.CloseQuestionReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/question/tags": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get tag list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "get tag list",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tag",
+ "name": "tag",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetTagBasicResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/reasons": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get reasons by object type and action",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "reason"
+ ],
+ "summary": "get reasons by object type and action",
+ "parameters": [
+ {
+ "enum": [
+ "question",
+ "answer",
+ "comment",
+ "user"
+ ],
+ "type": "string",
+ "description": "object_type",
+ "name": "object_type",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "status",
+ "close",
+ "flag",
+ "review"
+ ],
+ "type": "string",
+ "description": "action",
+ "name": "action",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/render/config": {
+ "get": {
+ "description": "GetRenderConfig",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "PluginRender"
+ ],
+ "summary": "GetRenderConfig",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/plugin.RenderConfig"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/report": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add report \u003cbr\u003e source (question, answer, comment, user)",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Report"
+ ],
+ "summary": "add report",
+ "parameters": [
+ {
+ "description": "report",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddReportReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/report/review": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "review report",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Report"
+ ],
+ "summary": "review report",
+ "parameters": [
+ {
+ "description": "flag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.ReviewReportReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/report/unreviewed/post": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get unreviewed report post page",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Report"
+ ],
+ "summary": "get unreviewed report post page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetReportListPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/review/pending/post": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update review",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Review"
+ ],
+ "summary": "update review",
+ "parameters": [
+ {
+ "description": "review",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateReviewReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/review/pending/post/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get unreviewed post page",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Review"
+ ],
+ "summary": "get unreviewed post page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "object_id",
+ "name": "object_id",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetUnreviewedPostPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/reviewing/type": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get reviewing type",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Revision"
+ ],
+ "summary": "get reviewing type",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetReviewingTypeResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/revisions": {
+ "get": {
+ "description": "get revision list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Revision"
+ ],
+ "summary": "get revision list",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "object id",
+ "name": "object_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetRevisionResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/revisions/audit": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "revision audit operation:approve or reject",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Revision"
+ ],
+ "summary": "revision audit",
+ "parameters": [
+ {
+ "description": "audit",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RevisionAuditReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/revisions/edit/check": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "check can update revision",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Revision"
+ ],
+ "summary": "check can update revision",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "string",
+ "description": "id",
+ "name": "id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/revisions/unreviewed": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get unreviewed revision list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Revision"
+ ],
+ "summary": "get unreviewed revision list",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "page id",
+ "name": "page",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetUnreviewedRevisionResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/search": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "search object",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Search"
+ ],
+ "summary": "search object",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "query string",
+ "name": "q",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "newest",
+ "active",
+ "score",
+ "relevance"
+ ],
+ "type": "string",
+ "description": "order",
+ "name": "order",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SearchResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/search/desc": {
+ "get": {
+ "description": "get search description",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Search"
+ ],
+ "summary": "get search description",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SearchResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/siteinfo": {
+ "get": {
+ "description": "get site info",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "site"
+ ],
+ "summary": "get site info",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.SiteInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/siteinfo/legal": {
+ "get": {
+ "description": "get site legal info",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "site"
+ ],
+ "summary": "get site legal info",
+ "parameters": [
+ {
+ "enum": [
+ "tos",
+ "privacy"
+ ],
+ "type": "string",
+ "description": "legal information type",
+ "name": "info_type",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetSiteLegalInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tag": {
+ "get": {
+ "description": "get tag one",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "get tag one",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "tag id",
+ "name": "tag_id",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "tag name",
+ "name": "tag_name",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetTagResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update tag",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "update tag",
+ "parameters": [
+ {
+ "description": "tag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateTagReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add tag",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "add tag",
+ "parameters": [
+ {
+ "description": "tag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddTagReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "delete tag",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "delete tag",
+ "parameters": [
+ {
+ "description": "tag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RemoveTagReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tag/merge": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "merge tag",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "merge tag",
+ "parameters": [
+ {
+ "description": "tag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.AddTagReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tag/recover": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "recover delete tag",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "recover delete tag",
+ "parameters": [
+ {
+ "description": "tag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.RecoverTagReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tag/synonym": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update tag",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "update tag",
+ "parameters": [
+ {
+ "description": "tag",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateTagSynonymReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tag/synonyms": {
+ "get": {
+ "description": "get tag synonyms",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "get tag synonyms",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "tag id",
+ "name": "tag_id",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetTagSynonymsResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tags": {
+ "get": {
+ "description": "get tags list by slug name",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "get tags list",
+ "parameters": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "csv",
+ "description": "string collection",
+ "name": "tags",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetTagBasicResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tags/following": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get following tag list",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "get following tag list",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetFollowingTagsResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/tags/page": {
+ "get": {
+ "description": "get tag page",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Tag"
+ ],
+ "summary": "get tag page",
+ "parameters": [
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "slug_name",
+ "name": "slug_name",
+ "in": "query"
+ },
+ {
+ "enum": [
+ "popular",
+ "name",
+ "newest"
+ ],
+ "type": "string",
+ "description": "query condition",
+ "name": "query_cond",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/pager.PageModel"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "list": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetTagPageResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/action/record": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "ActionRecord",
+ "tags": [
+ "User"
+ ],
+ "summary": "ActionRecord",
+ "parameters": [
+ {
+ "enum": [
+ "login",
+ "e_mail",
+ "find_pass"
+ ],
+ "type": "string",
+ "description": "action",
+ "name": "action",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.ActionRecordResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/email": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "user change email verification",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "user change email verification",
+ "parameters": [
+ {
+ "description": "UserChangeEmailVerifyReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserChangeEmailVerifyReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/email/change/code": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "send email to the user email then change their email",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "send email to the user email then change their email",
+ "parameters": [
+ {
+ "description": "UserChangeEmailSendCodeReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserChangeEmailSendCodeReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/email/verification": {
+ "post": {
+ "description": "UserVerifyEmail",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserVerifyEmail",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "",
+ "description": "code",
+ "name": "code",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.UserLoginResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/email/verification/send": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "UserVerifyEmailSend",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserVerifyEmailSend",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "",
+ "description": "captcha_id",
+ "name": "captcha_id",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "default": "",
+ "description": "captcha_code",
+ "name": "captcha_code",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/info": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user info, if user no login response http code is 200, but user info is null",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "GetUserInfoByUserID",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetCurrentLoginUserInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "UserUpdateInfo update user info",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserUpdateInfo update user info",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "access-token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "description": "UpdateInfoRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateInfoRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/info/search": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "SearchUserListByName",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "SearchUserListByName",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetOtherUserInfoResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/interface": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "UserUpdateInterface update user interface config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserUpdateInterface update user interface config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "access-token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "description": "UpdateInfoRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateUserInterfaceRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/login/email": {
+ "post": {
+ "description": "UserEmailLogin",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserEmailLogin",
+ "parameters": [
+ {
+ "description": "UserEmailLogin",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserEmailLoginReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.UserLoginResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/logout": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "user logout",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "user logout",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/notification/config": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update user's notification config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "update user's notification config",
+ "parameters": [
+ {
+ "description": "UpdateUserNotificationConfigReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateUserNotificationConfigReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user's notification config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "get user's notification config",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetUserNotificationConfigResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/notification/unsubscribe": {
+ "put": {
+ "description": "unsubscribe notification",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "unsubscribe notification",
+ "parameters": [
+ {
+ "description": "UserUnsubscribeNotificationReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserUnsubscribeNotificationReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/password": {
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "UserModifyPassWord",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserModifyPassWord",
+ "parameters": [
+ {
+ "description": "UserModifyPasswordReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserModifyPasswordReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/password/replacement": {
+ "post": {
+ "description": "UseRePassWord",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UseRePassWord",
+ "parameters": [
+ {
+ "description": "UserRePassWordRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserRePassWordRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/password/reset": {
+ "post": {
+ "description": "RetrievePassWord",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "RetrievePassWord",
+ "parameters": [
+ {
+ "description": "UserRetrievePassWordRequest",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserRetrievePassWordRequest"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/plugin/config": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user plugin config",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "UserPlugin"
+ ],
+ "summary": "get user plugin config",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "plugin_slug_name",
+ "name": "plugin_slug_name",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetPluginConfigResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "update user plugin config",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "UserPlugin"
+ ],
+ "summary": "update user plugin config",
+ "parameters": [
+ {
+ "description": "UpdatePluginConfigReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UpdateUserPluginConfigReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/plugin/configs": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get plugin list that used for user.",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "UserPlugin"
+ ],
+ "summary": "get plugin list that used for user.",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.GetUserPluginListResp"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/ranking": {
+ "get": {
+ "description": "get user ranking",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "get user ranking",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.UserRankingResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/register/email": {
+ "post": {
+ "description": "UserRegisterByEmail",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "UserRegisterByEmail",
+ "parameters": [
+ {
+ "description": "UserRegisterReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserRegisterReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.UserLoginResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/user/staff": {
+ "get": {
+ "description": "get user staff",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "get user staff",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "page_size",
+ "name": "page_size",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.GetUserStaffResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/vote/down": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add vote",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Activity"
+ ],
+ "summary": "vote down",
+ "parameters": [
+ {
+ "description": "vote",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.VoteReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.VoteResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/answer/api/v1/vote/up": {
+ "post": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "add vote",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Activity"
+ ],
+ "summary": "vote up",
+ "parameters": [
+ {
+ "description": "vote",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.VoteReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/schema.VoteResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/custom.css": {
+ "get": {
+ "description": "get site custom CSS",
+ "produces": [
+ "text/css"
+ ],
+ "tags": [
+ "site"
+ ],
+ "summary": "get site custom CSS",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/installation/base-info": {
+ "post": {
+ "description": "init base info",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "installation"
+ ],
+ "summary": "init base info",
+ "parameters": [
+ {
+ "description": "InitBaseInfoReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/install.InitBaseInfoReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/installation/config-file/check": {
+ "post": {
+ "description": "check config file if exist when installation",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "installation"
+ ],
+ "summary": "check config file if exist when installation",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/install.CheckConfigFileResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/installation/db/check": {
+ "post": {
+ "description": "check database if exist when installation",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "installation"
+ ],
+ "summary": "check database if exist when installation",
+ "parameters": [
+ {
+ "description": "CheckDatabaseReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/install.CheckDatabaseReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/install.CheckConfigFileResp"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/installation/init": {
+ "post": {
+ "description": "init environment",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "installation"
+ ],
+ "summary": "init environment",
+ "parameters": [
+ {
+ "description": "CheckDatabaseReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/install.CheckDatabaseReq"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/installation/language/config": {
+ "get": {
+ "description": "get installation language config mapping",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Lang"
+ ],
+ "summary": "get installation language config mapping",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "installation language",
+ "name": "lang",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/installation/language/options": {
+ "get": {
+ "description": "get installation language options",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Lang"
+ ],
+ "summary": "get installation language options",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/handler.RespBody"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/translator.LangOption"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "/personal/question/page": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "list personal questions",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Personal"
+ ],
+ "summary": "list personal questions",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "string",
+ "description": "username",
+ "name": "username",
+ "in": "query",
+ "required": true
+ },
+ {
+ "enum": [
+ "newest",
+ "score"
+ ],
+ "type": "string",
+ "description": "order",
+ "name": "order",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "default": "0",
+ "description": "page",
+ "name": "page",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "string",
+ "default": "20",
+ "description": "page_size",
+ "name": "page_size",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/handler.RespBody"
+ }
+ }
+ }
+ }
+ },
+ "/robots.txt": {
+ "get": {
+ "description": "get site robots information",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "site"
+ ],
+ "summary": "get site robots information",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "constant.NotificationChannelKey": {
+ "type": "string",
+ "enum": [
+ "email"
+ ],
+ "x-enum-varnames": [
+ "EmailChannel"
+ ]
+ },
+ "constant.Privilege": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "integer",
+ "minimum": 1
+ }
+ }
+ },
+ "entity.BadgeLevel": {
+ "type": "integer",
+ "enum": [
+ 1,
+ 2,
+ 3
+ ],
+ "x-enum-varnames": [
+ "BadgeLevelBronze",
+ "BadgeLevelSilver",
+ "BadgeLevelGold"
+ ]
+ },
+ "handler.RespBody": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "http code",
+ "type": "integer"
+ },
+ "data": {
+ "description": "response data"
+ },
+ "msg": {
+ "description": "response message",
+ "type": "string"
+ },
+ "reason": {
+ "description": "reason key",
+ "type": "string"
+ }
+ }
+ },
+ "install.CheckConfigFileResp": {
+ "type": "object",
+ "properties": {
+ "config_file_exist": {
+ "type": "boolean"
+ },
+ "db_connection_success": {
+ "type": "boolean"
+ },
+ "db_table_exist": {
+ "type": "boolean"
+ }
+ }
+ },
+ "install.CheckDatabaseReq": {
+ "type": "object",
+ "required": [
+ "db_type"
+ ],
+ "properties": {
+ "db_file": {
+ "type": "string"
+ },
+ "db_host": {
+ "type": "string"
+ },
+ "db_name": {
+ "type": "string"
+ },
+ "db_password": {
+ "type": "string"
+ },
+ "db_type": {
+ "type": "string",
+ "enum": [
+ "postgres",
+ "sqlite3",
+ "mysql"
+ ]
+ },
+ "db_username": {
+ "type": "string"
+ },
+ "ssl_cert": {
+ "type": "string"
+ },
+ "ssl_enabled": {
+ "type": "boolean"
+ },
+ "ssl_key": {
+ "type": "string"
+ },
+ "ssl_mode": {
+ "type": "string"
+ },
+ "ssl_root_cert": {
+ "type": "string"
+ }
+ }
+ },
+ "install.InitBaseInfoReq": {
+ "type": "object",
+ "required": [
+ "contact_email",
+ "email",
+ "external_content_display",
+ "lang",
+ "name",
+ "password",
+ "site_name",
+ "site_url"
+ ],
+ "properties": {
+ "contact_email": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "email": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "external_content_display": {
+ "type": "string",
+ "enum": [
+ "always_display",
+ "ask_before_display"
+ ]
+ },
+ "lang": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "login_required": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ },
+ "password": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ },
+ "site_name": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "site_url": {
+ "type": "string",
+ "maxLength": 512
+ }
+ }
+ },
+ "pager.PageModel": {
+ "type": "object",
+ "properties": {
+ "count": {
+ "type": "integer"
+ },
+ "list": {}
+ }
+ },
+ "plugin.EmbedConfig": {
+ "type": "object",
+ "properties": {
+ "enable": {
+ "type": "boolean"
+ },
+ "platform": {
+ "type": "string"
+ }
+ }
+ },
+ "plugin.RenderConfig": {
+ "type": "object",
+ "properties": {
+ "select_theme": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AIConversationAdminDeleteReq": {
+ "type": "object",
+ "required": [
+ "conversation_id"
+ ],
+ "properties": {
+ "conversation_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AIConversationAdminDetailResp": {
+ "type": "object",
+ "properties": {
+ "conversation_id": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "records": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.AIConversationRecord"
+ }
+ },
+ "topic": {
+ "type": "string"
+ },
+ "user_info": {
+ "$ref": "#/definitions/schema.AIConversationUserInfo"
+ }
+ }
+ },
+ "schema.AIConversationAdminListItem": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "type": "integer"
+ },
+ "helpful_count": {
+ "type": "integer"
+ },
+ "id": {
+ "type": "string"
+ },
+ "topic": {
+ "type": "string"
+ },
+ "unhelpful_count": {
+ "type": "integer"
+ },
+ "user_info": {
+ "$ref": "#/definitions/schema.AIConversationUserInfo"
+ }
+ }
+ },
+ "schema.AIConversationDetailResp": {
+ "type": "object",
+ "properties": {
+ "conversation_id": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "records": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.AIConversationRecord"
+ }
+ },
+ "topic": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.AIConversationListItem": {
+ "type": "object",
+ "properties": {
+ "conversation_id": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "topic": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AIConversationRecord": {
+ "type": "object",
+ "properties": {
+ "chat_completion_id": {
+ "type": "string"
+ },
+ "content": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "helpful": {
+ "type": "integer"
+ },
+ "reasoning_content": {
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "unhelpful": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.AIConversationUserInfo": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "type": "string"
+ },
+ "display_name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "rank": {
+ "type": "integer"
+ },
+ "username": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AIConversationVoteReq": {
+ "type": "object",
+ "required": [
+ "chat_completion_id",
+ "vote_type"
+ ],
+ "properties": {
+ "cancel": {
+ "type": "boolean"
+ },
+ "chat_completion_id": {
+ "type": "string"
+ },
+ "vote_type": {
+ "type": "string",
+ "enum": [
+ "helpful",
+ "unhelpful"
+ ]
+ }
+ }
+ },
+ "schema.AIPromptConfig": {
+ "type": "object",
+ "properties": {
+ "en_us": {
+ "type": "string"
+ },
+ "zh_cn": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AcceptAnswerReq": {
+ "type": "object",
+ "required": [
+ "question_id"
+ ],
+ "properties": {
+ "answer_id": {
+ "type": "string"
+ },
+ "question_id": {
+ "type": "string",
+ "maxLength": 30
+ }
+ }
+ },
+ "schema.ActObjectInfo": {
+ "type": "object",
+ "properties": {
+ "answer_id": {
+ "type": "string"
+ },
+ "display_name": {
+ "type": "string"
+ },
+ "main_tag_slug_name": {
+ "type": "string"
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "question_id": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.ActObjectTimeline": {
+ "type": "object",
+ "properties": {
+ "activity_id": {
+ "type": "string"
+ },
+ "activity_type": {
+ "type": "string"
+ },
+ "cancelled": {
+ "type": "boolean"
+ },
+ "cancelled_at": {
+ "type": "integer"
+ },
+ "comment": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "object_id": {
+ "type": "string"
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "revision_id": {
+ "type": "string"
+ },
+ "user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ }
+ }
+ },
+ "schema.ActionRecordResp": {
+ "type": "object",
+ "properties": {
+ "captcha_id": {
+ "type": "string"
+ },
+ "captcha_img": {
+ "type": "string"
+ },
+ "verify": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.AddAPIKeyReq": {
+ "type": "object",
+ "required": [
+ "description",
+ "scope"
+ ],
+ "properties": {
+ "description": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "scope": {
+ "type": "string",
+ "enum": [
+ "read-only",
+ "global"
+ ]
+ }
+ }
+ },
+ "schema.AddAPIKeyResp": {
+ "type": "object",
+ "properties": {
+ "access_key": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AddCommentReq": {
+ "type": "object",
+ "required": [
+ "object_id",
+ "original_text"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "mention_username_list": {
+ "description": "@ user id list",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string"
+ },
+ "original_text": {
+ "description": "original comment content",
+ "type": "string",
+ "maxLength": 600,
+ "minLength": 2
+ },
+ "reply_comment_id": {
+ "description": "reply comment id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.AddReportReq": {
+ "type": "object",
+ "required": [
+ "object_id",
+ "report_type"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "captcha_id",
+ "type": "string"
+ },
+ "content": {
+ "description": "report content",
+ "type": "string",
+ "maxLength": 500
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string",
+ "maxLength": 20
+ },
+ "report_type": {
+ "description": "report type",
+ "type": "integer"
+ }
+ }
+ },
+ "schema.AddTagReq": {
+ "type": "object",
+ "required": [
+ "display_name",
+ "original_text",
+ "slug_name"
+ ],
+ "properties": {
+ "display_name": {
+ "description": "display_name",
+ "type": "string",
+ "maxLength": 35
+ },
+ "original_text": {
+ "description": "original text",
+ "type": "string",
+ "maxLength": 65536
+ },
+ "slug_name": {
+ "description": "slug_name",
+ "type": "string",
+ "maxLength": 35
+ }
+ }
+ },
+ "schema.AddUserReq": {
+ "type": "object",
+ "required": [
+ "display_name",
+ "email",
+ "password"
+ ],
+ "properties": {
+ "display_name": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ },
+ "email": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "password": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ }
+ }
+ },
+ "schema.AddUsersReq": {
+ "type": "object",
+ "properties": {
+ "users": {
+ "description": "users info line by line",
+ "type": "string"
+ }
+ }
+ },
+ "schema.AdminUpdateAnswerStatusReq": {
+ "type": "object",
+ "required": [
+ "answer_id",
+ "status"
+ ],
+ "properties": {
+ "answer_id": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "available",
+ "deleted"
+ ]
+ }
+ }
+ },
+ "schema.AdminUpdateQuestionStatusReq": {
+ "type": "object",
+ "required": [
+ "question_id",
+ "status"
+ ],
+ "properties": {
+ "question_id": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "available",
+ "closed",
+ "deleted"
+ ]
+ }
+ }
+ },
+ "schema.AnswerAddReq": {
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "content": {
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 6
+ },
+ "question_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AnswerInfo": {
+ "type": "object",
+ "properties": {
+ "accepted": {
+ "type": "integer"
+ },
+ "collected": {
+ "type": "boolean"
+ },
+ "content": {
+ "type": "string"
+ },
+ "create_time": {
+ "type": "integer"
+ },
+ "html": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "member_actions": {
+ "description": "MemberActions",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PermissionMemberAction"
+ }
+ },
+ "question_id": {
+ "type": "string"
+ },
+ "question_info": {
+ "$ref": "#/definitions/schema.QuestionInfoResp"
+ },
+ "status": {
+ "type": "integer"
+ },
+ "update_time": {
+ "type": "integer"
+ },
+ "update_user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "vote_count": {
+ "type": "integer"
+ },
+ "vote_status": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AnswerUpdateReq": {
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "content": {
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 6
+ },
+ "edit_summary": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.AvatarInfo": {
+ "type": "object",
+ "properties": {
+ "custom": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "gravatar": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "type": {
+ "type": "string",
+ "maxLength": 100
+ }
+ }
+ },
+ "schema.BadgeListInfo": {
+ "type": "object",
+ "properties": {
+ "award_count": {
+ "description": "badge award count",
+ "type": "integer"
+ },
+ "earned_count": {
+ "description": "badge earned count",
+ "type": "integer"
+ },
+ "icon": {
+ "description": "badge icon",
+ "type": "string"
+ },
+ "id": {
+ "description": "badge id",
+ "type": "string"
+ },
+ "level": {
+ "description": "badge level",
+ "allOf": [
+ {
+ "$ref": "#/definitions/entity.BadgeLevel"
+ }
+ ]
+ },
+ "name": {
+ "description": "badge name",
+ "type": "string"
+ }
+ }
+ },
+ "schema.BadgeStatus": {
+ "type": "string",
+ "enum": [
+ "active",
+ "inactive"
+ ],
+ "x-enum-varnames": [
+ "BadgeStatusActive",
+ "BadgeStatusInactive"
+ ]
+ },
+ "schema.CloseQuestionReq": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "close_msg": {
+ "description": "close_type",
+ "type": "string"
+ },
+ "close_type": {
+ "description": "close_type",
+ "type": "integer"
+ },
+ "id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.CollectionSwitchReq": {
+ "type": "object",
+ "required": [
+ "group_id",
+ "object_id"
+ ],
+ "properties": {
+ "bookmark": {
+ "type": "boolean"
+ },
+ "group_id": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.CollectionSwitchResp": {
+ "type": "object",
+ "properties": {
+ "object_collection_count": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.ConfigField": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.ConfigFieldOption"
+ }
+ },
+ "required": {
+ "type": "boolean"
+ },
+ "title": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "ui_options": {
+ "$ref": "#/definitions/schema.ConfigFieldUIOptions"
+ },
+ "value": {}
+ }
+ },
+ "schema.ConfigFieldOption": {
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.ConfigFieldUIOptions": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "$ref": "#/definitions/schema.UIOptionAction"
+ },
+ "class_name": {
+ "type": "string"
+ },
+ "field_class_name": {
+ "type": "string"
+ },
+ "input_type": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "placeholder": {
+ "type": "string"
+ },
+ "rows": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ },
+ "variant": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.ConnectorInfoResp": {
+ "type": "object",
+ "properties": {
+ "icon": {
+ "type": "string"
+ },
+ "link": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.ConnectorUserInfoResp": {
+ "type": "object",
+ "properties": {
+ "binding": {
+ "type": "boolean"
+ },
+ "external_id": {
+ "type": "string"
+ },
+ "icon": {
+ "type": "string"
+ },
+ "link": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.DeleteAPIKeyReq": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.DeletePermanentlyReq": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "users",
+ "questions",
+ "answers"
+ ]
+ }
+ }
+ },
+ "schema.EditUserProfileReq": {
+ "type": "object",
+ "required": [
+ "display_name",
+ "email",
+ "user_id"
+ ],
+ "properties": {
+ "display_name": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ },
+ "email": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "user_id": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ }
+ }
+ },
+ "schema.ExternalLoginBindingUserSendEmailReq": {
+ "type": "object",
+ "required": [
+ "binding_key",
+ "email"
+ ],
+ "properties": {
+ "binding_key": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "email": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "must": {
+ "description": "If must is true, whatever email if exists, try to bind user.\nIf must is false, when email exist, will only be prompted with a warning.",
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.ExternalLoginBindingUserSendEmailResp": {
+ "type": "object",
+ "properties": {
+ "access_token": {
+ "type": "string"
+ },
+ "email_exist_and_must_be_confirmed": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.ExternalLoginUnbindingReq": {
+ "type": "object",
+ "required": [
+ "external_id"
+ ],
+ "properties": {
+ "external_id": {
+ "type": "string",
+ "maxLength": 128
+ }
+ }
+ },
+ "schema.FollowReq": {
+ "type": "object",
+ "required": [
+ "object_id"
+ ],
+ "properties": {
+ "is_cancel": {
+ "description": "is cancel",
+ "type": "boolean"
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.FollowResp": {
+ "type": "object",
+ "properties": {
+ "follows": {
+ "description": "the followers of object",
+ "type": "integer"
+ },
+ "is_followed": {
+ "description": "if user is followed object will be true,otherwise false",
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.GetAIModelResp": {
+ "type": "object",
+ "properties": {
+ "created": {
+ "type": "integer"
+ },
+ "id": {
+ "type": "string"
+ },
+ "object": {
+ "type": "string"
+ },
+ "owned_by": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetAIProviderResp": {
+ "type": "object",
+ "properties": {
+ "default_api_host": {
+ "type": "string"
+ },
+ "display_name": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetAPIKeyResp": {
+ "type": "object",
+ "properties": {
+ "access_key": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "last_used_at": {
+ "type": "integer"
+ },
+ "scope": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetAnswerInfoResp": {
+ "type": "object",
+ "properties": {
+ "info": {
+ "$ref": "#/definitions/schema.AnswerInfo"
+ },
+ "question": {
+ "$ref": "#/definitions/schema.QuestionInfoResp"
+ }
+ }
+ },
+ "schema.GetBadgeInfoResp": {
+ "type": "object",
+ "properties": {
+ "award_count": {
+ "description": "badge award count",
+ "type": "integer"
+ },
+ "description": {
+ "description": "badge description",
+ "type": "string"
+ },
+ "earned_count": {
+ "description": "badge earned count",
+ "type": "integer"
+ },
+ "icon": {
+ "description": "badge icon",
+ "type": "string"
+ },
+ "id": {
+ "description": "badge id",
+ "type": "string"
+ },
+ "is_single": {
+ "description": "badge is single or multiple",
+ "type": "boolean"
+ },
+ "level": {
+ "description": "badge level",
+ "allOf": [
+ {
+ "$ref": "#/definitions/entity.BadgeLevel"
+ }
+ ]
+ },
+ "name": {
+ "description": "badge name",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetBadgeListPagedResp": {
+ "type": "object",
+ "properties": {
+ "award_count": {
+ "description": "badge award count",
+ "type": "integer"
+ },
+ "description": {
+ "description": "badge description",
+ "type": "string"
+ },
+ "earned": {
+ "description": "badge earned count",
+ "type": "boolean"
+ },
+ "group_name": {
+ "description": "badge group name",
+ "type": "string"
+ },
+ "icon": {
+ "description": "badge icon",
+ "type": "string"
+ },
+ "id": {
+ "description": "badge id",
+ "type": "string"
+ },
+ "level": {
+ "description": "badge level",
+ "allOf": [
+ {
+ "$ref": "#/definitions/entity.BadgeLevel"
+ }
+ ]
+ },
+ "name": {
+ "description": "badge name",
+ "type": "string"
+ },
+ "status": {
+ "description": "badge status",
+ "allOf": [
+ {
+ "$ref": "#/definitions/schema.BadgeStatus"
+ }
+ ]
+ }
+ }
+ },
+ "schema.GetBadgeListResp": {
+ "type": "object",
+ "properties": {
+ "badges": {
+ "description": "badge list info",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.BadgeListInfo"
+ }
+ },
+ "group_name": {
+ "description": "badge group name",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetCommentPersonalWithPageResp": {
+ "type": "object",
+ "properties": {
+ "answer_id": {
+ "description": "answer id",
+ "type": "string"
+ },
+ "comment_id": {
+ "description": "comment id",
+ "type": "string"
+ },
+ "content": {
+ "description": "content",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string"
+ },
+ "object_type": {
+ "description": "object type",
+ "type": "string",
+ "enum": [
+ "question",
+ "answer",
+ "tag",
+ "comment"
+ ]
+ },
+ "question_id": {
+ "description": "question id",
+ "type": "string"
+ },
+ "title": {
+ "description": "title",
+ "type": "string"
+ },
+ "url_title": {
+ "description": "url title",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetCommentResp": {
+ "type": "object",
+ "properties": {
+ "comment_id": {
+ "description": "comment id",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "is_vote": {
+ "description": "current user if already vote this comment",
+ "type": "boolean"
+ },
+ "member_actions": {
+ "description": "MemberActions",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PermissionMemberAction"
+ }
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string"
+ },
+ "original_text": {
+ "description": "original comment content",
+ "type": "string"
+ },
+ "parsed_text": {
+ "description": "parsed comment content",
+ "type": "string"
+ },
+ "reply_comment_id": {
+ "description": "reply comment id",
+ "type": "string"
+ },
+ "reply_user_display_name": {
+ "description": "reply user display name",
+ "type": "string"
+ },
+ "reply_user_id": {
+ "description": "reply user id",
+ "type": "string"
+ },
+ "reply_user_status": {
+ "description": "reply user status",
+ "type": "string"
+ },
+ "reply_username": {
+ "description": "reply user username",
+ "type": "string"
+ },
+ "user_avatar": {
+ "description": "user avatar",
+ "type": "string"
+ },
+ "user_display_name": {
+ "description": "user display name",
+ "type": "string"
+ },
+ "user_id": {
+ "description": "user id",
+ "type": "string"
+ },
+ "user_status": {
+ "description": "user status",
+ "type": "string"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ },
+ "vote_count": {
+ "description": "user vote amount",
+ "type": "integer"
+ }
+ }
+ },
+ "schema.GetCurrentLoginUserInfoResp": {
+ "type": "object",
+ "properties": {
+ "access_token": {
+ "description": "access token",
+ "type": "string"
+ },
+ "answer_count": {
+ "description": "answer count",
+ "type": "integer"
+ },
+ "authority_group": {
+ "description": "authority group",
+ "type": "integer"
+ },
+ "avatar": {
+ "$ref": "#/definitions/schema.AvatarInfo"
+ },
+ "bio": {
+ "description": "bio markdown",
+ "type": "string"
+ },
+ "bio_html": {
+ "description": "bio html",
+ "type": "string"
+ },
+ "color_scheme": {
+ "description": "Color scheme",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "e_mail": {
+ "description": "email",
+ "type": "string"
+ },
+ "follow_count": {
+ "description": "follow count",
+ "type": "integer"
+ },
+ "have_password": {
+ "description": "user have password",
+ "type": "boolean"
+ },
+ "id": {
+ "description": "user id",
+ "type": "string"
+ },
+ "language": {
+ "description": "language",
+ "type": "string"
+ },
+ "last_login_date": {
+ "description": "last login date",
+ "type": "integer"
+ },
+ "location": {
+ "description": "location",
+ "type": "string"
+ },
+ "mail_status": {
+ "description": "mail status(1 pass 2 to be verified)",
+ "type": "integer"
+ },
+ "mobile": {
+ "description": "mobile",
+ "type": "string"
+ },
+ "notice_status": {
+ "description": "notice status(1 on 2off)",
+ "type": "integer"
+ },
+ "question_count": {
+ "description": "question count",
+ "type": "integer"
+ },
+ "rank": {
+ "description": "rank",
+ "type": "integer"
+ },
+ "role_id": {
+ "description": "role id",
+ "type": "integer"
+ },
+ "status": {
+ "description": "user status",
+ "type": "string"
+ },
+ "suspended_until": {
+ "description": "suspended until timestamp",
+ "type": "integer"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ },
+ "visit_token": {
+ "description": "visit token",
+ "type": "string"
+ },
+ "website": {
+ "description": "website",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetFollowingTagsResp": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "main_tag_slug_name": {
+ "description": "if main tag slug name is not empty, this tag is synonymous with the main tag",
+ "type": "string"
+ },
+ "recommend": {
+ "type": "boolean"
+ },
+ "reserved": {
+ "type": "boolean"
+ },
+ "slug_name": {
+ "description": "slug name",
+ "type": "string"
+ },
+ "tag_id": {
+ "description": "tag id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetObjectTimelineResp": {
+ "type": "object",
+ "properties": {
+ "object_info": {
+ "$ref": "#/definitions/schema.ActObjectInfo"
+ },
+ "timeline": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.ActObjectTimeline"
+ }
+ }
+ }
+ },
+ "schema.GetOtherUserInfoByUsernameResp": {
+ "type": "object",
+ "properties": {
+ "answer_count": {
+ "description": "answer count",
+ "type": "integer"
+ },
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "bio": {
+ "description": "bio markdown",
+ "type": "string"
+ },
+ "bio_html": {
+ "description": "bio html",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "follow_count": {
+ "description": "email\nfollow count",
+ "type": "integer"
+ },
+ "id": {
+ "description": "user id",
+ "type": "string"
+ },
+ "last_login_date": {
+ "description": "last login date",
+ "type": "integer"
+ },
+ "location": {
+ "description": "location",
+ "type": "string"
+ },
+ "mobile": {
+ "description": "mobile",
+ "type": "string"
+ },
+ "question_count": {
+ "description": "question count",
+ "type": "integer"
+ },
+ "rank": {
+ "description": "rank",
+ "type": "integer"
+ },
+ "status": {
+ "type": "string"
+ },
+ "status_msg": {
+ "type": "string"
+ },
+ "suspended_until": {
+ "description": "suspended until timestamp",
+ "type": "integer"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ },
+ "website": {
+ "description": "website",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetOtherUserInfoResp": {
+ "type": "object",
+ "properties": {
+ "info": {
+ "$ref": "#/definitions/schema.GetOtherUserInfoByUsernameResp"
+ }
+ }
+ },
+ "schema.GetPluginConfigResp": {
+ "type": "object",
+ "properties": {
+ "config_fields": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.ConfigField"
+ }
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "slug_name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetPluginListResp": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "have_config": {
+ "type": "boolean"
+ },
+ "link": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "slug_name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetPrivilegesConfigResp": {
+ "type": "object",
+ "properties": {
+ "options": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PrivilegeOption"
+ }
+ },
+ "selected_level": {
+ "$ref": "#/definitions/schema.PrivilegeLevel"
+ }
+ }
+ },
+ "schema.GetRankPersonalPageResp": {
+ "type": "object",
+ "properties": {
+ "answer_id": {
+ "description": "answer id",
+ "type": "string"
+ },
+ "content": {
+ "description": "content",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string"
+ },
+ "object_type": {
+ "description": "object type",
+ "type": "string",
+ "enum": [
+ "question",
+ "answer",
+ "tag",
+ "comment"
+ ]
+ },
+ "question_id": {
+ "description": "question id",
+ "type": "string"
+ },
+ "rank_type": {
+ "description": "rank type",
+ "type": "string"
+ },
+ "reputation": {
+ "description": "reputation",
+ "type": "integer"
+ },
+ "title": {
+ "description": "title",
+ "type": "string"
+ },
+ "url_title": {
+ "description": "url title",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetReportListPageResp": {
+ "type": "object",
+ "properties": {
+ "answer_accepted": {
+ "type": "boolean"
+ },
+ "answer_count": {
+ "type": "integer"
+ },
+ "answer_id": {
+ "type": "string"
+ },
+ "author_user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "comment_id": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "flag_id": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "string"
+ },
+ "object_show_status": {
+ "type": "integer"
+ },
+ "object_status": {
+ "type": "integer"
+ },
+ "object_type": {
+ "type": "string",
+ "enum": [
+ "question",
+ "answer",
+ "comment"
+ ]
+ },
+ "original_text": {
+ "type": "string"
+ },
+ "parsed_text": {
+ "type": "string"
+ },
+ "question_id": {
+ "type": "string"
+ },
+ "reason": {
+ "$ref": "#/definitions/schema.ReasonItem"
+ },
+ "reason_content": {
+ "type": "string"
+ },
+ "submit_at": {
+ "type": "integer"
+ },
+ "submitter_user": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagResp"
+ }
+ },
+ "title": {
+ "type": "string"
+ },
+ "url_title": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetReviewingTypeResp": {
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "todo_amount": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.GetRevisionResp": {
+ "type": "object",
+ "properties": {
+ "content": {},
+ "create_at": {
+ "type": "integer"
+ },
+ "id": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
+ },
+ "status": {
+ "type": "integer"
+ },
+ "title": {
+ "type": "string"
+ },
+ "url_title": {
+ "type": "string"
+ },
+ "use_id": {
+ "type": "string"
+ },
+ "user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ }
+ }
+ },
+ "schema.GetRoleResp": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetSMTPConfigResp": {
+ "type": "object",
+ "properties": {
+ "encryption": {
+ "description": "\"\" SSL TLS",
+ "type": "string"
+ },
+ "from_email": {
+ "type": "string"
+ },
+ "from_name": {
+ "type": "string"
+ },
+ "smtp_authentication": {
+ "type": "boolean"
+ },
+ "smtp_host": {
+ "type": "string"
+ },
+ "smtp_password": {
+ "type": "string"
+ },
+ "smtp_port": {
+ "type": "integer"
+ },
+ "smtp_username": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetSiteLegalInfoResp": {
+ "type": "object",
+ "properties": {
+ "privacy_policy_original_text": {
+ "type": "string"
+ },
+ "privacy_policy_parsed_text": {
+ "type": "string"
+ },
+ "terms_of_service_original_text": {
+ "type": "string"
+ },
+ "terms_of_service_parsed_text": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetTagBasicResp": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "type": "string"
+ },
+ "recommend": {
+ "type": "boolean"
+ },
+ "reserved": {
+ "type": "boolean"
+ },
+ "slug_name": {
+ "type": "string"
+ },
+ "tag_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetTagPageResp": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "created time",
+ "type": "integer"
+ },
+ "description": {
+ "description": "description",
+ "type": "string"
+ },
+ "display_name": {
+ "description": "display_name",
+ "type": "string"
+ },
+ "excerpt": {
+ "description": "excerpt",
+ "type": "string"
+ },
+ "follow_count": {
+ "description": "follower amount",
+ "type": "integer"
+ },
+ "is_follower": {
+ "description": "is follower",
+ "type": "boolean"
+ },
+ "original_text": {
+ "description": "original text",
+ "type": "string"
+ },
+ "parsed_text": {
+ "description": "parsed_text",
+ "type": "string"
+ },
+ "question_count": {
+ "description": "question amount",
+ "type": "integer"
+ },
+ "recommend": {
+ "type": "boolean"
+ },
+ "reserved": {
+ "type": "boolean"
+ },
+ "slug_name": {
+ "description": "slug_name",
+ "type": "string"
+ },
+ "tag_id": {
+ "description": "tag_id",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "updated time",
+ "type": "integer"
+ }
+ }
+ },
+ "schema.GetTagResp": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "type": "integer"
+ },
+ "description": {
+ "type": "string"
+ },
+ "display_name": {
+ "type": "string"
+ },
+ "excerpt": {
+ "type": "string"
+ },
+ "follow_count": {
+ "type": "integer"
+ },
+ "is_follower": {
+ "type": "boolean"
+ },
+ "main_tag_slug_name": {
+ "description": "if main tag slug name is not empty, this tag is synonymous with the main tag",
+ "type": "string"
+ },
+ "member_actions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PermissionMemberAction"
+ }
+ },
+ "original_text": {
+ "type": "string"
+ },
+ "parsed_text": {
+ "type": "string"
+ },
+ "question_count": {
+ "type": "integer"
+ },
+ "recommend": {
+ "type": "boolean"
+ },
+ "reserved": {
+ "type": "boolean"
+ },
+ "slug_name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "tag_id": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.GetTagSynonymsResp": {
+ "type": "object",
+ "properties": {
+ "member_actions": {
+ "description": "MemberActions",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PermissionMemberAction"
+ }
+ },
+ "synonyms": {
+ "description": "synonyms",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagSynonym"
+ }
+ }
+ }
+ },
+ "schema.GetUnreviewedPostPageResp": {
+ "type": "object",
+ "properties": {
+ "answer_id": {
+ "type": "string"
+ },
+ "author_user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "comment_id": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "object_id": {
+ "type": "string"
+ },
+ "object_show_status": {
+ "type": "integer"
+ },
+ "object_status": {
+ "type": "integer"
+ },
+ "object_type": {
+ "type": "string",
+ "enum": [
+ "question",
+ "answer",
+ "comment"
+ ]
+ },
+ "original_text": {
+ "type": "string"
+ },
+ "parsed_text": {
+ "type": "string"
+ },
+ "question_id": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
+ },
+ "review_id": {
+ "type": "integer"
+ },
+ "submit_at": {
+ "type": "integer"
+ },
+ "submitter_display_name": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagResp"
+ }
+ },
+ "title": {
+ "type": "string"
+ },
+ "url_title": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetUnreviewedRevisionResp": {
+ "type": "object",
+ "properties": {
+ "info": {
+ "$ref": "#/definitions/schema.UnreviewedRevisionInfoInfo"
+ },
+ "type": {
+ "type": "string"
+ },
+ "unreviewed_info": {
+ "$ref": "#/definitions/schema.GetRevisionResp"
+ }
+ }
+ },
+ "schema.GetUserActivationResp": {
+ "type": "object",
+ "properties": {
+ "activation_url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetUserBadgeAwardListResp": {
+ "type": "object",
+ "properties": {
+ "earned_count": {
+ "description": "badge award count",
+ "type": "integer"
+ },
+ "icon": {
+ "description": "badge icon",
+ "type": "string"
+ },
+ "id": {
+ "description": "badge id",
+ "type": "string"
+ },
+ "level": {
+ "description": "badge level",
+ "allOf": [
+ {
+ "$ref": "#/definitions/entity.BadgeLevel"
+ }
+ ]
+ },
+ "name": {
+ "description": "badge name",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetUserNotificationConfigResp": {
+ "type": "object",
+ "properties": {
+ "all_new_question": {
+ "$ref": "#/definitions/schema.NotificationChannelConfig"
+ },
+ "all_new_question_for_following_tags": {
+ "$ref": "#/definitions/schema.NotificationChannelConfig"
+ },
+ "inbox": {
+ "$ref": "#/definitions/schema.NotificationChannelConfig"
+ }
+ }
+ },
+ "schema.GetUserPageResp": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "deleted_at": {
+ "description": "delete time",
+ "type": "integer"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "e_mail": {
+ "description": "email",
+ "type": "string"
+ },
+ "rank": {
+ "description": "rank",
+ "type": "integer"
+ },
+ "role_id": {
+ "description": "role id",
+ "type": "integer"
+ },
+ "role_name": {
+ "description": "role name",
+ "type": "string"
+ },
+ "status": {
+ "description": "user status(normal,suspended,deleted,inactive)",
+ "type": "string"
+ },
+ "suspended_at": {
+ "description": "suspended time",
+ "type": "integer"
+ },
+ "suspended_until": {
+ "description": "suspended until time",
+ "type": "integer"
+ },
+ "user_id": {
+ "description": "user id",
+ "type": "string"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetUserPluginListResp": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "slug_name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetUserStaffResp": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ }
+ }
+ },
+ "schema.GetVoteWithPageResp": {
+ "type": "object",
+ "properties": {
+ "answer_id": {
+ "description": "answer id",
+ "type": "string"
+ },
+ "content": {
+ "description": "content",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "object_id": {
+ "description": "object id",
+ "type": "string"
+ },
+ "object_type": {
+ "description": "object type",
+ "type": "string",
+ "enum": [
+ "question",
+ "answer",
+ "tag",
+ "comment"
+ ]
+ },
+ "question_id": {
+ "description": "question id",
+ "type": "string"
+ },
+ "title": {
+ "description": "title",
+ "type": "string"
+ },
+ "url_title": {
+ "description": "url title",
+ "type": "string"
+ },
+ "vote_type": {
+ "description": "vote type",
+ "type": "string"
+ }
+ }
+ },
+ "schema.LoadingAction": {
+ "type": "object",
+ "properties": {
+ "state": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.NotificationChannelConfig": {
+ "type": "object",
+ "properties": {
+ "enable": {
+ "type": "boolean"
+ },
+ "key": {
+ "$ref": "#/definitions/constant.NotificationChannelKey"
+ }
+ }
+ },
+ "schema.NotificationClearIDRequest": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.NotificationClearRequest": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "inbox",
+ "achievement"
+ ]
+ }
+ }
+ },
+ "schema.OnCompleteAction": {
+ "type": "object",
+ "properties": {
+ "refresh_form_config": {
+ "type": "boolean"
+ },
+ "toast_return_message": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.Operation": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "level": {
+ "$ref": "#/definitions/schema.OperationLevel"
+ },
+ "msg": {
+ "type": "string"
+ },
+ "time": {
+ "type": "integer"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.OperationLevel": {
+ "type": "string",
+ "enum": [
+ "info",
+ "danger",
+ "warning",
+ "secondary"
+ ],
+ "x-enum-varnames": [
+ "OperationLevelInfo",
+ "OperationLevelDanger",
+ "OperationLevelWarning",
+ "OperationLevelSecondary"
+ ]
+ },
+ "schema.OperationQuestionReq": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "operation": {
+ "description": "operation [pin unpin hide show]",
+ "type": "string"
+ }
+ }
+ },
+ "schema.PermissionMemberAction": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.PostRenderReq": {
+ "type": "object",
+ "properties": {
+ "content": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.PrivilegeLevel": {
+ "type": "integer",
+ "enum": [
+ 1,
+ 2,
+ 3,
+ 99
+ ],
+ "x-enum-varnames": [
+ "PrivilegeLevel1",
+ "PrivilegeLevel2",
+ "PrivilegeLevel3",
+ "PrivilegeLevelCustom"
+ ]
+ },
+ "schema.PrivilegeOption": {
+ "type": "object",
+ "properties": {
+ "level": {
+ "$ref": "#/definitions/schema.PrivilegeLevel"
+ },
+ "level_desc": {
+ "type": "string"
+ },
+ "privileges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/constant.Privilege"
+ }
+ }
+ }
+ },
+ "schema.QuestionAdd": {
+ "type": "object",
+ "required": [
+ "title"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "captcha_id",
+ "type": "string"
+ },
+ "content": {
+ "description": "content",
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 0
+ },
+ "tags": {
+ "description": "tags",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagItem"
+ }
+ },
+ "title": {
+ "description": "question title",
+ "type": "string",
+ "maxLength": 150,
+ "minLength": 6
+ }
+ }
+ },
+ "schema.QuestionAddByAnswer": {
+ "type": "object",
+ "required": [
+ "answer_content",
+ "title"
+ ],
+ "properties": {
+ "answer_content": {
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 6
+ },
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "captcha_id",
+ "type": "string"
+ },
+ "content": {
+ "description": "content",
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 0
+ },
+ "mention_username_list": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "tags": {
+ "description": "tags",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagItem"
+ }
+ },
+ "title": {
+ "description": "question title",
+ "type": "string",
+ "maxLength": 150,
+ "minLength": 6
+ }
+ }
+ },
+ "schema.QuestionInfoResp": {
+ "type": "object",
+ "properties": {
+ "accepted_answer_id": {
+ "type": "string"
+ },
+ "answer_count": {
+ "type": "integer"
+ },
+ "answered": {
+ "type": "boolean"
+ },
+ "collected": {
+ "type": "boolean"
+ },
+ "collection_count": {
+ "type": "integer"
+ },
+ "content": {
+ "type": "string"
+ },
+ "create_time": {
+ "type": "integer"
+ },
+ "description": {
+ "type": "string"
+ },
+ "edit_time": {
+ "type": "integer"
+ },
+ "extends_actions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PermissionMemberAction"
+ }
+ },
+ "first_answer_id": {
+ "type": "string"
+ },
+ "follow_count": {
+ "type": "integer"
+ },
+ "html": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "is_followed": {
+ "type": "boolean"
+ },
+ "last_answer_id": {
+ "type": "string"
+ },
+ "last_answered_user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "member_actions": {
+ "description": "MemberActions",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.PermissionMemberAction"
+ }
+ },
+ "operation": {
+ "$ref": "#/definitions/schema.Operation"
+ },
+ "pin": {
+ "type": "integer"
+ },
+ "show": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "integer"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagResp"
+ }
+ },
+ "title": {
+ "type": "string"
+ },
+ "unique_view_count": {
+ "type": "integer"
+ },
+ "update_time": {
+ "type": "integer"
+ },
+ "update_user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "url_title": {
+ "type": "string"
+ },
+ "user_info": {
+ "$ref": "#/definitions/schema.UserBasicInfo"
+ },
+ "view_count": {
+ "type": "integer"
+ },
+ "vote_count": {
+ "type": "integer"
+ },
+ "vote_status": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.QuestionPageReq": {
+ "type": "object",
+ "properties": {
+ "in_days": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "order": {
+ "type": "string",
+ "enum": [
+ "newest",
+ "active",
+ "hot",
+ "score",
+ "unanswered",
+ "recommend",
+ "frequent"
+ ]
+ },
+ "page": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "page_size": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "tag": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "username": {
+ "type": "string",
+ "maxLength": 100
+ }
+ }
+ },
+ "schema.QuestionPageResp": {
+ "type": "object",
+ "properties": {
+ "accepted_answer_id": {
+ "description": "answer information",
+ "type": "string"
+ },
+ "answer_count": {
+ "type": "integer"
+ },
+ "collection_count": {
+ "type": "integer"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "description": {
+ "type": "string"
+ },
+ "follow_count": {
+ "type": "integer"
+ },
+ "id": {
+ "type": "string"
+ },
+ "last_answer_id": {
+ "type": "string"
+ },
+ "operated_at": {
+ "description": "operator information",
+ "type": "integer"
+ },
+ "operation_type": {
+ "type": "string"
+ },
+ "operator": {
+ "$ref": "#/definitions/schema.QuestionPageRespOperator"
+ },
+ "pin": {
+ "description": "1: unpin, 2: pin",
+ "type": "integer"
+ },
+ "show": {
+ "description": "0: show, 1: hide",
+ "type": "integer"
+ },
+ "status": {
+ "type": "integer"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagResp"
+ }
+ },
+ "title": {
+ "type": "string"
+ },
+ "unique_view_count": {
+ "type": "integer"
+ },
+ "url_title": {
+ "type": "string"
+ },
+ "view_count": {
+ "description": "question statistical information",
+ "type": "integer"
+ },
+ "vote_count": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.QuestionPageRespOperator": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "type": "string"
+ },
+ "display_name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "rank": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.QuestionRecoverReq": {
+ "type": "object",
+ "required": [
+ "question_id"
+ ],
+ "properties": {
+ "question_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.QuestionUpdate": {
+ "type": "object",
+ "required": [
+ "id",
+ "title"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "captcha_id",
+ "type": "string"
+ },
+ "content": {
+ "description": "content",
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 0
+ },
+ "edit_summary": {
+ "description": "edit summary",
+ "type": "string"
+ },
+ "id": {
+ "description": "question id",
+ "type": "string"
+ },
+ "invite_user": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "tags": {
+ "description": "tags",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagItem"
+ }
+ },
+ "title": {
+ "description": "question title",
+ "type": "string",
+ "maxLength": 150,
+ "minLength": 6
+ }
+ }
+ },
+ "schema.QuestionUpdateInviteUser": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "captcha_id",
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "invite_user": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "schema.ReactionRespItem": {
+ "type": "object",
+ "properties": {
+ "count": {
+ "description": "Count is the number of users who reacted",
+ "type": "integer"
+ },
+ "emoji": {
+ "description": "Emoji is the reaction emoji",
+ "type": "string"
+ },
+ "is_active": {
+ "description": "IsActive is if current user has reacted",
+ "type": "boolean"
+ },
+ "tooltip": {
+ "description": "Tooltip is the user's name who reacted",
+ "type": "string"
+ }
+ }
+ },
+ "schema.ReasonItem": {
+ "type": "object",
+ "properties": {
+ "content_type": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "placeholder": {
+ "type": "string"
+ },
+ "reason_key": {
+ "type": "string"
+ },
+ "reason_type": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.RecoverAnswerReq": {
+ "type": "object",
+ "required": [
+ "answer_id"
+ ],
+ "properties": {
+ "answer_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.RecoverTagReq": {
+ "type": "object",
+ "required": [
+ "tag_id"
+ ],
+ "properties": {
+ "tag_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.RemoveAnswerReq": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.RemoveCommentReq": {
+ "type": "object",
+ "required": [
+ "comment_id"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "comment_id": {
+ "description": "comment id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.RemoveQuestionReq": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "captcha_id",
+ "type": "string"
+ },
+ "id": {
+ "description": "question id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.RemoveTagReq": {
+ "type": "object",
+ "required": [
+ "tag_id"
+ ],
+ "properties": {
+ "tag_id": {
+ "description": "tag_id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.ReopenQuestionReq": {
+ "type": "object",
+ "properties": {
+ "question_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.ReviewReportReq": {
+ "type": "object",
+ "required": [
+ "flag_id",
+ "operation_type"
+ ],
+ "properties": {
+ "close_msg": {
+ "type": "string"
+ },
+ "close_type": {
+ "type": "integer"
+ },
+ "content": {
+ "type": "string",
+ "maxLength": 65535,
+ "minLength": 6
+ },
+ "flag_id": {
+ "type": "string"
+ },
+ "operation_type": {
+ "type": "string",
+ "enum": [
+ "edit_post",
+ "close_post",
+ "delete_post",
+ "unlist_post",
+ "ignore_report"
+ ]
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagItem"
+ }
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 150,
+ "minLength": 6
+ }
+ }
+ },
+ "schema.RevisionAuditReq": {
+ "type": "object",
+ "required": [
+ "id",
+ "operation"
+ ],
+ "properties": {
+ "id": {
+ "description": "object id",
+ "type": "string"
+ },
+ "operation": {
+ "description": "approve or reject",
+ "type": "string"
+ }
+ }
+ },
+ "schema.SearchObject": {
+ "type": "object",
+ "properties": {
+ "accepted": {
+ "type": "boolean"
+ },
+ "answer_count": {
+ "type": "integer"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "excerpt": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "question_id": {
+ "type": "string"
+ },
+ "status": {
+ "description": "Status",
+ "type": "string"
+ },
+ "tags": {
+ "description": "tags",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagResp"
+ }
+ },
+ "title": {
+ "type": "string"
+ },
+ "url_title": {
+ "type": "string"
+ },
+ "user_info": {
+ "description": "user info",
+ "allOf": [
+ {
+ "$ref": "#/definitions/schema.SearchObjectUser"
+ }
+ ]
+ },
+ "vote_count": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.SearchObjectUser": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "rank": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SearchResp": {
+ "type": "object",
+ "properties": {
+ "count": {
+ "type": "integer"
+ },
+ "list": {
+ "description": "search response",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SearchResult"
+ }
+ }
+ }
+ },
+ "schema.SearchResult": {
+ "type": "object",
+ "properties": {
+ "object": {
+ "description": "this object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/schema.SearchObject"
+ }
+ ]
+ },
+ "object_type": {
+ "description": "object_type",
+ "type": "string"
+ }
+ }
+ },
+ "schema.SendUserActivationReq": {
+ "type": "object",
+ "required": [
+ "user_id"
+ ],
+ "properties": {
+ "user_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteAIProvider": {
+ "type": "object",
+ "properties": {
+ "api_host": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "api_key": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "model": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "provider": {
+ "type": "string",
+ "maxLength": 50
+ }
+ }
+ },
+ "schema.SiteAIReq": {
+ "type": "object",
+ "properties": {
+ "ai_providers": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SiteAIProvider"
+ }
+ },
+ "chosen_provider": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "prompt_config": {
+ "$ref": "#/definitions/schema.AIPromptConfig"
+ }
+ }
+ },
+ "schema.SiteAIResp": {
+ "type": "object",
+ "properties": {
+ "ai_providers": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SiteAIProvider"
+ }
+ },
+ "chosen_provider": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "prompt_config": {
+ "$ref": "#/definitions/schema.AIPromptConfig"
+ }
+ }
+ },
+ "schema.SiteAdvancedReq": {
+ "type": "object",
+ "properties": {
+ "authorized_attachment_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "authorized_image_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "max_attachment_size": {
+ "type": "integer"
+ },
+ "max_image_megapixel": {
+ "type": "integer"
+ },
+ "max_image_size": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.SiteAdvancedResp": {
+ "type": "object",
+ "properties": {
+ "authorized_attachment_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "authorized_image_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "max_attachment_size": {
+ "type": "integer"
+ },
+ "max_image_megapixel": {
+ "type": "integer"
+ },
+ "max_image_size": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.SiteBrandingReq": {
+ "type": "object",
+ "properties": {
+ "favicon": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "logo": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "mobile_logo": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "square_icon": {
+ "type": "string",
+ "maxLength": 512
+ }
+ }
+ },
+ "schema.SiteBrandingResp": {
+ "type": "object",
+ "properties": {
+ "favicon": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "logo": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "mobile_logo": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "square_icon": {
+ "type": "string",
+ "maxLength": 512
+ }
+ }
+ },
+ "schema.SiteCustomCssHTMLReq": {
+ "type": "object",
+ "properties": {
+ "custom_css": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_footer": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_head": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_header": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_sidebar": {
+ "type": "string",
+ "maxLength": 65536
+ }
+ }
+ },
+ "schema.SiteCustomCssHTMLResp": {
+ "type": "object",
+ "properties": {
+ "custom_css": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_footer": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_head": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_header": {
+ "type": "string",
+ "maxLength": 65536
+ },
+ "custom_sidebar": {
+ "type": "string",
+ "maxLength": 65536
+ }
+ }
+ },
+ "schema.SiteGeneralReq": {
+ "type": "object",
+ "required": [
+ "contact_email",
+ "name",
+ "site_url"
+ ],
+ "properties": {
+ "contact_email": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "short_description": {
+ "type": "string",
+ "maxLength": 255
+ },
+ "site_url": {
+ "type": "string",
+ "maxLength": 512
+ }
+ }
+ },
+ "schema.SiteGeneralResp": {
+ "type": "object",
+ "required": [
+ "contact_email",
+ "name",
+ "site_url"
+ ],
+ "properties": {
+ "contact_email": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "short_description": {
+ "type": "string",
+ "maxLength": 255
+ },
+ "site_url": {
+ "type": "string",
+ "maxLength": 512
+ }
+ }
+ },
+ "schema.SiteInfoResp": {
+ "type": "object",
+ "properties": {
+ "ai_enabled": {
+ "type": "boolean"
+ },
+ "branding": {
+ "$ref": "#/definitions/schema.SiteBrandingResp"
+ },
+ "custom_css_html": {
+ "$ref": "#/definitions/schema.SiteCustomCssHTMLResp"
+ },
+ "general": {
+ "$ref": "#/definitions/schema.SiteGeneralResp"
+ },
+ "interface": {
+ "$ref": "#/definitions/schema.SiteInterfaceSettingsResp"
+ },
+ "login": {
+ "$ref": "#/definitions/schema.SiteLoginResp"
+ },
+ "mcp_enabled": {
+ "type": "boolean"
+ },
+ "revision": {
+ "type": "string"
+ },
+ "site_advanced": {
+ "$ref": "#/definitions/schema.SiteAdvancedResp"
+ },
+ "site_legal": {
+ "$ref": "#/definitions/schema.SiteLegalSimpleResp"
+ },
+ "site_questions": {
+ "$ref": "#/definitions/schema.SiteQuestionsResp"
+ },
+ "site_security": {
+ "$ref": "#/definitions/schema.SiteSecurityResp"
+ },
+ "site_seo": {
+ "$ref": "#/definitions/schema.SiteSeoResp"
+ },
+ "site_tags": {
+ "$ref": "#/definitions/schema.SiteTagsResp"
+ },
+ "site_users": {
+ "$ref": "#/definitions/schema.SiteUsersResp"
+ },
+ "theme": {
+ "$ref": "#/definitions/schema.SiteThemeResp"
+ },
+ "users_settings": {
+ "$ref": "#/definitions/schema.SiteUsersSettingsResp"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteInterfaceReq": {
+ "type": "object",
+ "required": [
+ "language",
+ "time_zone"
+ ],
+ "properties": {
+ "language": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "time_zone": {
+ "type": "string",
+ "maxLength": 128
+ }
+ }
+ },
+ "schema.SiteInterfaceSettingsResp": {
+ "type": "object",
+ "required": [
+ "language",
+ "time_zone"
+ ],
+ "properties": {
+ "language": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "time_zone": {
+ "type": "string",
+ "maxLength": 128
+ }
+ }
+ },
+ "schema.SiteLegalSimpleResp": {
+ "type": "object",
+ "required": [
+ "external_content_display"
+ ],
+ "properties": {
+ "external_content_display": {
+ "type": "string",
+ "enum": [
+ "always_display",
+ "ask_before_display"
+ ]
+ }
+ }
+ },
+ "schema.SiteLoginReq": {
+ "type": "object",
+ "required": [
+ "require_email_verification"
+ ],
+ "properties": {
+ "allow_email_domains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "allow_email_registrations": {
+ "type": "boolean"
+ },
+ "allow_new_registrations": {
+ "type": "boolean"
+ },
+ "allow_password_login": {
+ "type": "boolean"
+ },
+ "require_email_verification": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteLoginResp": {
+ "type": "object",
+ "properties": {
+ "allow_email_domains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "allow_email_registrations": {
+ "type": "boolean"
+ },
+ "allow_new_registrations": {
+ "type": "boolean"
+ },
+ "allow_password_login": {
+ "type": "boolean"
+ },
+ "require_email_verification": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteMCPReq": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteMCPResp": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "http_header": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SitePoliciesReq": {
+ "type": "object",
+ "properties": {
+ "privacy_policy_original_text": {
+ "type": "string"
+ },
+ "privacy_policy_parsed_text": {
+ "type": "string"
+ },
+ "terms_of_service_original_text": {
+ "type": "string"
+ },
+ "terms_of_service_parsed_text": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SitePoliciesResp": {
+ "type": "object",
+ "properties": {
+ "privacy_policy_original_text": {
+ "type": "string"
+ },
+ "privacy_policy_parsed_text": {
+ "type": "string"
+ },
+ "terms_of_service_original_text": {
+ "type": "string"
+ },
+ "terms_of_service_parsed_text": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteQuestionsReq": {
+ "type": "object",
+ "properties": {
+ "min_content": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ },
+ "min_tags": {
+ "type": "integer",
+ "maximum": 5,
+ "minimum": 0
+ },
+ "restrict_answer": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteQuestionsResp": {
+ "type": "object",
+ "properties": {
+ "min_content": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ },
+ "min_tags": {
+ "type": "integer",
+ "maximum": 5,
+ "minimum": 0
+ },
+ "restrict_answer": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteSecurityReq": {
+ "type": "object",
+ "required": [
+ "external_content_display"
+ ],
+ "properties": {
+ "check_update": {
+ "type": "boolean"
+ },
+ "external_content_display": {
+ "type": "string",
+ "enum": [
+ "always_display",
+ "ask_before_display"
+ ]
+ },
+ "login_required": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteSecurityResp": {
+ "type": "object",
+ "required": [
+ "external_content_display"
+ ],
+ "properties": {
+ "check_update": {
+ "type": "boolean"
+ },
+ "external_content_display": {
+ "type": "string",
+ "enum": [
+ "always_display",
+ "ask_before_display"
+ ]
+ },
+ "login_required": {
+ "type": "boolean"
+ }
+ }
+ },
+ "schema.SiteSeoReq": {
+ "type": "object",
+ "required": [
+ "permalink",
+ "robots"
+ ],
+ "properties": {
+ "permalink": {
+ "type": "integer",
+ "maximum": 4,
+ "minimum": 0
+ },
+ "robots": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteSeoResp": {
+ "type": "object",
+ "required": [
+ "permalink",
+ "robots"
+ ],
+ "properties": {
+ "permalink": {
+ "type": "integer",
+ "maximum": 4,
+ "minimum": 0
+ },
+ "robots": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteTagsReq": {
+ "type": "object",
+ "properties": {
+ "recommend_tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SiteWriteTag"
+ }
+ },
+ "required_tag": {
+ "type": "boolean"
+ },
+ "reserved_tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SiteWriteTag"
+ }
+ }
+ }
+ },
+ "schema.SiteTagsResp": {
+ "type": "object",
+ "properties": {
+ "recommend_tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SiteWriteTag"
+ }
+ },
+ "required_tag": {
+ "type": "boolean"
+ },
+ "reserved_tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.SiteWriteTag"
+ }
+ }
+ }
+ },
+ "schema.SiteThemeReq": {
+ "type": "object",
+ "required": [
+ "theme"
+ ],
+ "properties": {
+ "color_scheme": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "layout": {
+ "type": "string",
+ "enum": [
+ "Full-width",
+ "Fixed-width"
+ ]
+ },
+ "theme": {
+ "type": "string",
+ "maxLength": 255
+ },
+ "theme_config": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "schema.SiteThemeResp": {
+ "type": "object",
+ "properties": {
+ "color_scheme": {
+ "type": "string"
+ },
+ "layout": {
+ "type": "string"
+ },
+ "theme": {
+ "type": "string"
+ },
+ "theme_config": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "theme_options": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.ThemeOption"
+ }
+ }
+ }
+ },
+ "schema.SiteUsersReq": {
+ "type": "object",
+ "required": [
+ "default_avatar"
+ ],
+ "properties": {
+ "allow_update_avatar": {
+ "type": "boolean"
+ },
+ "allow_update_bio": {
+ "type": "boolean"
+ },
+ "allow_update_display_name": {
+ "type": "boolean"
+ },
+ "allow_update_location": {
+ "type": "boolean"
+ },
+ "allow_update_username": {
+ "type": "boolean"
+ },
+ "allow_update_website": {
+ "type": "boolean"
+ },
+ "default_avatar": {
+ "type": "string",
+ "enum": [
+ "system",
+ "gravatar"
+ ]
+ },
+ "gravatar_base_url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteUsersResp": {
+ "type": "object",
+ "required": [
+ "default_avatar"
+ ],
+ "properties": {
+ "allow_update_avatar": {
+ "type": "boolean"
+ },
+ "allow_update_bio": {
+ "type": "boolean"
+ },
+ "allow_update_display_name": {
+ "type": "boolean"
+ },
+ "allow_update_location": {
+ "type": "boolean"
+ },
+ "allow_update_username": {
+ "type": "boolean"
+ },
+ "allow_update_website": {
+ "type": "boolean"
+ },
+ "default_avatar": {
+ "type": "string",
+ "enum": [
+ "system",
+ "gravatar"
+ ]
+ },
+ "gravatar_base_url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteUsersSettingsReq": {
+ "type": "object",
+ "required": [
+ "default_avatar"
+ ],
+ "properties": {
+ "default_avatar": {
+ "type": "string",
+ "enum": [
+ "system",
+ "gravatar"
+ ]
+ },
+ "gravatar_base_url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteUsersSettingsResp": {
+ "type": "object",
+ "required": [
+ "default_avatar"
+ ],
+ "properties": {
+ "default_avatar": {
+ "type": "string",
+ "enum": [
+ "system",
+ "gravatar"
+ ]
+ },
+ "gravatar_base_url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.SiteWriteTag": {
+ "type": "object",
+ "required": [
+ "slug_name"
+ ],
+ "properties": {
+ "display_name": {
+ "type": "string"
+ },
+ "slug_name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.TagItem": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "description": "display_name",
+ "type": "string",
+ "maxLength": 35
+ },
+ "original_text": {
+ "description": "original text",
+ "type": "string"
+ },
+ "slug_name": {
+ "description": "slug_name",
+ "type": "string",
+ "maxLength": 35
+ }
+ }
+ },
+ "schema.TagResp": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "type": "string"
+ },
+ "main_tag_slug_name": {
+ "description": "if main tag slug name is not empty, this tag is synonymous with the main tag",
+ "type": "string"
+ },
+ "recommend": {
+ "type": "boolean"
+ },
+ "reserved": {
+ "type": "boolean"
+ },
+ "slug_name": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.TagSynonym": {
+ "type": "object",
+ "properties": {
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "main_tag_slug_name": {
+ "description": "if main tag slug name is not empty, this tag is synonymous with the main tag",
+ "type": "string"
+ },
+ "slug_name": {
+ "description": "slug name",
+ "type": "string"
+ },
+ "tag_id": {
+ "description": "tag id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.ThemeOption": {
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UIOptionAction": {
+ "type": "object",
+ "properties": {
+ "loading": {
+ "$ref": "#/definitions/schema.LoadingAction"
+ },
+ "method": {
+ "type": "string"
+ },
+ "on_complete": {
+ "$ref": "#/definitions/schema.OnCompleteAction"
+ },
+ "url": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UnreviewedRevisionInfoInfo": {
+ "type": "object",
+ "properties": {
+ "answer_accepted": {
+ "type": "boolean"
+ },
+ "answer_count": {
+ "type": "integer"
+ },
+ "answer_id": {
+ "type": "string"
+ },
+ "comment_id": {
+ "type": "string"
+ },
+ "content": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "integer"
+ },
+ "html": {
+ "type": "string"
+ },
+ "object_creator_user_id": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "string"
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "question_id": {
+ "type": "string"
+ },
+ "show_status": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "integer"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagResp"
+ }
+ },
+ "title": {
+ "type": "string"
+ },
+ "url_title": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UpdateAPIKeyReq": {
+ "type": "object",
+ "required": [
+ "description",
+ "id"
+ ],
+ "properties": {
+ "description": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "id": {
+ "type": "integer"
+ }
+ }
+ },
+ "schema.UpdateBadgeStatusReq": {
+ "type": "object",
+ "required": [
+ "id",
+ "status"
+ ],
+ "properties": {
+ "id": {
+ "description": "badge id",
+ "type": "string"
+ },
+ "status": {
+ "description": "badge status",
+ "allOf": [
+ {
+ "$ref": "#/definitions/schema.BadgeStatus"
+ }
+ ]
+ }
+ }
+ },
+ "schema.UpdateCommentReq": {
+ "type": "object",
+ "required": [
+ "comment_id",
+ "original_text"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "description": "whether user can delete it",
+ "type": "string"
+ },
+ "comment_id": {
+ "description": "comment id",
+ "type": "string"
+ },
+ "original_text": {
+ "description": "original comment content",
+ "type": "string",
+ "maxLength": 600,
+ "minLength": 2
+ }
+ }
+ },
+ "schema.UpdateFollowTagsReq": {
+ "type": "object",
+ "properties": {
+ "slug_name_list": {
+ "description": "tag slug name list",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "schema.UpdateInfoRequest": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "$ref": "#/definitions/schema.AvatarInfo"
+ },
+ "bio": {
+ "type": "string",
+ "maxLength": 4096
+ },
+ "display_name": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ },
+ "location": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "username": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ },
+ "website": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "schema.UpdatePluginConfigReq": {
+ "type": "object",
+ "required": [
+ "plugin_slug_name"
+ ],
+ "properties": {
+ "config_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "plugin_slug_name": {
+ "type": "string",
+ "maxLength": 100
+ }
+ }
+ },
+ "schema.UpdatePluginStatusReq": {
+ "type": "object",
+ "required": [
+ "plugin_slug_name"
+ ],
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "plugin_slug_name": {
+ "type": "string",
+ "maxLength": 100
+ }
+ }
+ },
+ "schema.UpdatePrivilegesConfigReq": {
+ "type": "object",
+ "required": [
+ "level"
+ ],
+ "properties": {
+ "custom_privileges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/constant.Privilege"
+ }
+ },
+ "level": {
+ "minimum": 1,
+ "allOf": [
+ {
+ "$ref": "#/definitions/schema.PrivilegeLevel"
+ }
+ ]
+ }
+ }
+ },
+ "schema.UpdateReactionReq": {
+ "type": "object",
+ "required": [
+ "emoji",
+ "object_id",
+ "reaction"
+ ],
+ "properties": {
+ "emoji": {
+ "type": "string",
+ "enum": [
+ "heart",
+ "smile",
+ "frown"
+ ]
+ },
+ "object_id": {
+ "type": "string"
+ },
+ "reaction": {
+ "type": "string",
+ "enum": [
+ "activate",
+ "deactivate"
+ ]
+ }
+ }
+ },
+ "schema.UpdateReviewReq": {
+ "type": "object",
+ "required": [
+ "review_id",
+ "status"
+ ],
+ "properties": {
+ "review_id": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "approve",
+ "reject"
+ ]
+ }
+ }
+ },
+ "schema.UpdateSMTPConfigReq": {
+ "type": "object",
+ "properties": {
+ "encryption": {
+ "description": "\"\" SSL TLS",
+ "type": "string",
+ "enum": [
+ "SSL",
+ "TLS"
+ ]
+ },
+ "from_email": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "from_name": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "smtp_authentication": {
+ "type": "boolean"
+ },
+ "smtp_host": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "smtp_password": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "smtp_port": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "smtp_username": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "test_email_recipient": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UpdateTagReq": {
+ "type": "object",
+ "required": [
+ "tag_id"
+ ],
+ "properties": {
+ "display_name": {
+ "description": "display_name",
+ "type": "string",
+ "maxLength": 35
+ },
+ "edit_summary": {
+ "description": "edit summary",
+ "type": "string"
+ },
+ "original_text": {
+ "description": "original text",
+ "type": "string"
+ },
+ "slug_name": {
+ "description": "slug_name",
+ "type": "string",
+ "maxLength": 35
+ },
+ "tag_id": {
+ "description": "tag_id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.UpdateTagSynonymReq": {
+ "type": "object",
+ "required": [
+ "synonym_tag_list",
+ "tag_id"
+ ],
+ "properties": {
+ "synonym_tag_list": {
+ "description": "synonym tag list",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.TagItem"
+ }
+ },
+ "tag_id": {
+ "description": "tag_id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.UpdateUserInterfaceRequest": {
+ "type": "object",
+ "required": [
+ "color_scheme",
+ "language"
+ ],
+ "properties": {
+ "color_scheme": {
+ "description": "Color scheme",
+ "type": "string",
+ "maxLength": 100
+ },
+ "language": {
+ "description": "language",
+ "type": "string",
+ "maxLength": 100
+ }
+ }
+ },
+ "schema.UpdateUserNotificationConfigReq": {
+ "type": "object",
+ "properties": {
+ "all_new_question": {
+ "$ref": "#/definitions/schema.NotificationChannelConfig"
+ },
+ "all_new_question_for_following_tags": {
+ "$ref": "#/definitions/schema.NotificationChannelConfig"
+ },
+ "inbox": {
+ "$ref": "#/definitions/schema.NotificationChannelConfig"
+ }
+ }
+ },
+ "schema.UpdateUserPasswordReq": {
+ "type": "object",
+ "required": [
+ "password",
+ "user_id"
+ ],
+ "properties": {
+ "password": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ },
+ "user_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UpdateUserPluginConfigReq": {
+ "type": "object",
+ "required": [
+ "plugin_slug_name"
+ ],
+ "properties": {
+ "config_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "plugin_slug_name": {
+ "type": "string",
+ "maxLength": 100
+ }
+ }
+ },
+ "schema.UpdateUserRoleReq": {
+ "type": "object",
+ "required": [
+ "role_id",
+ "user_id"
+ ],
+ "properties": {
+ "role_id": {
+ "description": "role id",
+ "type": "integer"
+ },
+ "user_id": {
+ "description": "user id",
+ "type": "string"
+ }
+ }
+ },
+ "schema.UpdateUserStatusReq": {
+ "type": "object",
+ "required": [
+ "status",
+ "user_id"
+ ],
+ "properties": {
+ "remove_all_content": {
+ "type": "boolean"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "normal",
+ "suspended",
+ "deleted",
+ "inactive"
+ ]
+ },
+ "suspend_duration": {
+ "type": "string",
+ "enum": [
+ "24h",
+ "48h",
+ "72h",
+ "7d",
+ "14d",
+ "1m",
+ "2m",
+ "3m",
+ "6m",
+ "1y",
+ "forever"
+ ]
+ },
+ "user_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UserBasicInfo": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "type": "string"
+ },
+ "display_name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "language": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "rank": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "string"
+ },
+ "suspended_until": {
+ "type": "integer"
+ },
+ "username": {
+ "type": "string"
+ },
+ "website": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.UserChangeEmailSendCodeReq": {
+ "type": "object",
+ "required": [
+ "e_mail"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "e_mail": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "pass": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ }
+ }
+ },
+ "schema.UserChangeEmailVerifyReq": {
+ "type": "object",
+ "required": [
+ "code"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "schema.UserEmailLoginReq": {
+ "type": "object",
+ "required": [
+ "e_mail",
+ "pass"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "e_mail": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "pass": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ }
+ }
+ },
+ "schema.UserLoginResp": {
+ "type": "object",
+ "properties": {
+ "access_token": {
+ "description": "access token",
+ "type": "string"
+ },
+ "answer_count": {
+ "description": "answer count",
+ "type": "integer"
+ },
+ "authority_group": {
+ "description": "authority group",
+ "type": "integer"
+ },
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "bio": {
+ "description": "bio markdown",
+ "type": "string"
+ },
+ "bio_html": {
+ "description": "bio html",
+ "type": "string"
+ },
+ "color_scheme": {
+ "description": "Color scheme",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "create time",
+ "type": "integer"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "e_mail": {
+ "description": "email",
+ "type": "string"
+ },
+ "follow_count": {
+ "description": "follow count",
+ "type": "integer"
+ },
+ "have_password": {
+ "description": "user have password",
+ "type": "boolean"
+ },
+ "id": {
+ "description": "user id",
+ "type": "string"
+ },
+ "language": {
+ "description": "language",
+ "type": "string"
+ },
+ "last_login_date": {
+ "description": "last login date",
+ "type": "integer"
+ },
+ "location": {
+ "description": "location",
+ "type": "string"
+ },
+ "mail_status": {
+ "description": "mail status(1 pass 2 to be verified)",
+ "type": "integer"
+ },
+ "mobile": {
+ "description": "mobile",
+ "type": "string"
+ },
+ "notice_status": {
+ "description": "notice status(1 on 2off)",
+ "type": "integer"
+ },
+ "question_count": {
+ "description": "question count",
+ "type": "integer"
+ },
+ "rank": {
+ "description": "rank",
+ "type": "integer"
+ },
+ "role_id": {
+ "description": "role id",
+ "type": "integer"
+ },
+ "status": {
+ "description": "user status",
+ "type": "string"
+ },
+ "suspended_until": {
+ "description": "suspended until timestamp",
+ "type": "integer"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ },
+ "visit_token": {
+ "description": "visit token",
+ "type": "string"
+ },
+ "website": {
+ "description": "website",
+ "type": "string"
+ }
+ }
+ },
+ "schema.UserModifyPasswordReq": {
+ "type": "object",
+ "required": [
+ "pass"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "old_pass": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ },
+ "pass": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ }
+ }
+ },
+ "schema.UserRankingResp": {
+ "type": "object",
+ "properties": {
+ "staffs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.UserRankingSimpleInfo"
+ }
+ },
+ "users_with_the_most_reputation": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.UserRankingSimpleInfo"
+ }
+ },
+ "users_with_the_most_vote": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/schema.UserRankingSimpleInfo"
+ }
+ }
+ }
+ },
+ "schema.UserRankingSimpleInfo": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "rank": {
+ "description": "rank",
+ "type": "integer"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ },
+ "vote_count": {
+ "description": "vote",
+ "type": "integer"
+ }
+ }
+ },
+ "schema.UserRePassWordRequest": {
+ "type": "object",
+ "required": [
+ "code",
+ "pass"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "pass": {
+ "type": "string",
+ "maxLength": 32
+ }
+ }
+ },
+ "schema.UserRegisterReq": {
+ "type": "object",
+ "required": [
+ "e_mail",
+ "name",
+ "pass"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "e_mail": {
+ "type": "string",
+ "maxLength": 500
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 30,
+ "minLength": 2
+ },
+ "pass": {
+ "type": "string",
+ "maxLength": 32,
+ "minLength": 8
+ }
+ }
+ },
+ "schema.UserRetrievePassWordRequest": {
+ "type": "object",
+ "required": [
+ "e_mail"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "e_mail": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "schema.UserUnsubscribeNotificationReq": {
+ "type": "object",
+ "required": [
+ "code"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "schema.VoteReq": {
+ "type": "object",
+ "required": [
+ "object_id"
+ ],
+ "properties": {
+ "captcha_code": {
+ "type": "string"
+ },
+ "captcha_id": {
+ "type": "string"
+ },
+ "is_cancel": {
+ "type": "boolean"
+ },
+ "object_id": {
+ "type": "string"
+ }
+ }
+ },
+ "schema.VoteResp": {
+ "type": "object",
+ "properties": {
+ "down_votes": {
+ "type": "integer"
+ },
+ "up_votes": {
+ "type": "integer"
+ },
+ "vote_status": {
+ "type": "string"
+ },
+ "votes": {
+ "type": "integer"
+ }
+ }
+ },
+ "translator.LangOption": {
+ "type": "object",
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "progress": {
+ "description": "Translation completion percentage",
+ "type": "integer"
+ },
+ "value": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "ApiKeyAuth": {
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ }
+}`
+
+// SwaggerInfo holds exported Swagger Info so clients can modify it
+var SwaggerInfo = &swag.Spec{
+ Version: "",
+ Host: "",
+ BasePath: "/",
+ Schemes: []string{},
+ Title: "Apache Answer",
+ Description: "Apache Answer API",
+ InfoInstanceName: "swagger",
+ SwaggerTemplate: docTemplate,
+ LeftDelim: "{{",
+ RightDelim: "}}",
+}
+
+func init() {
+ swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
+}
diff --git a/docs/img/logo.svg b/docs/img/logo.svg
new file mode 100644
index 0000000..f07ef04
--- /dev/null
+++ b/docs/img/logo.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/docs/img/screenshot.png b/docs/img/screenshot.png
new file mode 100644
index 0000000..8a823a8
Binary files /dev/null and b/docs/img/screenshot.png differ
diff --git a/docs/release/LICENSE b/docs/release/LICENSE
new file mode 100644
index 0000000..58aea22
--- /dev/null
+++ b/docs/release/LICENSE
@@ -0,0 +1,324 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================================
+ APACHE ANSWER SUBCOMPONENTS:
+
+ The Apache answer project contains subcomponents with separate copyright
+ notices and license terms. Your use of the source code for the these
+ subcomponents is subject to the terms and conditions of the following
+ licenses.
+
+========================================================================
+Apache 2.0 licenses
+========================================================================
+
+The following components are provided under the Apache 2.0 License.
+
+ (Apache License, Version 2.0) gomock (https://github.com/uber-go/mock) [link](./licenses/LICENSE-uber-go-mock.txt)
+ (Apache License, Version 2.0) google-wire (https://github.com/google/wire) [link](./licenses/LICENSE-google-wire.txt)
+ (Apache License, Version 2.0) mojocn-base64Captcha (https://github.com/mojocn/base64Captcha) [link](./licenses/LICENSE-mojocn-base64Captcha.txt)
+ (Apache License, Version 2.0) ory-dockertest (https://github.com/ory/dockertest) [link](./licenses/LICENSE-ory-dockertest.txt)
+ (Apache License, Version 2.0) react-helmet-async (https://github.com/staylor/react-helmet-async) [link](./licenses/LICENSE-staylor-react-helmet-async.txt)
+ (Apache License, Version 2.0) sashabaranov-go-openai (https://github.com/sashabaranov/go-openai) [link](./licenses/LICENSE-sashabaranov-go-openai.txt)
+ (Apache License, Version 2.0) spf13-cobra (https://github.com/spf13/cobra) [link](./licenses/LICENSE-spf13-cobra.txt)
+
+========================================================================
+MIT licenses
+========================================================================
+
+The following components are provided under the MIT License. See project link for details.
+
+ (MIT License) @codemirror/lang-markdown (https://github.com/codemirror/lang-markdown) [link](./licenses/LICENSE-codemirror-lang-markdown.txt)
+ (MIT License) @codemirror/language-data (https://github.com/codemirror/language-data) [link](./licenses/LICENSE-codemirror-language-data.txt)
+ (MIT License) @codemirror/state (https://github.com/codemirror/state) [link](./licenses/LICENSE-codemirror-state.txt)
+ (MIT License) @codemirror/view (https://github.com/codemirror/view) [link](./licenses/LICENSE-codemirror-view.txt)
+ (MIT License) anargu-gin-brotli (https://github.com/anargu/gin-brotli) [link](./licenses/LICENSE-anargu-gin-brotli.txt)
+ (MIT License) asaskevich-govalidator (https://github.com/asaskevich/govalidator) [link](./licenses/LICENSE-asaskevich-govalidator.txt)
+ (MIT License) axios (https://github.com/axios/axios) [link](./licenses/LICENSE-axios-axios.txt)
+ (MIT License) bootstrap (https://github.com/twbs/bootstrap) [link](./licenses/LICENSE-twbs-bootstrap.txt)
+ (MIT License) classnames (https://github.com/JedWatson/classnames) [link](./LICENSE-JedWatson-classnames.txt)
+ (MIT License) codemirror (https://github.com/codemirror/basic-setup) [link](./licenses/LICENSE-codemirror-basic-setup.txt)
+ (MIT License) color (https://github.com/Qix-/color) [link](./licenses/LICENSE-Qix--color.txt)
+ (MIT License) copy-to-clipboard (https://github.com/sudodoki/copy-to-clipboard) [link](./licenses/LICENSE-sudodoki-copy-to-clipboard.txt)
+ (MIT License) dayjs (https://github.com/iamkun/dayjs) [link](./licenses/LICENSE-iamkun-dayjs.txt)
+ (MIT License) disintegration-imaging (https://github.com/disintegration/imaging) [link](./licenses/LICENSE-disintegration-imaging.txt)
+ (MIT License) front-matter (https://github.com/jxson/front-matter) [link](./licenses/LICENSE-jxson-front-matter.txt)
+ (MIT License) gin-gonic-gin (https://github.com/gin-gonic/gin) [link](./licenses/LICENSE-gin-gonic-gin.txt)
+ (MIT License) go-gomail-gomail (https://gopkg.in/gomail.v2) [link](./licenses/LICENSE-go-gomail-gomail.txt)
+ (MIT License) go-playground-locales (https://github.com/go-playground/locales) [link](./licenses/LICENSE-go-playground-locales.txt)
+ (MIT License) go-playground-universal-translator (https://github.com/go-playground/universal-translator) [link](./licenses/LICENSE-go-playground-universal-translator.txt)
+ (MIT License) go-playground-validator (https://github.com/go-playground/validator) [link](./licenses/LICENSE-go-playground-validator.txt)
+ (MIT License) go-resty-resty (https://github.com/go-resty/resty) [link](./licenses/LICENSE-go-resty-resty.txt)
+ (MIT License) goccy-go-json (https://github.com/goccy/go-json) [link](./licenses/LICENSE-goccy-go-json.txt)
+ (MIT License) i18next (https://github.com/i18next/i18next) [link](./licenses/LICENSE-i18next-i18next.txt)
+ (MIT License) icons (https://github.com/twbs/icons) [link](./licenses/LICENSE-twbs-icons.txt)
+ (MIT License) jinzhu-copier (https://github.com/jinzhu/copier) [link](./licenses/LICENSE-jinzhu-copier.txt)
+ (MIT License) jinzhu-now (https://github.com/jinzhu/now) [link](./licenses/LICENSE-jinzhu-now.txt)
+ (MIT License) joho-godotenv (https://github.com/joho/godotenv) [link](./licenses/LICENSE-joho-godotenv.txt)
+ (MIT License) jordan-wright-email (https://github.com/jordan-wright/email) [link](./licenses/LICENSE-jordan-wright-email.txt)
+ (MIT License) js-sha256 (https://github.com/emn178/js-sha256) [link](./licenses/LICENSE-emn178-js-sha256.txt)
+ (MIT License) lib-pq (https://github.com/lib/pq) [link](./licenses/LICENSE-lib-pq.txt)
+ (MIT License) lodash (https://github.com/lodash/lodash) [link](./licenses/LICENSE-lodash-lodash.txt)
+ (MIT License) Machiel-slugify (https://github.com/Machiel/slugify) [link](./licenses/LICENSE-Machiel-slugify.txt)
+ (MIT License) mark3labs-mcp-go (https://github.com/mark3labs/mcp-go) [link](./licenses/LICENSE-mark3labs-mcp-go.txt)
+ (MIT License) marked (https://github.com/markedjs/marked) [link](./licenses/LICENSE-markedjs-marked.txt)
+ (MIT License) Masterminds-semver (https://github.com/Masterminds/semver) [link](./licenses/LICENSE-Masterminds-semver.txt)
+ (MIT License) mattn-go-sqlite3 (https://github.com/mattn/go-sqlite3) [link](./licenses/LICENSE-mattn-go-sqlite3.txt)
+ (MIT License) mozillazg-go-pinyin (https://github.com/mozillazg/go-pinyin) [link](./licenses/LICENSE-mozillazg-go-pinyin.txt)
+ (MIT License) next-share (https://github.com/Bunlong/next-share) [link](./licenses/LIcENSE-Bunlong-next-share.txt)
+ (MIT License) node-qrcode (https://github.com/soldair/node-qrcode) [link](./licenses/LICENSE-soldair-qrcode.txt)
+ (MIT License) react (https://github.com/facebook/react) [link](./licenses/LICENSE-facebook-react.txt)
+ (MIT License) react-bootstrap (https://github.com/react-bootstrap/react-bootstrap) [link](./licenses/LICENSE-react-bootstrap-react-bootstrap.txt)
+ (MIT License) react-i18next (https://github.com/i18next/react-i18next) [link](./licenses/LICENSE-i18next-react-i18next.txt)
+ (MIT License) react-router (https://github.com/remix-run/react-router) [link](./licenses/LICENSE-remix-run-react-router.txt)
+ (MIT License) robfig-cron (https://github.com/robfig/cron) [link](./licenses/LICENSE-robfig-cron.txt)
+ (MIT License) scottleedavis-go-exif-remove (https://github.com/scottleedavis/go-exif-remove) [link](./licenses/LICENSE-scottleedavis-go-exif-remove.txt)
+ (MIT License) segmentfault-pacman (https://github.com/segmentfault/pacman) [link](./licenses/LICENSE-segmentfault-pacman.txt)
+ (MIT License) stretchr-testify (https://github.com/stretchr/testify) [link](./licenses/LICENSE-stretchr-testify.txt)
+ (MIT License) swaggo-files (https://github.com/swaggo/files) [link](./licenses/LICENSE-swaggo-files.txt)
+ (MIT License) swaggo-gin-swagger (https://github.com/swaggo/gin-swagger) [link](./licenses/LICENSE-swaggo-gin-swagger.txt)
+ (MIT License) swaggo-swag (https://github.com/swaggo/swag) [link](./licenses/LICENSE-swaggo-swag.txt)
+ (MIT License) swr (https://github.com/vercel/swr) [link](./licenses/LICENSE-vercel-swr.txt)
+ (MIT License) tidwall-gjson (https://github.com/tidwall/gjson) [link](./licenses/LICENSE-tidwall-gjson.txt)
+ (MIT License) uuidjs-uuid (https://github.com/uuidjs/uuid) [link](./licenses/LICENSE-uuidjs-uuid.txt)
+ (MIT License) yuin-goldmark (https://github.com/yuin/goldmark) [link](./licenses/LICENSE-yuin-goldmark.txt)
+ (MIT License) zustand (https://github.com/pmndrs/zustand) [link](./licenses/LICENSE-pmndrs-zustand.txt)
+
+========================================================================
+BSD licenses
+========================================================================
+
+The following components are provided under a BSD license. See project link for details.
+
+ (BSD 2-Clause) bwmarrin-snowflake (https://github.com/bwmarrin/snowflake) [link](./licenses/LICENSE-bwmarrin-snowflake.txt)
+ (BSD 3-Clause) cznic-sqlite (https://modernc.org/sqlite) [link](./licenses/LICENSE-cznic-sqlite.txt)
+ (BSD 3-Clause) google-uuid (https://github.com/google/uuid) [link](./licenses/LICENSE-google-uuid.txt)
+ (BSD 3-Clause) grokify-html-strip-tags-go (https://github.com/grokify/html-strip-tags-go) [link](./licenses/LICENSE-grokify-html-strip-tags-go.txt)
+ (BSD 3-Clause) jsdiff (https://github.com/kpdecker/jsdiff) [link](./licenses/LICENSE-kpdecker-jsdiff.txt)
+ (BSD 3-Clause) microcosm-cc-bluemonday (https://github.com/microcosm-cc/bluemonday) [link](./licenses/LICENSE-microcosm-cc-bluemonday.txt)
+ (BSD 3-Clause) qs (https://github.com/ljharb/qs) [link](./licenses/LICENSE-ljharb-qs.txt)
+ (BSD 2-Clause) xorm (https://xorm.io/xorm) [link](./licenses/LICENSE-xorm.txt)
+
+========================================================================
+ISC licenses
+========================================================================
+
+The following components are provided under a ISC license. See project link for details.
+
+ (ISC License) node-semver (https://github.com/npm/node-semver) [link](./licenses/LICENSE-npm-node-semver.txt)
+
+========================================================================
+MIT and Apache-2.0 licenses
+========================================================================
+
+The following components are provided under a MIT and Apache-2.0 license. See project link for details.
+
+ (MIT and Apache-2.0) go-yaml-yaml (https://gopkg.in/yaml.v3) [link](./licenses/LICENSE-go-yaml-yaml.txt)
+
+========================================================================
+MPL licenses
+========================================================================
+
+The following components are provided under a MPL license. See project link for details.
+
+ (MPL-2.0) go-sql-driver-mysql (https://github.com/go-sql-driver/mysql) [link](./licenses/LICENSE-go-sql-driver-mysql.txt)
diff --git a/docs/release/NOTICE b/docs/release/NOTICE
new file mode 100644
index 0000000..7eecdfc
--- /dev/null
+++ b/docs/release/NOTICE
@@ -0,0 +1,5 @@
+Apache Answer
+Copyright 2023-2026 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (https://www.apache.org/).
diff --git a/docs/release/licenses/LICENSE-JedWatson-classnames.txt b/docs/release/licenses/LICENSE-JedWatson-classnames.txt
new file mode 100644
index 0000000..4117bfa
--- /dev/null
+++ b/docs/release/licenses/LICENSE-JedWatson-classnames.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Jed Watson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/release/licenses/LICENSE-Machiel-slugify.txt b/docs/release/licenses/LICENSE-Machiel-slugify.txt
new file mode 100644
index 0000000..316e77d
--- /dev/null
+++ b/docs/release/licenses/LICENSE-Machiel-slugify.txt
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Machiel Molenaar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/docs/release/licenses/LICENSE-Masterminds-semver.txt b/docs/release/licenses/LICENSE-Masterminds-semver.txt
new file mode 100644
index 0000000..9ff7da9
--- /dev/null
+++ b/docs/release/licenses/LICENSE-Masterminds-semver.txt
@@ -0,0 +1,19 @@
+Copyright (C) 2014-2019, Matt Butcher and Matt Farina
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/release/licenses/LICENSE-Qix--color.txt b/docs/release/licenses/LICENSE-Qix--color.txt
new file mode 100644
index 0000000..45c92a8
--- /dev/null
+++ b/docs/release/licenses/LICENSE-Qix--color.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2012 Heather Arthur
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/release/licenses/LICENSE-anargu-gin-brotli.txt b/docs/release/licenses/LICENSE-anargu-gin-brotli.txt
new file mode 100644
index 0000000..e9bd201
--- /dev/null
+++ b/docs/release/licenses/LICENSE-anargu-gin-brotli.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Anthony Arostegui
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/release/licenses/LICENSE-asaskevich-govalidator.txt b/docs/release/licenses/LICENSE-asaskevich-govalidator.txt
new file mode 100644
index 0000000..cacba91
--- /dev/null
+++ b/docs/release/licenses/LICENSE-asaskevich-govalidator.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2020 Alex Saskevich
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/docs/release/licenses/LICENSE-axios-axios.txt b/docs/release/licenses/LICENSE-axios-axios.txt
new file mode 100644
index 0000000..05006a5
--- /dev/null
+++ b/docs/release/licenses/LICENSE-axios-axios.txt
@@ -0,0 +1,7 @@
+# Copyright (c) 2014-present Matt Zabriskie & Collaborators
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/release/licenses/LICENSE-bwmarrin-snowflake.txt b/docs/release/licenses/LICENSE-bwmarrin-snowflake.txt
new file mode 100644
index 0000000..ef39145
--- /dev/null
+++ b/docs/release/licenses/LICENSE-bwmarrin-snowflake.txt
@@ -0,0 +1,23 @@
+Copyright (c) 2016, Bruce
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/release/licenses/LICENSE-codemirror-basic-setup.txt b/docs/release/licenses/LICENSE-codemirror-basic-setup.txt
new file mode 100644
index 0000000..9a91f48
--- /dev/null
+++ b/docs/release/licenses/LICENSE-codemirror-basic-setup.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (C) 2018-2021 by Marijn Haverbeke
order (default or updated)
+ parameters:
+ - description: question_id
+ in: query
+ name: question_id
+ required: true
+ type: string
+ - description: order
+ in: query
+ name: order
+ required: true
+ type: string
+ - description: page
+ in: query
+ name: page
+ required: true
+ type: string
+ - description: page_size
+ in: query
+ name: page_size
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: AnswerList
+ tags:
+ - Answer
+ /answer/api/v1/answer/recover:
+ post:
+ consumes:
+ - application/json
+ description: recover the deleted answer
+ parameters:
+ - description: answer
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.RecoverAnswerReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: recover answer
+ tags:
+ - Answer
+ /answer/api/v1/badge:
+ get:
+ consumes:
+ - application/json
+ description: get badge info
+ parameters:
+ - default: string
+ description: id
+ in: query
+ name: id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetBadgeInfoResp'
+ type: object
+ summary: get badge info
+ tags:
+ - api-badge
+ /answer/api/v1/badge/awards/page:
+ get:
+ consumes:
+ - application/json
+ description: get badge award list
+ parameters:
+ - description: page
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ - description: badge id
+ in: query
+ name: badge_id
+ required: true
+ type: string
+ - description: only list the award by username
+ in: query
+ name: username
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetBadgeInfoResp'
+ type: object
+ summary: get badge award list
+ tags:
+ - api-badge
+ /answer/api/v1/badge/user/awards:
+ get:
+ consumes:
+ - application/json
+ description: get user badge award list
+ parameters:
+ - description: user name
+ in: query
+ name: username
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetUserBadgeAwardListResp'
+ type: array
+ type: object
+ summary: get user badge award list
+ tags:
+ - api-badge
+ /answer/api/v1/badge/user/awards/recent:
+ get:
+ consumes:
+ - application/json
+ description: get user badge award list
+ parameters:
+ - description: user name
+ in: query
+ name: username
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetUserBadgeAwardListResp'
+ type: array
+ type: object
+ summary: get user badge award list
+ tags:
+ - api-badge
+ /answer/api/v1/badges:
+ get:
+ consumes:
+ - application/json
+ description: list all badges group by group
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetBadgeListResp'
+ type: array
+ type: object
+ summary: list all badges group by group
+ tags:
+ - api-badge
+ /answer/api/v1/collection/switch:
+ post:
+ consumes:
+ - application/json
+ description: add collection
+ parameters:
+ - description: collection
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.CollectionSwitchReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.CollectionSwitchResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: add collection
+ tags:
+ - Collection
+ /answer/api/v1/comment:
+ delete:
+ consumes:
+ - application/json
+ description: remove comment
+ parameters:
+ - description: comment
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.RemoveCommentReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: remove comment
+ tags:
+ - Comment
+ get:
+ description: get comment by id
+ parameters:
+ - description: id
+ in: query
+ name: id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetCommentResp'
+ type: array
+ type: object
+ type: object
+ summary: get comment by id
+ tags:
+ - Comment
+ post:
+ consumes:
+ - application/json
+ description: add comment
+ parameters:
+ - description: comment
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.AddCommentReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetCommentResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: add comment
+ tags:
+ - Comment
+ put:
+ consumes:
+ - application/json
+ description: update comment
+ parameters:
+ - description: comment
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateCommentReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update comment
+ tags:
+ - Comment
+ /answer/api/v1/comment/page:
+ get:
+ description: get comment page
+ parameters:
+ - description: page
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ - description: object id
+ in: query
+ name: object_id
+ required: true
+ type: string
+ - description: query condition
+ enum:
+ - vote
+ in: query
+ name: query_cond
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetCommentResp'
+ type: array
+ type: object
+ type: object
+ summary: get comment page
+ tags:
+ - Comment
+ /answer/api/v1/connector/binding/email:
+ post:
+ consumes:
+ - application/json
+ description: external login binding user send email
+ parameters:
+ - description: external login binding user send email
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.ExternalLoginBindingUserSendEmailReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.ExternalLoginBindingUserSendEmailResp'
+ type: object
+ summary: external login binding user send email
+ tags:
+ - PluginConnector
+ /answer/api/v1/connector/info:
+ get:
+ description: get all enabled connectors
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.ConnectorInfoResp'
+ type: array
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get all enabled connectors
+ tags:
+ - PluginConnector
+ /answer/api/v1/connector/user/info:
+ get:
+ description: get all connectors info about user
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.ConnectorUserInfoResp'
+ type: array
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get all connectors info about user
+ tags:
+ - PluginConnector
+ /answer/api/v1/connector/user/unbinding:
+ delete:
+ consumes:
+ - application/json
+ description: unbind external user login
+ parameters:
+ - description: ExternalLoginUnbindingReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.ExternalLoginUnbindingReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: unbind external user login
+ tags:
+ - PluginConnector
+ /answer/api/v1/embed/config:
+ get:
+ consumes:
+ - application/json
+ description: get embed plugin config
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/plugin.EmbedConfig'
+ type: array
+ type: object
+ summary: get embed plugin config
+ tags:
+ - Plugin
+ /answer/api/v1/file:
+ post:
+ consumes:
+ - multipart/form-data
+ description: upload file
+ parameters:
+ - description: identify the source of the file upload
+ enum:
+ - post
+ - post_attachment
+ - avatar
+ - branding
+ in: formData
+ name: source
+ required: true
+ type: string
+ - description: file
+ in: formData
+ name: file
+ required: true
+ type: file
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ type: string
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: upload file
+ tags:
+ - Upload
+ /answer/api/v1/follow:
+ post:
+ consumes:
+ - application/json
+ description: follow object or cancel follow operation
+ parameters:
+ - description: follow
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.FollowReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.FollowResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: follow object or cancel follow operation
+ tags:
+ - Activity
+ /answer/api/v1/follow/tags:
+ put:
+ consumes:
+ - application/json
+ description: update user follow tags
+ parameters:
+ - description: follow
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateFollowTagsReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update user follow tags
+ tags:
+ - Activity
+ /answer/api/v1/language/config:
+ get:
+ description: get language config mapping
+ parameters:
+ - description: Accept-Language
+ in: header
+ name: Accept-Language
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: get language config mapping
+ tags:
+ - Lang
+ /answer/api/v1/language/options:
+ get:
+ description: Get language options
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: Get language options
+ tags:
+ - Lang
+ /answer/api/v1/meta/reaction:
+ get:
+ consumes:
+ - application/json
+ description: get reaction for an object
+ parameters:
+ - description: object_id
+ in: query
+ name: object_id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.ReactionRespItem'
+ type: object
+ summary: get reaction
+ tags:
+ - Meta
+ put:
+ consumes:
+ - application/json
+ description: update reaction. if not exist, add one
+ parameters:
+ - description: reaction
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateReactionReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: add or update reaction
+ tags:
+ - Meta
+ /answer/api/v1/notification/page:
+ get:
+ consumes:
+ - application/json
+ description: get notification list
+ parameters:
+ - description: page size
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ - description: type
+ enum:
+ - inbox
+ - achievement
+ in: query
+ name: type
+ required: true
+ type: string
+ - description: inbox_type
+ enum:
+ - all
+ - posts
+ - invites
+ - votes
+ in: query
+ name: inbox_type
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: get notification list
+ tags:
+ - Notification
+ /answer/api/v1/notification/read/state:
+ put:
+ consumes:
+ - application/json
+ description: ClearUnRead
+ parameters:
+ - description: NotificationClearIDRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.NotificationClearIDRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: ClearUnRead
+ tags:
+ - Notification
+ /answer/api/v1/notification/read/state/all:
+ put:
+ consumes:
+ - application/json
+ description: ClearUnRead
+ parameters:
+ - description: NotificationClearRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.NotificationClearRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: ClearUnRead
+ tags:
+ - Notification
+ /answer/api/v1/notification/status:
+ get:
+ consumes:
+ - application/json
+ description: GetRedDot
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: GetRedDot
+ tags:
+ - Notification
+ put:
+ consumes:
+ - application/json
+ description: DelRedDot
+ parameters:
+ - description: NotificationClearRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.NotificationClearRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: DelRedDot
+ tags:
+ - Notification
+ /answer/api/v1/permission:
+ get:
+ description: check user permission
+ parameters:
+ - description: access-token
+ in: header
+ name: Authorization
+ required: true
+ type: string
+ - description: permission key
+ enum:
+ - question.add
+ - question.edit
+ - question.edit_without_review
+ - question.delete
+ - question.close
+ - question.reopen
+ - question.vote_up
+ - question.vote_down
+ - question.pin
+ - question.unpin
+ - question.hide
+ - question.show
+ - answer.add
+ - answer.edit
+ - answer.edit_without_review
+ - answer.delete
+ - answer.accept
+ - answer.vote_up
+ - answer.vote_down
+ - answer.invite_someone_to_answer
+ - comment.add
+ - comment.edit
+ - comment.delete
+ - comment.vote_up
+ - comment.vote_down
+ - report.add
+ - tag.add
+ - tag.edit
+ - tag.edit_slug_name
+ - tag.edit_without_review
+ - tag.delete
+ - tag.synonym
+ - link.url_limit
+ - vote.detail
+ - answer.audit
+ - question.audit
+ - tag.audit
+ - tag.use_reserved_tag
+ in: query
+ name: action
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ additionalProperties:
+ type: boolean
+ type: object
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: check user permission
+ tags:
+ - Permission
+ /answer/api/v1/personal/answer/page:
+ get:
+ consumes:
+ - application/json
+ description: list personal answers
+ parameters:
+ - default: string
+ description: username
+ in: query
+ name: username
+ required: true
+ type: string
+ - description: order
+ enum:
+ - newest
+ - score
+ in: query
+ name: order
+ required: true
+ type: string
+ - default: "0"
+ description: page
+ in: query
+ name: page
+ required: true
+ type: string
+ - default: "20"
+ description: page_size
+ in: query
+ name: page_size
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: list personal answers
+ tags:
+ - Personal
+ /answer/api/v1/personal/collection/page:
+ get:
+ consumes:
+ - application/json
+ description: list personal collections
+ parameters:
+ - default: "0"
+ description: page
+ in: query
+ name: page
+ required: true
+ type: string
+ - default: "20"
+ description: page_size
+ in: query
+ name: page_size
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: list personal collections
+ tags:
+ - Collection
+ /answer/api/v1/personal/comment/page:
+ get:
+ description: user personal comment list
+ parameters:
+ - description: page
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ - description: username
+ in: query
+ name: username
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetCommentPersonalWithPageResp'
+ type: array
+ type: object
+ type: object
+ summary: user personal comment list
+ tags:
+ - Comment
+ /answer/api/v1/personal/qa/top:
+ get:
+ consumes:
+ - application/json
+ description: UserTop
+ parameters:
+ - default: string
+ description: username
+ in: query
+ name: username
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: UserTop
+ tags:
+ - Question
+ /answer/api/v1/personal/rank/page:
+ get:
+ description: user personal rank list
+ parameters:
+ - description: page
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ - description: username
+ in: query
+ name: username
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetRankPersonalPageResp'
+ type: array
+ type: object
+ type: object
+ summary: user personal rank list
+ tags:
+ - Rank
+ /answer/api/v1/personal/user/info:
+ get:
+ consumes:
+ - application/json
+ description: GetOtherUserInfoByUsername
+ parameters:
+ - description: username
+ in: query
+ name: username
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetOtherUserInfoResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: GetOtherUserInfoByUsername
+ tags:
+ - User
+ /answer/api/v1/personal/vote/page:
+ get:
+ consumes:
+ - application/json
+ description: get user personal votes
+ parameters:
+ - description: page size
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetVoteWithPageResp'
+ type: array
+ type: object
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get user personal votes
+ tags:
+ - Activity
+ /answer/api/v1/plugin/status:
+ get:
+ consumes:
+ - application/json
+ description: get all plugins status
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetPluginListResp'
+ type: array
+ type: object
+ summary: get all plugins status
+ tags:
+ - Plugin
+ /answer/api/v1/post/render:
+ post:
+ consumes:
+ - application/json
+ description: render post content
+ parameters:
+ - description: PostRenderReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.PostRenderReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: render post content
+ tags:
+ - Upload
+ /answer/api/v1/question:
+ delete:
+ consumes:
+ - application/json
+ description: delete question
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.RemoveQuestionReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: delete question
+ tags:
+ - Question
+ post:
+ consumes:
+ - application/json
+ description: add question
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionAdd'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: add question
+ tags:
+ - Question
+ put:
+ consumes:
+ - application/json
+ description: update question
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionUpdate'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update question
+ tags:
+ - Question
+ /answer/api/v1/question/answer:
+ post:
+ consumes:
+ - application/json
+ description: add question and answer
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionAddByAnswer'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: add question and answer
+ tags:
+ - Question
+ /answer/api/v1/question/info:
+ get:
+ consumes:
+ - application/json
+ description: get question details
+ parameters:
+ - default: "1"
+ description: Question TagID
+ in: query
+ name: id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: get question details
+ tags:
+ - Question
+ /answer/api/v1/question/invite:
+ get:
+ consumes:
+ - application/json
+ description: get question invite user info
+ parameters:
+ - default: "1"
+ description: Question ID
+ in: query
+ name: id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: get question invite user info
+ tags:
+ - Question
+ put:
+ consumes:
+ - application/json
+ description: update question invite user
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionUpdateInviteUser'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update question invite user
+ tags:
+ - Question
+ /answer/api/v1/question/link:
+ get:
+ description: get question link
+ parameters:
+ - in: query
+ minimum: 1
+ name: in_days
+ type: integer
+ - enum:
+ - newest
+ - active
+ - hot
+ - score
+ - unanswered
+ - recommend
+ - frequent
+ in: query
+ name: order
+ type: string
+ - in: query
+ minimum: 1
+ name: page
+ type: integer
+ - in: query
+ maximum: 100
+ minimum: 1
+ name: page_size
+ type: integer
+ - in: query
+ name: question_id
+ required: true
+ type: string
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.QuestionPageResp'
+ type: array
+ type: object
+ type: object
+ summary: get question link
+ tags:
+ - Question
+ /answer/api/v1/question/operation:
+ put:
+ consumes:
+ - application/json
+ description: Operation question \n operation [pin unpin hide show]
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.OperationQuestionReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: Operation question
+ tags:
+ - Question
+ /answer/api/v1/question/page:
+ get:
+ consumes:
+ - application/json
+ description: get questions by page
+ parameters:
+ - description: QuestionPageReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionPageReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.QuestionPageResp'
+ type: array
+ type: object
+ type: object
+ summary: get questions by page
+ tags:
+ - Question
+ /answer/api/v1/question/recommend/page:
+ get:
+ consumes:
+ - application/json
+ description: get recommend questions by page
+ parameters:
+ - description: QuestionPageReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionPageReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.QuestionPageResp'
+ type: array
+ type: object
+ type: object
+ summary: get recommend questions by page
+ tags:
+ - Question
+ /answer/api/v1/question/recover:
+ post:
+ consumes:
+ - application/json
+ description: recover deleted question
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.QuestionRecoverReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: recover deleted question
+ tags:
+ - Question
+ /answer/api/v1/question/reopen:
+ put:
+ consumes:
+ - application/json
+ description: reopen question
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.ReopenQuestionReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: reopen question
+ tags:
+ - Question
+ /answer/api/v1/question/similar:
+ get:
+ consumes:
+ - application/json
+ description: fuzzy query similar questions based on title
+ parameters:
+ - default: string
+ description: title
+ in: query
+ name: title
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: fuzzy query similar questions based on title
+ tags:
+ - Question
+ /answer/api/v1/question/similar/tag:
+ get:
+ consumes:
+ - application/json
+ description: Search Similar Question
+ parameters:
+ - default: ""
+ description: question_id
+ in: query
+ name: question_id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: Search Similar Question
+ tags:
+ - Question
+ /answer/api/v1/question/status:
+ put:
+ consumes:
+ - application/json
+ description: Close question
+ parameters:
+ - description: question
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.CloseQuestionReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: Close question
+ tags:
+ - Question
+ /answer/api/v1/question/tags:
+ get:
+ description: get tag list
+ parameters:
+ - description: tag
+ in: query
+ name: tag
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetTagBasicResp'
+ type: array
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get tag list
+ tags:
+ - Tag
+ /answer/api/v1/reasons:
+ get:
+ consumes:
+ - application/json
+ description: get reasons by object type and action
+ parameters:
+ - description: object_type
+ enum:
+ - question
+ - answer
+ - comment
+ - user
+ in: query
+ name: object_type
+ required: true
+ type: string
+ - description: action
+ enum:
+ - status
+ - close
+ - flag
+ - review
+ in: query
+ name: action
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: get reasons by object type and action
+ tags:
+ - reason
+ /answer/api/v1/render/config:
+ get:
+ consumes:
+ - application/json
+ description: GetRenderConfig
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/plugin.RenderConfig'
+ type: object
+ summary: GetRenderConfig
+ tags:
+ - PluginRender
+ /answer/api/v1/report:
+ post:
+ consumes:
+ - application/json
+ description: add report
source (question, answer, comment, user)
+ parameters:
+ - description: report
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.AddReportReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: add report
+ tags:
+ - Report
+ /answer/api/v1/report/review:
+ put:
+ consumes:
+ - application/json
+ description: review report
+ parameters:
+ - description: flag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.ReviewReportReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: review report
+ tags:
+ - Report
+ /answer/api/v1/report/unreviewed/post:
+ get:
+ consumes:
+ - application/json
+ description: get unreviewed report post page
+ parameters:
+ - description: page
+ in: query
+ name: page
+ type: integer
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetReportListPageResp'
+ type: array
+ type: object
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get unreviewed report post page
+ tags:
+ - Report
+ /answer/api/v1/review/pending/post:
+ put:
+ consumes:
+ - application/json
+ description: update review
+ parameters:
+ - description: review
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateReviewReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update review
+ tags:
+ - Review
+ /answer/api/v1/review/pending/post/page:
+ get:
+ consumes:
+ - application/json
+ description: get unreviewed post page
+ parameters:
+ - description: page
+ in: query
+ name: page
+ type: integer
+ - description: object_id
+ in: query
+ name: object_id
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetUnreviewedPostPageResp'
+ type: array
+ type: object
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get unreviewed post page
+ tags:
+ - Review
+ /answer/api/v1/reviewing/type:
+ get:
+ description: get reviewing type
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetReviewingTypeResp'
+ type: array
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get reviewing type
+ tags:
+ - Revision
+ /answer/api/v1/revisions:
+ get:
+ description: get revision list
+ parameters:
+ - description: object id
+ in: query
+ name: object_id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetRevisionResp'
+ type: array
+ type: object
+ summary: get revision list
+ tags:
+ - Revision
+ /answer/api/v1/revisions/audit:
+ put:
+ description: revision audit operation:approve or reject
+ parameters:
+ - description: audit
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.RevisionAuditReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: revision audit
+ tags:
+ - Revision
+ /answer/api/v1/revisions/edit/check:
+ get:
+ consumes:
+ - application/json
+ description: check can update revision
+ parameters:
+ - default: string
+ description: id
+ in: query
+ name: id
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: check can update revision
+ tags:
+ - Revision
+ /answer/api/v1/revisions/unreviewed:
+ get:
+ description: get unreviewed revision list
+ parameters:
+ - description: page id
+ in: query
+ name: page
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetUnreviewedRevisionResp'
+ type: array
+ type: object
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get unreviewed revision list
+ tags:
+ - Revision
+ /answer/api/v1/search:
+ get:
+ description: search object
+ parameters:
+ - description: query string
+ in: query
+ name: q
+ required: true
+ type: string
+ - description: order
+ enum:
+ - newest
+ - active
+ - score
+ - relevance
+ in: query
+ name: order
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.SearchResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: search object
+ tags:
+ - Search
+ /answer/api/v1/search/desc:
+ get:
+ description: get search description
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.SearchResp'
+ type: object
+ summary: get search description
+ tags:
+ - Search
+ /answer/api/v1/siteinfo:
+ get:
+ description: get site info
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.SiteInfoResp'
+ type: object
+ summary: get site info
+ tags:
+ - site
+ /answer/api/v1/siteinfo/legal:
+ get:
+ description: get site legal info
+ parameters:
+ - description: legal information type
+ enum:
+ - tos
+ - privacy
+ in: query
+ name: info_type
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetSiteLegalInfoResp'
+ type: object
+ summary: get site legal info
+ tags:
+ - site
+ /answer/api/v1/tag:
+ delete:
+ consumes:
+ - application/json
+ description: delete tag
+ parameters:
+ - description: tag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.RemoveTagReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: delete tag
+ tags:
+ - Tag
+ get:
+ consumes:
+ - application/json
+ description: get tag one
+ parameters:
+ - description: tag id
+ in: query
+ name: tag_id
+ required: true
+ type: string
+ - description: tag name
+ in: query
+ name: tag_name
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetTagResp'
+ type: object
+ summary: get tag one
+ tags:
+ - Tag
+ post:
+ consumes:
+ - application/json
+ description: add tag
+ parameters:
+ - description: tag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.AddTagReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: add tag
+ tags:
+ - Tag
+ put:
+ consumes:
+ - application/json
+ description: update tag
+ parameters:
+ - description: tag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateTagReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update tag
+ tags:
+ - Tag
+ /answer/api/v1/tag/merge:
+ post:
+ consumes:
+ - application/json
+ description: merge tag
+ parameters:
+ - description: tag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.AddTagReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: merge tag
+ tags:
+ - Tag
+ /answer/api/v1/tag/recover:
+ post:
+ consumes:
+ - application/json
+ description: recover delete tag
+ parameters:
+ - description: tag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.RecoverTagReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: recover delete tag
+ tags:
+ - Tag
+ /answer/api/v1/tag/synonym:
+ put:
+ consumes:
+ - application/json
+ description: update tag
+ parameters:
+ - description: tag
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateTagSynonymReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update tag
+ tags:
+ - Tag
+ /answer/api/v1/tag/synonyms:
+ get:
+ description: get tag synonyms
+ parameters:
+ - description: tag id
+ in: query
+ name: tag_id
+ required: true
+ type: integer
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetTagSynonymsResp'
+ type: object
+ summary: get tag synonyms
+ tags:
+ - Tag
+ /answer/api/v1/tags:
+ get:
+ description: get tags list by slug name
+ parameters:
+ - collectionFormat: csv
+ description: string collection
+ in: query
+ items:
+ type: string
+ name: tags
+ type: array
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetTagBasicResp'
+ type: array
+ type: object
+ summary: get tags list
+ tags:
+ - Tag
+ /answer/api/v1/tags/following:
+ get:
+ description: get following tag list
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetFollowingTagsResp'
+ type: array
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get following tag list
+ tags:
+ - Tag
+ /answer/api/v1/tags/page:
+ get:
+ description: get tag page
+ parameters:
+ - description: page size
+ in: query
+ name: page
+ type: integer
+ - description: page size
+ in: query
+ name: page_size
+ type: integer
+ - description: slug_name
+ in: query
+ name: slug_name
+ type: string
+ - description: query condition
+ enum:
+ - popular
+ - name
+ - newest
+ in: query
+ name: query_cond
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ allOf:
+ - $ref: '#/definitions/pager.PageModel'
+ - properties:
+ list:
+ items:
+ $ref: '#/definitions/schema.GetTagPageResp'
+ type: array
+ type: object
+ type: object
+ summary: get tag page
+ tags:
+ - Tag
+ /answer/api/v1/user/action/record:
+ get:
+ description: ActionRecord
+ parameters:
+ - description: action
+ enum:
+ - login
+ - e_mail
+ - find_pass
+ in: query
+ name: action
+ required: true
+ type: string
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.ActionRecordResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: ActionRecord
+ tags:
+ - User
+ /answer/api/v1/user/email:
+ put:
+ consumes:
+ - application/json
+ description: user change email verification
+ parameters:
+ - description: UserChangeEmailVerifyReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserChangeEmailVerifyReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: user change email verification
+ tags:
+ - User
+ /answer/api/v1/user/email/change/code:
+ post:
+ consumes:
+ - application/json
+ description: send email to the user email then change their email
+ parameters:
+ - description: UserChangeEmailSendCodeReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserChangeEmailSendCodeReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: send email to the user email then change their email
+ tags:
+ - User
+ /answer/api/v1/user/email/verification:
+ post:
+ consumes:
+ - application/json
+ description: UserVerifyEmail
+ parameters:
+ - default: ""
+ description: code
+ in: query
+ name: code
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.UserLoginResp'
+ type: object
+ summary: UserVerifyEmail
+ tags:
+ - User
+ /answer/api/v1/user/email/verification/send:
+ post:
+ consumes:
+ - application/json
+ description: UserVerifyEmailSend
+ parameters:
+ - default: ""
+ description: captcha_id
+ in: query
+ name: captcha_id
+ type: string
+ - default: ""
+ description: captcha_code
+ in: query
+ name: captcha_code
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ security:
+ - ApiKeyAuth: []
+ summary: UserVerifyEmailSend
+ tags:
+ - User
+ /answer/api/v1/user/info:
+ get:
+ consumes:
+ - application/json
+ description: get user info, if user no login response http code is 200, but
+ user info is null
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetCurrentLoginUserInfoResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: GetUserInfoByUserID
+ tags:
+ - User
+ put:
+ consumes:
+ - application/json
+ description: UserUpdateInfo update user info
+ parameters:
+ - description: access-token
+ in: header
+ name: Authorization
+ required: true
+ type: string
+ - description: UpdateInfoRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateInfoRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: UserUpdateInfo update user info
+ tags:
+ - User
+ /answer/api/v1/user/info/search:
+ get:
+ consumes:
+ - application/json
+ description: SearchUserListByName
+ parameters:
+ - description: username
+ in: query
+ name: username
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetOtherUserInfoResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: SearchUserListByName
+ tags:
+ - User
+ /answer/api/v1/user/interface:
+ put:
+ consumes:
+ - application/json
+ description: UserUpdateInterface update user interface config
+ parameters:
+ - description: access-token
+ in: header
+ name: Authorization
+ required: true
+ type: string
+ - description: UpdateInfoRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateUserInterfaceRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: UserUpdateInterface update user interface config
+ tags:
+ - User
+ /answer/api/v1/user/login/email:
+ post:
+ consumes:
+ - application/json
+ description: UserEmailLogin
+ parameters:
+ - description: UserEmailLogin
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserEmailLoginReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.UserLoginResp'
+ type: object
+ summary: UserEmailLogin
+ tags:
+ - User
+ /answer/api/v1/user/logout:
+ get:
+ consumes:
+ - application/json
+ description: user logout
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: user logout
+ tags:
+ - User
+ /answer/api/v1/user/notification/config:
+ post:
+ consumes:
+ - application/json
+ description: get user's notification config
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetUserNotificationConfigResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get user's notification config
+ tags:
+ - User
+ put:
+ consumes:
+ - application/json
+ description: update user's notification config
+ parameters:
+ - description: UpdateUserNotificationConfigReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateUserNotificationConfigReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update user's notification config
+ tags:
+ - User
+ /answer/api/v1/user/notification/unsubscribe:
+ put:
+ consumes:
+ - application/json
+ description: unsubscribe notification
+ parameters:
+ - description: UserUnsubscribeNotificationReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserUnsubscribeNotificationReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: unsubscribe notification
+ tags:
+ - User
+ /answer/api/v1/user/password:
+ put:
+ consumes:
+ - application/json
+ description: UserModifyPassWord
+ parameters:
+ - description: UserModifyPasswordReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserModifyPasswordReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: UserModifyPassWord
+ tags:
+ - User
+ /answer/api/v1/user/password/replacement:
+ post:
+ consumes:
+ - application/json
+ description: UseRePassWord
+ parameters:
+ - description: UserRePassWordRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserRePassWordRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: UseRePassWord
+ tags:
+ - User
+ /answer/api/v1/user/password/reset:
+ post:
+ consumes:
+ - application/json
+ description: RetrievePassWord
+ parameters:
+ - description: UserRetrievePassWordRequest
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserRetrievePassWordRequest'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: RetrievePassWord
+ tags:
+ - User
+ /answer/api/v1/user/plugin/config:
+ get:
+ description: get user plugin config
+ parameters:
+ - description: plugin_slug_name
+ in: query
+ name: plugin_slug_name
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetPluginConfigResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get user plugin config
+ tags:
+ - UserPlugin
+ put:
+ consumes:
+ - application/json
+ description: update user plugin config
+ parameters:
+ - description: UpdatePluginConfigReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UpdateUserPluginConfigReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: update user plugin config
+ tags:
+ - UserPlugin
+ /answer/api/v1/user/plugin/configs:
+ get:
+ consumes:
+ - application/json
+ description: get plugin list that used for user.
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/schema.GetUserPluginListResp'
+ type: array
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: get plugin list that used for user.
+ tags:
+ - UserPlugin
+ /answer/api/v1/user/ranking:
+ get:
+ consumes:
+ - application/json
+ description: get user ranking
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.UserRankingResp'
+ type: object
+ summary: get user ranking
+ tags:
+ - User
+ /answer/api/v1/user/register/email:
+ post:
+ consumes:
+ - application/json
+ description: UserRegisterByEmail
+ parameters:
+ - description: UserRegisterReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserRegisterReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.UserLoginResp'
+ type: object
+ summary: UserRegisterByEmail
+ tags:
+ - User
+ /answer/api/v1/user/staff:
+ get:
+ consumes:
+ - application/json
+ description: get user staff
+ parameters:
+ - description: username
+ in: query
+ name: username
+ required: true
+ type: string
+ - description: page_size
+ in: query
+ name: page_size
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.GetUserStaffResp'
+ type: object
+ summary: get user staff
+ tags:
+ - User
+ /answer/api/v1/vote/down:
+ post:
+ consumes:
+ - application/json
+ description: add vote
+ parameters:
+ - description: vote
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.VoteReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.VoteResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: vote down
+ tags:
+ - Activity
+ /answer/api/v1/vote/up:
+ post:
+ consumes:
+ - application/json
+ description: add vote
+ parameters:
+ - description: vote
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.VoteReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/schema.VoteResp'
+ type: object
+ security:
+ - ApiKeyAuth: []
+ summary: vote up
+ tags:
+ - Activity
+ /custom.css:
+ get:
+ description: get site custom CSS
+ produces:
+ - text/css
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: get site custom CSS
+ tags:
+ - site
+ /installation/base-info:
+ post:
+ consumes:
+ - application/json
+ description: init base info
+ parameters:
+ - description: InitBaseInfoReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/install.InitBaseInfoReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: init base info
+ tags:
+ - installation
+ /installation/config-file/check:
+ post:
+ consumes:
+ - application/json
+ description: check config file if exist when installation
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/install.CheckConfigFileResp'
+ type: object
+ summary: check config file if exist when installation
+ tags:
+ - installation
+ /installation/db/check:
+ post:
+ consumes:
+ - application/json
+ description: check database if exist when installation
+ parameters:
+ - description: CheckDatabaseReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/install.CheckDatabaseReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ $ref: '#/definitions/install.CheckConfigFileResp'
+ type: object
+ summary: check database if exist when installation
+ tags:
+ - installation
+ /installation/init:
+ post:
+ consumes:
+ - application/json
+ description: init environment
+ parameters:
+ - description: CheckDatabaseReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/install.CheckDatabaseReq'
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: init environment
+ tags:
+ - installation
+ /installation/language/config:
+ get:
+ description: get installation language config mapping
+ parameters:
+ - description: installation language
+ in: query
+ name: lang
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ summary: get installation language config mapping
+ tags:
+ - Lang
+ /installation/language/options:
+ get:
+ description: get installation language options
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ allOf:
+ - $ref: '#/definitions/handler.RespBody'
+ - properties:
+ data:
+ items:
+ $ref: '#/definitions/translator.LangOption'
+ type: array
+ type: object
+ summary: get installation language options
+ tags:
+ - Lang
+ /personal/question/page:
+ get:
+ consumes:
+ - application/json
+ description: list personal questions
+ parameters:
+ - default: string
+ description: username
+ in: query
+ name: username
+ required: true
+ type: string
+ - description: order
+ enum:
+ - newest
+ - score
+ in: query
+ name: order
+ required: true
+ type: string
+ - default: "0"
+ description: page
+ in: query
+ name: page
+ required: true
+ type: string
+ - default: "20"
+ description: page_size
+ in: query
+ name: page_size
+ required: true
+ type: string
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ $ref: '#/definitions/handler.RespBody'
+ security:
+ - ApiKeyAuth: []
+ summary: list personal questions
+ tags:
+ - Personal
+ /robots.txt:
+ get:
+ description: get site robots information
+ produces:
+ - application/json
+ responses:
+ "200":
+ description: OK
+ schema:
+ type: string
+ summary: get site robots information
+ tags:
+ - site
+securityDefinitions:
+ ApiKeyAuth:
+ in: header
+ name: Authorization
+ type: apiKey
+swagger: "2.0"
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..5787c8b
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,192 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you 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.
+
+module github.com/apache/answer
+
+go 1.25.0
+
+require (
+ github.com/Machiel/slugify v1.0.1
+ github.com/Masterminds/semver/v3 v3.3.0
+ github.com/anargu/gin-brotli v0.0.0-20220116052358-12bf532d5267
+ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2
+ github.com/bwmarrin/snowflake v0.3.0
+ github.com/disintegration/imaging v1.6.2
+ github.com/gin-gonic/gin v1.10.0
+ github.com/go-playground/locales v0.14.1
+ github.com/go-playground/universal-translator v0.18.1
+ github.com/go-playground/validator/v10 v10.22.1
+ github.com/go-resty/resty/v2 v2.17.1
+ github.com/go-sql-driver/mysql v1.8.1
+ github.com/goccy/go-json v0.10.3
+ github.com/google/uuid v1.6.0
+ github.com/google/wire v0.5.0
+ github.com/grokify/html-strip-tags-go v0.1.0
+ github.com/jinzhu/copier v0.4.0
+ github.com/jinzhu/now v1.1.5
+ github.com/joho/godotenv v1.5.1
+ github.com/lib/pq v1.10.9
+ github.com/mark3labs/mcp-go v0.43.2
+ github.com/microcosm-cc/bluemonday v1.0.27
+ github.com/mozillazg/go-pinyin v0.20.0
+ github.com/mozillazg/go-unidecode v0.2.0
+ github.com/ory/dockertest/v3 v3.11.0
+ github.com/robfig/cron/v3 v3.0.1
+ github.com/sashabaranov/go-openai v1.41.2
+ github.com/scottleedavis/go-exif-remove v0.0.0-20230314195146-7e059d593405
+ github.com/segmentfault/pacman v1.0.5-0.20230822083413-c0075a2d401f
+ github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20230822083413-c0075a2d401f
+ github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20230822083413-c0075a2d401f
+ github.com/segmentfault/pacman/contrib/i18n v0.0.0-20230822083413-c0075a2d401f
+ github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20230822083413-c0075a2d401f
+ github.com/segmentfault/pacman/contrib/server/http v0.0.0-20230822083413-c0075a2d401f
+ github.com/spf13/cobra v1.8.1
+ github.com/stretchr/testify v1.9.0
+ github.com/swaggo/files v1.0.1
+ github.com/swaggo/gin-swagger v1.6.0
+ github.com/swaggo/swag v1.16.3
+ github.com/tidwall/gjson v1.17.3
+ github.com/yuin/goldmark v1.7.4
+ go.uber.org/mock v0.6.0
+ golang.org/x/crypto v0.53.0
+ golang.org/x/image v0.20.0
+ golang.org/x/term v0.44.0
+ golang.org/x/text v0.39.0
+ gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
+ gopkg.in/yaml.v3 v3.0.1
+ modernc.org/sqlite v1.33.0
+ xorm.io/builder v0.3.13
+ xorm.io/xorm v1.3.2
+)
+
+require (
+ dario.cat/mergo v1.0.1 // indirect
+ filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
+ github.com/KyleBanks/depth v1.2.1 // indirect
+ github.com/LinkinStars/go-i18n/v2 v2.2.2 // indirect
+ github.com/Microsoft/go-winio v0.6.2 // indirect
+ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
+ github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/aymerick/douceur v0.2.0 // indirect
+ github.com/bahlo/generic-list-go v0.2.0 // indirect
+ github.com/buger/jsonparser v1.1.1 // indirect
+ github.com/bytedance/sonic v1.12.2 // indirect
+ github.com/bytedance/sonic/loader v0.2.0 // indirect
+ github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+ github.com/cloudwego/base64x v0.1.4 // indirect
+ github.com/cloudwego/iasm v0.2.0 // indirect
+ github.com/containerd/continuity v0.4.3 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+ github.com/docker/cli v27.2.1+incompatible // indirect
+ github.com/docker/docker v27.2.1+incompatible // indirect
+ github.com/docker/go-connections v0.5.0 // indirect
+ github.com/docker/go-units v0.5.0 // indirect
+ github.com/dsoprea/go-exif v0.0.0-20230826092837-6579e82b732d // indirect
+ github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d // indirect
+ github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 // indirect
+ github.com/dsoprea/go-jpeg-image-structure v0.0.0-20221012074422-4f3f7e934102 // indirect
+ github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
+ github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d // indirect
+ github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d // indirect
+ github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect
+ github.com/dustin/go-humanize v1.0.1 // indirect
+ github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.5 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-errors/errors v1.5.1 // indirect
+ github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/jsonreference v0.21.0 // indirect
+ github.com/go-openapi/spec v0.21.0 // indirect
+ github.com/go-openapi/swag v0.23.0 // indirect
+ github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
+ github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
+ github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
+ github.com/golang/snappy v0.0.4 // indirect
+ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
+ github.com/gorilla/css v1.0.1 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
+ github.com/invopop/jsonschema v0.13.0 // indirect
+ github.com/josharian/intern v1.0.0 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
+ github.com/leodido/go-urn v1.4.0 // indirect
+ github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
+ github.com/lestrrat-go/strftime v1.1.0 // indirect
+ github.com/magiconair/properties v1.8.7 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/moby/docker-image-spec v1.3.1 // indirect
+ github.com/moby/term v0.5.0 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/ncruces/go-strftime v0.1.9 // indirect
+ github.com/opencontainers/go-digest v1.0.0 // indirect
+ github.com/opencontainers/image-spec v1.1.0 // indirect
+ github.com/opencontainers/runc v1.1.14 // indirect
+ github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
+ github.com/pelletier/go-toml/v2 v2.2.3 // indirect
+ github.com/pkg/errors v0.9.1 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
+ github.com/sagikazarmark/locafero v0.6.0 // indirect
+ github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+ github.com/sirupsen/logrus v1.9.3 // indirect
+ github.com/sourcegraph/conc v0.3.0 // indirect
+ github.com/spf13/afero v1.11.0 // indirect
+ github.com/spf13/cast v1.7.1 // indirect
+ github.com/spf13/pflag v1.0.5 // indirect
+ github.com/spf13/viper v1.19.0 // indirect
+ github.com/subosito/gotenv v1.6.0 // indirect
+ github.com/syndtr/goleveldb v1.0.0 // indirect
+ github.com/tidwall/match v1.1.1 // indirect
+ github.com/tidwall/pretty v1.2.1 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.12 // indirect
+ github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
+ github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
+ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
+ github.com/xeipuuv/gojsonschema v1.2.0 // indirect
+ github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
+ go.uber.org/multierr v1.11.0 // indirect
+ go.uber.org/zap v1.27.0 // indirect
+ golang.org/x/arch v0.10.0 // indirect
+ golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
+ golang.org/x/net v0.56.0 // indirect
+ golang.org/x/sys v0.46.0 // indirect
+ golang.org/x/tools v0.47.0 // indirect
+ google.golang.org/protobuf v1.34.2 // indirect
+ gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
+ modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect
+ modernc.org/mathutil v1.6.0 // indirect
+ modernc.org/memory v1.8.0 // indirect
+ modernc.org/strutil v1.2.0 // indirect
+ modernc.org/token v1.1.0 // indirect
+ sigs.k8s.io/yaml v1.4.0 // indirect
+)
+
+replace lukechampine.com/uint128 v1.1.1 => github.com/aichy126/uint128 v1.1.1
+
+replace modernc.org/cc/v3 v3.40.0 => gitlab.com/cznic/cc/v3 v3.40.0
+
+replace github.com/lyft/protoc-gen-validate v0.0.13 => github.com/LinkinStars/protoc-gen-validate v0.0.0-20251030022322-3fddbbe5a0e6
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..1001f1d
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,1033 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
+dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
+gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
+gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
+github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
+github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
+github.com/LinkinStars/go-i18n/v2 v2.2.2 h1:ZfjpzbW13dv6btv3RALKZkpN9A+7K1JA//2QcNeWaxU=
+github.com/LinkinStars/go-i18n/v2 v2.2.2/go.mod h1:hLglSJ4/3M0Y7ZVcoEJI+OwqkglHCA32DdjuJJR2LbM=
+github.com/LinkinStars/protoc-gen-validate v0.0.0-20251030022322-3fddbbe5a0e6/go.mod h1:Lu7LbM9PBAPmasRqVew2kylj56Z1vH/UUM2REVkLh7k=
+github.com/Machiel/slugify v1.0.1 h1:EfWSlRWstMadsgzmiV7d0yVd2IFlagWH68Q+DcYCm4E=
+github.com/Machiel/slugify v1.0.1/go.mod h1:fTFGn5uWEynW4CUMG7sWkYXOf1UgDxyTM3DbR6Qfg3k=
+github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
+github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
+github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
+github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
+github.com/aichy126/uint128 v1.1.1/go.mod h1:Hke/MPGXUxOl0OXHoNcVesBL4N+XalHEJ9e1jaIbl8o=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/anargu/gin-brotli v0.0.0-20220116052358-12bf532d5267 h1:vDHsaEcs/Q0dwetADENtwus6W1ccaZ9h3KBTm0d2X0g=
+github.com/anargu/gin-brotli v0.0.0-20220116052358-12bf532d5267/go.mod h1:Yj3yPP/vi87JjwylUTCMyd6FrOfGqP1AHk0305hDm2o=
+github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
+github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
+github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
+github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
+github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
+github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
+github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
+github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
+github.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=
+github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
+github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
+github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
+github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
+github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
+github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
+github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8=
+github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
+github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
+github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
+github.com/docker/cli v27.2.1+incompatible h1:U5BPtiD0viUzjGAjV1p0MGB8eVA3L3cbIrnyWmSJI70=
+github.com/docker/cli v27.2.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/docker v27.2.1+incompatible h1:fQdiLfW7VLscyoeYEBz7/J8soYFDZV1u6VW6gJEjNMI=
+github.com/docker/docker v27.2.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
+github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dsoprea/go-exif v0.0.0-20190901173045-3ce78807c90f/go.mod h1:DmMpU91/Ax6BAwoRkjgRCr2rmgEgS4tsmatfV7M+U+c=
+github.com/dsoprea/go-exif v0.0.0-20230826092837-6579e82b732d h1:ygcRCGNKuEiA98k7X35hknEN8RIRUF1jrz7k1rZCvsk=
+github.com/dsoprea/go-exif v0.0.0-20230826092837-6579e82b732d/go.mod h1:lOaOt7+UEppOgyvRy749v3do836U/hw0YVJNjoyPaEs=
+github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E=
+github.com/dsoprea/go-exif/v2 v2.0.0-20200604193436-ca8584a0e1c4/go.mod h1:9EXlPeHfblFFnwu5UOqmP2eoZfJyAZ2Ri/Vki33ajO0=
+github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d h1:yeH8wrJa3+8uKKDAdURHUK1ds2UvKhMqX2MiOdVeKPs=
+github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d/go.mod h1:oKrjk2kb3rAR5NbtSTLUMvMSbc+k8ZosI3MaVH47noc=
+github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8=
+github.com/dsoprea/go-exif/v3 v3.0.0-20210512043655-120bcdb2a55e/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
+github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM=
+github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 h1:YDRiMEm32T60Kpm35YzOK9ZHgjsS1Qrid+XskNcsdp8=
+github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM=
+github.com/dsoprea/go-jpeg-image-structure v0.0.0-20190422055009-d6f9ba25cf48/go.mod h1:H1hAaFyv9cRV1ywoHvaqVoNSThBvWZ0JarRBcV+FSnE=
+github.com/dsoprea/go-jpeg-image-structure v0.0.0-20221012074422-4f3f7e934102 h1:P1dsxzctGkmG6Zf7gH2xrZhNXWP5/FuLDI7xbCGsWTo=
+github.com/dsoprea/go-jpeg-image-structure v0.0.0-20221012074422-4f3f7e934102/go.mod h1:6+tQXZ+I62x13UZ+hemLVoZIuq/usVzvau7bqwUo9P0=
+github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA=
+github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8=
+github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg=
+github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8=
+github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E=
+github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d h1:dg6UMHa50VI01WuPWXPbNJpO8QSyvIF5T5n2IZiqX3A=
+github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E=
+github.com/dsoprea/go-png-image-structure v0.0.0-20190624104353-c9b28dcdc5c8/go.mod h1:Bf0nmcDFFRQBjZwr9qY6c0zTxKQa+Q8YWZmlYxXGxY0=
+github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d h1:8+qI8ant/vZkNSsbwSjIR6XJfWcDVTg/qx/3pRUUZNA=
+github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d/go.mod h1:yTR3tKgyk20phAFg6IE9ulMA5NjEDD2wyx+okRFLVtw=
+github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8=
+github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 h1:/py11NlxDaOxkT9OKN+gXgT+QOH5xj1ZRoyusfRIlo4=
+github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349/go.mod h1:KVK+/Hul09ujXAGq+42UBgCTnXkiJZRnLYdURGjQUwo=
+github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
+github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
+github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
+github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
+github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
+github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
+github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
+github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk=
+github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
+github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
+github.com/go-resty/resty/v2 v2.17.1 h1:x3aMpHK1YM9e4va/TMDRlusDDoZiQ+ViDu/WpA6xTM4=
+github.com/go-resty/resty/v2 v2.17.1/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w=
+github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
+github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U=
+github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
+github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
+github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang/geo v0.0.0-20190812012225-f41920e961ce/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
+github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
+github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
+github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I=
+github.com/golang/geo v0.0.0-20230421003525-6adc56603217/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
+github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
+github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
+github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
+github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=
+github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
+github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
+github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
+github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
+github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
+github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk=
+github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
+github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
+github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
+github.com/jackc/pgconn v1.8.1/go.mod h1:JV6m6b6jhjdmzchES0drzCcYcAHS1OPD5xu3OZ/lE2g=
+github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
+github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
+github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
+github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
+github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
+github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
+github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0=
+github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po=
+github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ=
+github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE=
+github.com/jackc/pgtype v1.8.0/go.mod h1:PqDKcEBtllAtk/2p6z6SHdXW5UB+MhE75tUol2OKexE=
+github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
+github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
+github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
+github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA=
+github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o=
+github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg=
+github.com/jackc/pgx/v4 v4.11.0/go.mod h1:i62xJgdrtVDsnL3U8ekyrQXEwGNTRoG7/8r+CIdYfcc=
+github.com/jackc/pgx/v4 v4.12.0/go.mod h1:fE547h6VulLPA3kySjfnSG/e2D861g/50JlVUa/ub60=
+github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
+github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
+github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
+github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
+github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
+github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
+github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
+github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
+github.com/lestrrat-go/strftime v1.1.0 h1:gMESpZy44/4pXLO/m+sL0yBd1W6LjgjrrD4a68Gapyg=
+github.com/lestrrat-go/strftime v1.1.0/go.mod h1:uzeIB52CeUJenCo1syghlugshMysrqUT51HlxphXVeI=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mark3labs/mcp-go v0.43.2 h1:21PUSlWWiSbUPQwXIJ5WKlETixpFpq+WBpbMGDSVy/I=
+github.com/mark3labs/mcp-go v0.43.2/go.mod h1:YnJfOL382MIWDx1kMY+2zsRHU/q78dBg9aFb8W6Thdw=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA=
+github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
+github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
+github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
+github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ=
+github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
+github.com/mozillazg/go-unidecode v0.2.0 h1:vFGEzAH9KSwyWmXCOblazEWDh7fOkpmy/Z4ArmamSUc=
+github.com/mozillazg/go-unidecode v0.2.0/go.mod h1:zB48+/Z5toiRolOZy9ksLryJ976VIwmDmpQ2quyt1aA=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
+github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
+github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
+github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
+github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
+github.com/opencontainers/runc v1.1.14 h1:rgSuzbmgz5DUJjeSnw337TxDbRuqjs6iqQck/2weR6w=
+github.com/opencontainers/runc v1.1.14/go.mod h1:E4C2z+7BxR7GHXp0hAY53mek+x49X1LjPNeMTfRGvOA=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/ory/dockertest/v3 v3.11.0 h1:OiHcxKAvSDUwsEVh2BjxQQc/5EHz9n0va9awCtNGuyA=
+github.com/ory/dockertest/v3 v3.11.0/go.mod h1:VIPxS1gwT9NpPOrfD3rACs8Y9Z7yhzO4SB194iUDnUI=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
+github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
+github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk=
+github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
+github.com/sashabaranov/go-openai v1.41.2 h1:vfPRBZNMpnqu8ELsclWcAvF19lDNgh1t6TVfFFOPiSM=
+github.com/sashabaranov/go-openai v1.41.2/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/scottleedavis/go-exif-remove v0.0.0-20230314195146-7e059d593405 h1:2ieGkj4z/YPXVyQ2ayZUg3GwE1pYWd5f1RB6DzAOXKM=
+github.com/scottleedavis/go-exif-remove v0.0.0-20230314195146-7e059d593405/go.mod h1:rIxVzVLKlBwLxO+lC+k/I4HJfRQcemg/f/76Xmmzsec=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/segmentfault/pacman v1.0.5-0.20230822083413-c0075a2d401f h1:9f2Bjf6bdMvNyUop32wAGJCdp+Jdm/d6nKBYvFvkRo0=
+github.com/segmentfault/pacman v1.0.5-0.20230822083413-c0075a2d401f/go.mod h1:5lNp5REd8QMThmBUvR3Fi9Y3AsOB4GRq7soCB4QLqOs=
+github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20230822083413-c0075a2d401f h1:1KHe0uN6p798E7XJZPhZkgm/hXk5CTjisCvFMqaZSKI=
+github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20230822083413-c0075a2d401f/go.mod h1:rmf1TCwz67dyM+AmTwSd1BxTo2AOYHj262lP93bOZbs=
+github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20230822083413-c0075a2d401f h1:/nA4C3UfWw+3XYVBkgVMY1p3nX3uhl22hL2LW3FNcVs=
+github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20230822083413-c0075a2d401f/go.mod h1:prPjFam7MyZ5b3S9dcDOt2tMPz6kf7C9c243s9zSwPY=
+github.com/segmentfault/pacman/contrib/i18n v0.0.0-20230822083413-c0075a2d401f h1:xia6AXJor4UV4T6htmHlfN7CGXZ04vlWwybVtFKJ/mA=
+github.com/segmentfault/pacman/contrib/i18n v0.0.0-20230822083413-c0075a2d401f/go.mod h1:7QcRmnV7OYq4hNOOCWXT5HXnN/u756JUsqIW0Bw8n9E=
+github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20230822083413-c0075a2d401f h1:0mrzVRrQ+mz5MWQSdC1y6dwKWiewYKkpRDqNf3nOhmk=
+github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20230822083413-c0075a2d401f/go.mod h1:L4GqtXLoR73obTYqUQIzfkm8NG8pvZafxFb6KZFSSHk=
+github.com/segmentfault/pacman/contrib/server/http v0.0.0-20230822083413-c0075a2d401f h1:2gjiRmSj3J/F3A1A22UU1BzO4gQypEZx/4D7c7Ue4Ag=
+github.com/segmentfault/pacman/contrib/server/http v0.0.0-20230822083413-c0075a2d401f/go.mod h1:UjNiOFYv1uGCq1ZCcONaKq4eE7MW3nbgpLqgl8f9N40=
+github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
+github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
+github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
+github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
+github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
+github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
+github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
+github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
+github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
+github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=
+github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
+github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
+github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
+github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
+github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
+github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
+github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
+github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
+github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg=
+github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
+github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
+github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
+go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/arch v0.10.0 h1:S3huipmSclq3PJMNe76NGwkBR504WFkQ5dhzWzP8ZW8=
+golang.org/x/arch v0.10.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
+golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
+golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
+golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw=
+golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ=
+golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
+golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus=
+golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=
+golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=
+golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
+gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.34.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.4/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.5/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.8/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.10/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60=
+modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw=
+modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI=
+modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag=
+modernc.org/ccgo/v3 v3.11.3/go.mod h1:0oHunRBMBiXOKdaglfMlRPBALQqsfrCKXgw9okQ3GEw=
+modernc.org/ccgo/v3 v3.12.4/go.mod h1:Bk+m6m2tsooJchP/Yk5ji56cClmN6R1cqc9o/YtbgBQ=
+modernc.org/ccgo/v3 v3.12.6/go.mod h1:0Ji3ruvpFPpz+yu+1m0wk68pdr/LENABhTrDkMDWH6c=
+modernc.org/ccgo/v3 v3.12.8/go.mod h1:Hq9keM4ZfjCDuDXxaHptpv9N24JhgBZmUG5q60iLgUo=
+modernc.org/ccgo/v3 v3.12.11/go.mod h1:0jVcmyDwDKDGWbcrzQ+xwJjbhZruHtouiBEvDfoIsdg=
+modernc.org/ccgo/v3 v3.12.14/go.mod h1:GhTu1k0YCpJSuWwtRAEHAol5W7g1/RRfS4/9hc9vF5I=
+modernc.org/ccgo/v3 v3.12.18/go.mod h1:jvg/xVdWWmZACSgOiAhpWpwHWylbJaSzayCqNOJKIhs=
+modernc.org/ccgo/v3 v3.12.20/go.mod h1:aKEdssiu7gVgSy/jjMastnv/q6wWGRbszbheXgWRHc8=
+modernc.org/ccgo/v3 v3.12.21/go.mod h1:ydgg2tEprnyMn159ZO/N4pLBqpL7NOkJ88GT5zNU2dE=
+modernc.org/ccgo/v3 v3.12.22/go.mod h1:nyDVFMmMWhMsgQw+5JH6B6o4MnZ+UQNw1pp52XYFPRk=
+modernc.org/ccgo/v3 v3.12.25/go.mod h1:UaLyWI26TwyIT4+ZFNjkyTbsPsY3plAEB6E7L/vZV3w=
+modernc.org/ccgo/v3 v3.12.29/go.mod h1:FXVjG7YLf9FetsS2OOYcwNhcdOLGt8S9bQ48+OP75cE=
+modernc.org/ccgo/v3 v3.12.36/go.mod h1:uP3/Fiezp/Ga8onfvMLpREq+KUjUmYMxXPO8tETHtA8=
+modernc.org/ccgo/v3 v3.12.38/go.mod h1:93O0G7baRST1vNj4wnZ49b1kLxt0xCW5Hsa2qRaZPqc=
+modernc.org/ccgo/v3 v3.12.43/go.mod h1:k+DqGXd3o7W+inNujK15S5ZYuPoWYLpF5PYougCmthU=
+modernc.org/ccgo/v3 v3.12.46/go.mod h1:UZe6EvMSqOxaJ4sznY7b23/k13R8XNlyWsO5bAmSgOE=
+modernc.org/ccgo/v3 v3.12.47/go.mod h1:m8d6p0zNps187fhBwzY/ii6gxfjob1VxWb919Nk1HUk=
+modernc.org/ccgo/v3 v3.12.50/go.mod h1:bu9YIwtg+HXQxBhsRDE+cJjQRuINuT9PUK4orOco/JI=
+modernc.org/ccgo/v3 v3.12.51/go.mod h1:gaIIlx4YpmGO2bLye04/yeblmvWEmE4BBBls4aJXFiE=
+modernc.org/ccgo/v3 v3.12.53/go.mod h1:8xWGGTFkdFEWBEsUmi+DBjwu/WLy3SSOrqEmKUjMeEg=
+modernc.org/ccgo/v3 v3.12.54/go.mod h1:yANKFTm9llTFVX1FqNKHE0aMcQb1fuPJx6p8AcUx+74=
+modernc.org/ccgo/v3 v3.12.55/go.mod h1:rsXiIyJi9psOwiBkplOaHye5L4MOOaCjHg1Fxkj7IeU=
+modernc.org/ccgo/v3 v3.12.56/go.mod h1:ljeFks3faDseCkr60JMpeDb2GSO3TKAmrzm7q9YOcMU=
+modernc.org/ccgo/v3 v3.12.57/go.mod h1:hNSF4DNVgBl8wYHpMvPqQWDQx8luqxDnNGCMM4NFNMc=
+modernc.org/ccgo/v3 v3.12.60/go.mod h1:k/Nn0zdO1xHVWjPYVshDeWKqbRWIfif5dtsIOCUVMqM=
+modernc.org/ccgo/v3 v3.12.65/go.mod h1:D6hQtKxPNZiY6wDBtehSGKFKmyXn53F8nGTpH+POmS4=
+modernc.org/ccgo/v3 v3.12.66/go.mod h1:jUuxlCFZTUZLMV08s7B1ekHX5+LIAurKTTaugUr/EhQ=
+modernc.org/ccgo/v3 v3.12.67/go.mod h1:Bll3KwKvGROizP2Xj17GEGOTrlvB1XcVaBrC90ORO84=
+modernc.org/ccgo/v3 v3.12.73/go.mod h1:hngkB+nUUqzOf3iqsM48Gf1FZhY599qzVg1iX+BT3cQ=
+modernc.org/ccgo/v3 v3.12.81/go.mod h1:p2A1duHoBBg1mFtYvnhAnQyI6vL0uw5PGYLSIgF6rYY=
+modernc.org/ccgo/v3 v3.12.82/go.mod h1:ApbflUfa5BKadjHynCficldU1ghjen84tuM5jRynB7w=
+modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
+modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
+modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M=
+modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
+modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
+modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w=
+modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q=
+modernc.org/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg=
+modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M=
+modernc.org/libc v1.11.5/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU=
+modernc.org/libc v1.11.6/go.mod h1:ddqmzR6p5i4jIGK1d/EiSw97LBcE3dK24QEwCFvgNgE=
+modernc.org/libc v1.11.11/go.mod h1:lXEp9QOOk4qAYOtL3BmMve99S5Owz7Qyowzvg6LiZso=
+modernc.org/libc v1.11.13/go.mod h1:ZYawJWlXIzXy2Pzghaf7YfM8OKacP3eZQI81PDLFdY8=
+modernc.org/libc v1.11.16/go.mod h1:+DJquzYi+DMRUtWI1YNxrlQO6TcA5+dRRiq8HWBWRC8=
+modernc.org/libc v1.11.19/go.mod h1:e0dgEame6mkydy19KKaVPBeEnyJB4LGNb0bBH1EtQ3I=
+modernc.org/libc v1.11.24/go.mod h1:FOSzE0UwookyT1TtCJrRkvsOrX2k38HoInhw+cSCUGk=
+modernc.org/libc v1.11.26/go.mod h1:SFjnYi9OSd2W7f4ct622o/PAYqk7KHv6GS8NZULIjKY=
+modernc.org/libc v1.11.27/go.mod h1:zmWm6kcFXt/jpzeCgfvUNswM0qke8qVwxqZrnddlDiE=
+modernc.org/libc v1.11.28/go.mod h1:Ii4V0fTFcbq3qrv3CNn+OGHAvzqMBvC7dBNyC4vHZlg=
+modernc.org/libc v1.11.31/go.mod h1:FpBncUkEAtopRNJj8aRo29qUiyx5AvAlAxzlx9GNaVM=
+modernc.org/libc v1.11.34/go.mod h1:+Tzc4hnb1iaX/SKAutJmfzES6awxfU1BPvrrJO0pYLg=
+modernc.org/libc v1.11.37/go.mod h1:dCQebOwoO1046yTrfUE5nX1f3YpGZQKNcITUYWlrAWo=
+modernc.org/libc v1.11.39/go.mod h1:mV8lJMo2S5A31uD0k1cMu7vrJbSA3J3waQJxpV4iqx8=
+modernc.org/libc v1.11.42/go.mod h1:yzrLDU+sSjLE+D4bIhS7q1L5UwXDOw99PLSX0BlZvSQ=
+modernc.org/libc v1.11.44/go.mod h1:KFq33jsma7F5WXiYelU8quMJasCCTnHK0mkri4yPHgA=
+modernc.org/libc v1.11.45/go.mod h1:Y192orvfVQQYFzCNsn+Xt0Hxt4DiO4USpLNXBlXg/tM=
+modernc.org/libc v1.11.47/go.mod h1:tPkE4PzCTW27E6AIKIR5IwHAQKCAtudEIeAV1/SiyBg=
+modernc.org/libc v1.11.49/go.mod h1:9JrJuK5WTtoTWIFQ7QjX2Mb/bagYdZdscI3xrvHbXjE=
+modernc.org/libc v1.11.51/go.mod h1:R9I8u9TS+meaWLdbfQhq2kFknTW0O3aw3kEMqDDxMaM=
+modernc.org/libc v1.11.53/go.mod h1:5ip5vWYPAoMulkQ5XlSJTy12Sz5U6blOQiYasilVPsU=
+modernc.org/libc v1.11.54/go.mod h1:S/FVnskbzVUrjfBqlGFIPA5m7UwB3n9fojHhCNfSsnw=
+modernc.org/libc v1.11.55/go.mod h1:j2A5YBRm6HjNkoSs/fzZrSxCuwWqcMYTDPLNx0URn3M=
+modernc.org/libc v1.11.56/go.mod h1:pakHkg5JdMLt2OgRadpPOTnyRXm/uzu+Yyg/LSLdi18=
+modernc.org/libc v1.11.58/go.mod h1:ns94Rxv0OWyoQrDqMFfWwka2BcaF6/61CqJRK9LP7S8=
+modernc.org/libc v1.11.70/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw=
+modernc.org/libc v1.11.71/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw=
+modernc.org/libc v1.11.75/go.mod h1:dGRVugT6edz361wmD9gk6ax1AbDSe0x5vji0dGJiPT0=
+modernc.org/libc v1.11.82/go.mod h1:NF+Ek1BOl2jeC7lw3a7Jj5PWyHPwWD4aq3wVKxqV1fI=
+modernc.org/libc v1.11.86/go.mod h1:ePuYgoQLmvxdNT06RpGnaDKJmDNEkV7ZPKI2jnsvZoE=
+modernc.org/libc v1.11.87/go.mod h1:Qvd5iXTeLhI5PS0XSyqMY99282y+3euapQFxM7jYnpY=
+modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
+modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
+modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc=
+modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM=
+modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
+modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
+modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/sqlite v1.14.2/go.mod h1:yqfn85u8wVOE6ub5UT8VI9JjhrwBUUCNyTACN0h6Sx8=
+modernc.org/sqlite v1.33.0 h1:WWkA/T2G17okiLGgKAj4/RMIvgyMT19yQ038160IeYk=
+modernc.org/sqlite v1.33.0/go.mod h1:9uQ9hF/pCZoYZK73D/ud5Z7cIRIILSZI8NdIemVMTX8=
+modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
+modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
+modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
+modernc.org/tcl v1.8.13/go.mod h1:V+q/Ef0IJaNUSECieLU4o+8IScapxnMyFV6i/7uQlAY=
+modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/z v1.2.19/go.mod h1:+ZpP0pc4zz97eukOzW3xagV/lS82IpPN9NGG5pNF9vY=
+nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
+sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
+xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
+xorm.io/builder v0.3.13 h1:a3jmiVVL19psGeXx8GIurTp7p0IIgqeDmwhcR6BAOAo=
+xorm.io/builder v0.3.13/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
+xorm.io/xorm v1.3.2 h1:uTRRKF2jYzbZ5nsofXVUx6ncMaek+SHjWYtCXyZo1oM=
+xorm.io/xorm v1.3.2/go.mod h1:9NbjqdnjX6eyjRRhh01GHm64r6N9shTb/8Ak3YRt8Nw=
diff --git a/i18n/af_ZA.yaml b/i18n/af_ZA.yaml
new file mode 100644
index 0000000..0121bde
--- /dev/null
+++ b/i18n/af_ZA.yaml
@@ -0,0 +1,1384 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: Success.
+ unknown:
+ other: Unknown error.
+ request_format_error:
+ other: Request format is not valid.
+ unauthorized_error:
+ other: Unauthorized.
+ database_error:
+ other: Data server error.
+ role:
+ name:
+ user:
+ other: User
+ admin:
+ other: Admin
+ moderator:
+ other: Moderator
+ description:
+ user:
+ other: Default with no special access.
+ admin:
+ other: Have the full power to access the site.
+ moderator:
+ other: Has access to all posts except admin settings.
+ email:
+ other: Email
+ password:
+ other: Password
+ email_or_password_wrong_error:
+ other: Email and password do not match.
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: Answer do not found.
+ cannot_deleted:
+ other: No permission to delete.
+ cannot_update:
+ other: No permission to update.
+ comment:
+ edit_without_permission:
+ other: Comment are not allowed to edit.
+ not_found:
+ other: Comment not found.
+ cannot_edit_after_deadline:
+ other: The comment time has been too long to modify.
+ email:
+ duplicate:
+ other: Email already exists.
+ need_to_be_verified:
+ other: Email should be verified.
+ verify_url_expired:
+ other: Email verified URL has expired, please resend the email.
+ lang:
+ not_found:
+ other: Language file not found.
+ object:
+ captcha_verification_failed:
+ other: Captcha wrong.
+ disallow_follow:
+ other: You are not allowed to follow.
+ disallow_vote:
+ other: You are not allowed to vote.
+ disallow_vote_your_self:
+ other: You can't vote for your own post.
+ not_found:
+ other: Object not found.
+ verification_failed:
+ other: Verification failed.
+ email_or_password_incorrect:
+ other: Email and password do not match.
+ old_password_verification_failed:
+ other: The old password verification failed
+ new_password_same_as_previous_setting:
+ other: The new password is the same as the previous one.
+ question:
+ not_found:
+ other: Question not found.
+ cannot_deleted:
+ other: No permission to delete.
+ cannot_close:
+ other: No permission to close.
+ cannot_update:
+ other: No permission to update.
+ rank:
+ fail_to_meet_the_condition:
+ other: Rank fail to meet the condition.
+ report:
+ handle_failed:
+ other: Report handle failed.
+ not_found:
+ other: Report not found.
+ tag:
+ not_found:
+ other: Tag not found.
+ recommend_tag_not_found:
+ other: Recommend Tag is not exist.
+ recommend_tag_enter:
+ other: Please enter at least one required tag.
+ not_contain_synonym_tags:
+ other: Should not contain synonym tags.
+ cannot_update:
+ other: No permission to update.
+ cannot_set_synonym_as_itself:
+ other: You cannot set the synonym of the current tag as itself.
+ smtp:
+ config_from_name_cannot_be_email:
+ other: The From Name cannot be a email address.
+ theme:
+ not_found:
+ other: Theme not found.
+ revision:
+ review_underway:
+ other: Can't edit currently, there is a version in the review queue.
+ no_permission:
+ other: No permission to Revision.
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: User not found.
+ suspended:
+ other: User has been suspended.
+ username_invalid:
+ other: Username is invalid.
+ username_duplicate:
+ other: Username is already in use.
+ set_avatar:
+ other: Avatar set failed.
+ cannot_update_your_role:
+ other: You cannot modify your role.
+ not_allowed_registration:
+ other: Currently the site is not open for registration
+ config:
+ read_config_failed:
+ other: Read config failed
+ database:
+ connection_failed:
+ other: Database connection failed
+ create_table_failed:
+ other: Create table failed
+ install:
+ create_config_failed:
+ other: Can't create the config.yaml file.
+ upload:
+ unsupported_file_format:
+ other: Unsupported file format.
+ report:
+ spam:
+ name:
+ other: spam
+ desc:
+ other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
+ rude:
+ name:
+ other: rude or abusive
+ desc:
+ other: A reasonable person would find this content inappropriate for respectful discourse.
+ duplicate:
+ name:
+ other: a duplicate
+ desc:
+ other: This question has been asked before and already has an answer.
+ not_answer:
+ name:
+ other: not an answer
+ desc:
+ other: This was posted as an answer, but it does not attempt to answer the question. It should possibly be an edit, a comment, another question, or deleted altogether.
+ not_need:
+ name:
+ other: no longer needed
+ desc:
+ other: This comment is outdated, conversational or not relevant to this post.
+ other:
+ name:
+ other: something else
+ desc:
+ other: This post requires staff attention for another reason not listed above.
+ question:
+ close:
+ duplicate:
+ name:
+ other: spam
+ desc:
+ other: This question has been asked before and already has an answer.
+ guideline:
+ name:
+ other: a community-specific reason
+ desc:
+ other: This question doesn't meet a community guideline.
+ multiple:
+ name:
+ other: needs details or clarity
+ desc:
+ other: This question currently includes multiple questions in one. It should focus on one problem only.
+ other:
+ name:
+ other: something else
+ desc:
+ other: This post requires another reason not listed above.
+ operation_type:
+ asked:
+ other: asked
+ answered:
+ other: answered
+ modified:
+ other: modified
+ notification:
+ action:
+ update_question:
+ other: updated question
+ answer_the_question:
+ other: answered question
+ update_answer:
+ other: updated answer
+ accept_answer:
+ other: accepted answer
+ comment_question:
+ other: commented question
+ comment_answer:
+ other: commented answer
+ reply_to_you:
+ other: replied to you
+ mention_you:
+ other: mentioned you
+ your_question_is_closed:
+ other: Your question has been closed
+ your_question_was_deleted:
+ other: Your question has been deleted
+ your_answer_was_deleted:
+ other: Your answer has been deleted
+ your_comment_was_deleted:
+ other: Your comment has been deleted
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4 MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: URL slug up to 35 characters.
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+ <https://url.com>
[Title](https://url.com)> at start of line`like _this_`````
code here
```
Made with love © {{cc}}.
+ upload_img:
+ name: Change
+ loading: loading...
+ pic_auth_code:
+ title: Captcha
+ placeholder: Type the text above
+ msg:
+ empty: Captcha cannot be empty.
+ inactive:
+ first: >-
+ You're almost done! We sent an activation mail to
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comments + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + feedback: + characters: content must be at least 6 characters in length. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + characters: content must be at least 6 characters in length. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comment + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comment + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comment + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comment + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comment + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ content2: Are you sure you wish to delete? + close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + form: + fields: + revision: + label: Revision + display_name: + label: Display Name + slug_name: + label: URL Slug + info: URL slug up to 35 characters. + desc: + label: Description + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: Show more comments + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + edit_answer: + title: Edit Answer + default_reason: Edit answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + feedback: + characters: content must be at least 6 characters in length. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit Summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: "Describe what your question is about, at least one tag is required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + search: + placeholder: Search + footer: + build_on: >- + Built on <1> Answer 1>- the open-source software that powers Q&A communities.Are you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + characters: content must be at least 6 characters in length. + reopen: + title: Reopen this post + content: Are you sure you want to reopen? + success: This post has been reopened + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_question_deleted: This post has been deleted + tip_answer_deleted: This answer has been deleted + btns: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.{{.AnswerSummary}}
I think you may know the answer.
{{.CommentSummary}}
mention a post: #post_id
to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ tip_with_synonyms: >- +We do not allow deleting tag with synonyms.
Please remove the synonyms from this tag first.
+ tip: Are you sure you wish to delete? + close: Close + merge: + title: Merge tag + source_tag_title: Source tag + source_tag_description: The source tag and its associated data will be remapped to the target tag. + target_tag_title: Target tag + target_tag_description: A synonym between these two tags will be created after merging. + no_results: No tags matched + btn_submit: Submit + btn_close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + default_first_reason: Add tag + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + hours: hours + days: days + month: month + months: months + year: year + reaction: + heart: heart + smile: smile + frown: frown + btn_label: add or remove reactions + undo_emoji: undo {{ emoji }} reaction + react_emoji: react with {{ emoji }} + unreact_emoji: unreact with {{ emoji }} + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: "{{count}} more comments" + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + tip_vote: It adds something useful to the post + edit_answer: + title: Edit Answer + default_reason: Edit answer + default_first_reason: Add answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + feedback: + characters: content must be at least 6 characters in length. + edit_summary: + label: Edit summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + sort_buttons: + popular: Popular + name: Name + newest: Newest + button_follow: Follow + button_following: Following + tag_label: questions + search_placeholder: Filter by tag name + no_desc: The tag has no description. + more: More + wiki: Wiki + ask: + title: Create Question + edit_title: Edit Question + default_reason: Edit question + default_first_reason: Create question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: What's your topic? Be specific. + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + hint: + optional_body: Describe what the question is about. + minimum_characters: "Describe what the question is about, at least {{min_content_length}} characters are required." + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be empty. + edit_summary: + label: Edit summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_post_question: Post your question + btn_save_edits: Save edits + answer_question: Answer your own question + post_question&answer: Post your question and answer + tag_selector: + add_btn: Add tag + create_btn: Create new tag + search_tag: Search tag + hint: Describe what your content is about, at least one tag is required. + hint_zero_tags: Describe what your content is about. + hint_more_than_one_tag: "Describe what your content is about, at least {{min_tags_number}} tags are required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + badges: Badges + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + bookmark: Bookmarks + moderation: Moderation + search: + placeholder: Search + footer: + build_on: Powered by <1> Apache Answer 1> + upload_img: + name: Change + loading: loading... + pic_auth_code: + title: Captcha + placeholder: Type the text above + msg: + empty: Captcha cannot be empty. + inactive: + first: >- + You're almost done! We sent an activation mail toAre you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + characters: content must be at least 6 characters in length. + tips: + header_1: Thanks for your answer + li1_1: Please be sure to answer the question. Provide details and share your research. + li1_2: Back up any statements you make with references or personal experience. + header_2: But avoid ... + li2_1: Asking for help, seeking clarification, or responding to other answers. + reopen: + confirm_btn: Reopen + title: Reopen this post + content: Are you sure you want to reopen? + list: + confirm_btn: List + title: List this post + content: Are you sure you want to list? + unlist: + confirm_btn: Unlist + title: Unlist this post + content: Are you sure you want to unlist? + pin: + title: Pin this post + content: Are you sure you wish to pinned globally? This post will appear at the top of all post lists. + confirm_btn: Pin + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_answer_deleted: This answer has been deleted + undelete_title: Undelete this post + undelete_desc: Are you sure you wish to undelete? + btns: + confirm: Confirm + cancel: Cancel + edit: Edit + save: Save + delete: Delete + undelete: Undelete + list: List + unlist: Unlist + unlisted: Unlisted + login: Log in + signup: Sign up + logout: Log out + verify: Verify + create: Create + approve: Approve + reject: Reject + skip: Skip + discard_draft: Discard draft + pinned: Pinned + all: All + question: Question + answer: Answer + comment: Comment + refresh: Refresh + resend: Resend + deactivate: Deactivate + active: Active + suspend: Suspend + unsuspend: Unsuspend + close: Close + reopen: Reopen + ok: OK + light: Light + dark: Dark + system_setting: System setting + default: Default + reset: Reset + tag: Tag + post_lowercase: post + filter: Filter + ignore: Ignore + submit: Submit + normal: Normal + closed: Closed + deleted: Deleted + deleted_permanently: Deleted permanently + pending: Pending + more: More + view: View + card: Card + compact: Compact + display_below: Display below + always_display: Always display + or: or + back_sites: Back to sites + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + counts_loading: "... Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.{{.AnswerSummary}}
I think you may know the answer.
{{.CommentSummary}}
mention a post: #post_id
to make links
<https://url.com>
[Title](https://url.com)put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
```
code here
```We do not allow deleting tag with posts.
Please remove this tag from the posts first.
+ tip_with_synonyms: >- +We do not allow deleting tag with synonyms.
Please remove the synonyms from this tag first.
+ tip: Are you sure you wish to delete? + close: Close + merge: + title: Merge tag + source_tag_title: Source tag + source_tag_description: The source tag and its associated data will be remapped to the target tag. + target_tag_title: Target tag + target_tag_description: A synonym between these two tags will be created after merging. + no_results: No tags matched + btn_submit: Submit + btn_close: Close + edit_tag: + title: Edit Tag + default_reason: Edit tag + default_first_reason: Add tag + btn_save_edits: Save edits + btn_cancel: Cancel + dates: + long_date: MMM D + long_date_with_year: "MMM D, YYYY" + long_date_with_time: "MMM D, YYYY [at] HH:mm" + now: now + x_seconds_ago: "{{count}}s ago" + x_minutes_ago: "{{count}}m ago" + x_hours_ago: "{{count}}h ago" + hour: hour + day: day + hours: hours + days: days + month: month + months: months + year: year + reaction: + heart: heart + smile: smile + frown: frown + btn_label: add or remove reactions + undo_emoji: undo {{ emoji }} reaction + react_emoji: react with {{ emoji }} + unreact_emoji: unreact with {{ emoji }} + comment: + btn_add_comment: Add comment + reply_to: Reply to + btn_reply: Reply + btn_edit: Edit + btn_delete: Delete + btn_flag: Flag + btn_save_edits: Save edits + btn_cancel: Cancel + show_more: "{{count}} more comments" + tip_question: >- + Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + tip_answer: >- + Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + tip_vote: It adds something useful to the post + edit_answer: + title: Edit Answer + default_reason: Edit answer + default_first_reason: Add answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + feedback: + characters: content must be at least 6 characters in length. + edit_summary: + label: Edit summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Canslo + tags: + title: Tagiau + sort_buttons: + popular: Poblogaidd + name: Enw + newest: Newest + button_follow: Dilyn + button_following: Yn dilyn + tag_label: cwestiynau + search_placeholder: Hidlo yn ôl enw tag + no_desc: Nid oes gan y tag unrhyw ddisgrifiad. + more: Mwy + wiki: Wiki + ask: + title: Create Question + edit_title: Golygu Cwestiwn + default_reason: Golygu Cwestiwn + default_first_reason: Create question + similar_questions: Cwestiynau tebyg + form: + fields: + revision: + label: Diwygiad + title: + label: Teitl + placeholder: What's your topic? Be specific. + msg: + empty: Ni all teitl fod yn wag. + range: Teitl hyd at 20 nod + body: + label: Corff + msg: + empty: Ni all corff fod yn wag. + hint: + optional_body: Describe what the question is about. + minimum_characters: "Describe what the question is about, at least {{min_content_length}} characters are required." + tags: + label: Tagiau + msg: + empty: Ni all tagiau fod yn wag. + answer: + label: Ateb + msg: + empty: Ni all ateb fod yn wag. + edit_summary: + label: Edit summary + placeholder: >- + Eglurwch yn fyr eich newidiadau (sillafu wedi'i gywiro, gramadeg sefydlog, fformatio gwell) + btn_post_question: Post cweistiwn + btn_save_edits: Cadw golygiadau + answer_question: Atebwch eich cwestiwn eich hun + post_question&answer: Postiwch eich cwestiwn ac ateb + tag_selector: + add_btn: Ychwanegu tag + create_btn: Creu tag newydd + search_tag: Chwilio tag + hint: Describe what your content is about, at least one tag is required. + hint_zero_tags: Describe what your content is about. + hint_more_than_one_tag: "Describe what your content is about, at least {{min_tags_number}} tags are required." + no_result: No tags matched + tag_required_text: Required tag (at least one) + header: + nav: + question: Questions + tag: Tags + user: Users + badges: Badges + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + bookmark: Bookmarks + moderation: Moderation + search: + placeholder: Search + footer: + build_on: Powered by <1> Apache Answer 1> + upload_img: + name: Change + loading: loading... + pic_auth_code: + title: Captcha + placeholder: Type the text above + msg: + empty: Captcha cannot be empty. + inactive: + first: >- + You're almost done! We sent an activation mail toAre you sure you want to add another answer?
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty. + characters: content must be at least 6 characters in length. + tips: + header_1: Thanks for your answer + li1_1: Please be sure to answer the question. Provide details and share your research. + li1_2: Back up any statements you make with references or personal experience. + header_2: But avoid ... + li2_1: Asking for help, seeking clarification, or responding to other answers. + reopen: + confirm_btn: Reopen + title: Reopen this post + content: Are you sure you want to reopen? + list: + confirm_btn: List + title: List this post + content: Are you sure you want to list? + unlist: + confirm_btn: Unlist + title: Unlist this post + content: Are you sure you want to unlist? + pin: + title: Pin this post + content: Are you sure you wish to pinned globally? This post will appear at the top of all post lists. + confirm_btn: Pin + delete: + title: Delete this post + question: >- + We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + answer_accepted: >- +
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? + other: Are you sure you wish to delete? + tip_answer_deleted: This answer has been deleted + undelete_title: Undelete this post + undelete_desc: Are you sure you wish to undelete? + btns: + confirm: Confirm + cancel: Cancel + edit: Edit + save: Save + delete: Delete + undelete: Undelete + list: List + unlist: Unlist + unlisted: Unlisted + login: Log in + signup: Sign up + logout: Log out + verify: Verify + create: Create + approve: Approve + reject: Reject + skip: Skip + discard_draft: Discard draft + pinned: Pinned + all: All + question: Question + answer: Answer + comment: Comment + refresh: Refresh + resend: Resend + deactivate: Deactivate + active: Active + suspend: Suspend + unsuspend: Unsuspend + close: Close + reopen: Reopen + ok: OK + light: Light + dark: Dark + system_setting: System setting + default: Default + reset: Reset + tag: Tag + post_lowercase: post + filter: Filter + ignore: Ignore + submit: Submit + normal: Normal + closed: Closed + deleted: Deleted + deleted_permanently: Deleted permanently + pending: Pending + more: More + view: View + card: Card + compact: Compact + display_below: Display below + always_display: Always display + or: or + back_sites: Back to sites + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + counts_loading: "... Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag]1> search with a tag" + user: "<1>user:username1> search by author" + answer: "<1>answers:01> unanswered questions" + score: "<1>score:31> posts with a 3+ score" + question: "<1>is:question1> search questions" + is_answer: "<1>is:answer1> search answers" + empty: We couldn't find anything.{{.AnswerSummary}}
Jeg tror du måske kender svaret.
{{.CommentSummary}}
for at lave links
<https://url.com>
[Titel](https://url.com)indsæt linieskift mellem paragraffer
_kursiv_ or **fed**
indskyd kode med 4 mellemrum
citér ved at placere > på starten af linie
backtick escapes `som _dette_`
create code fences with backticks `
```
code here
```Vi tillader ikke at slette nøgleord med opslag.
Fjern venligst dette nøgleord fra opslagene først.
+ tip_with_synonyms: >- +Vi tillader ikke at slette tag med indlæg.
Fjern venligst dette tag fra indlæggene først.
+ tip: Er du sikker på, at du vil slette? + close: Luk + merge: + title: Sammenflet nøgleord + source_tag_title: Kilde nøgleord + source_tag_description: Kildenøgleordet og dets tilknyttede data vil blive omlagt til målmærket. + target_tag_title: Målnøgleord + target_tag_description: Et synonym mellem disse to nøgleord vil blive oprettet efter sammenlægning. + no_results: Ingen nøgleord matchede + btn_submit: Indsend + btn_close: Luk + edit_tag: + title: Rediger nøgleord + default_reason: Rediger nøgleord + default_first_reason: Tilføj nøgleord + btn_save_edits: Gem ændringer + btn_cancel: Annuller + dates: + long_date: MMM D + long_date_with_year: "D MMMM, YYYY" + long_date_with_time: "MMM D, YYYY [kl.] HH:mm" + now: nu + x_seconds_ago: "{{count}}s siden" + x_minutes_ago: "{{count}}s siden" + x_hours_ago: "{{count}}t siden" + hour: time + day: dag + hours: timer + days: dag + month: måned + months: måneder + year: År + reaction: + heart: hjerte + smile: smil + frown: rynke panden + btn_label: tilføj eller fjern reaktioner + undo_emoji: fortryd {{ emoji }} reaktion + react_emoji: reager med {{ emoji }} + unreact_emoji: ikke reager med {{ emoji }} + comment: + btn_add_comment: Tilføj kommentar + reply_to: Svar til + btn_reply: Svar + btn_edit: Rediger + btn_delete: Slet + btn_flag: Anmeld + btn_save_edits: Gem ændringer + btn_cancel: Annuller + show_more: "{{count}} flere kommentarer" + tip_question: >- + Brug kommentarer til at bede om mere information eller foreslå forbedringer. Undgå at besvare spørgsmål i kommentarer. + tip_answer: >- + Brug kommentarer til at svare andre brugere eller give dem besked om ændringer. Hvis du tilføjer nye oplysninger, skal du redigere dit indlæg i stedet for at kommentere. + tip_vote: Det tilføjer noget nyttigt til indlægget + edit_answer: + title: Rediger Svar + default_reason: Rediger svar + default_first_reason: Tilføj svar + form: + fields: + revision: + label: Revision + answer: + label: Svar + feedback: + characters: indhold skal være mindst 6 tegn. + edit_summary: + label: Rediger resumé + placeholder: >- + Forklar kort dine ændringer (korrigeret stavning, fast grammatik, forbedret formatering) + btn_save_edits: Gem ændringer + btn_cancel: Annuller + tags: + title: Nøgleord + sort_buttons: + popular: Populære + name: Navn + newest: Nyeste + button_follow: Følg + button_following: Følger + tag_label: spørgsmål + search_placeholder: Filtrer efter nøgleord-navn + no_desc: Nøgleord har ingen beskrivelse. + more: Mere + wiki: Info + ask: + title: Opret spørgsmål + edit_title: Rediger spørgsmål + default_reason: Rediger spørgsmål + default_first_reason: Opret spørgsmål + similar_questions: Lignende spørgsmål + form: + fields: + revision: + label: Revision + title: + label: Titel + placeholder: Hvad er dit emne? Vær specifik. + msg: + empty: Titel må ikke være tom. + range: Titel på op til 150 tegn + body: + label: Brødtekst + msg: + empty: Brødtekst skal udfyldes. + hint: + optional_body: Beskriv hvad spørgsmålet handler om. + minimum_characters: "Beskriv hvad spørgsmålet handler om, mindst {{min_content_length}} tegn er påkrævet." + tags: + label: Nøgleord + msg: + empty: Nøgleord må ikke være tom. + answer: + label: Svar + msg: + empty: Svar må ikke være tomt. + edit_summary: + label: Rediger resumé + placeholder: >- + Forklar kort dine ændringer (korrigeret stavning, fast grammatik, forbedret formatering) + btn_post_question: Indsend dit spørgsmål + btn_save_edits: Gem ændringer + answer_question: Besvar dit eget spørgsmål + post_question&answer: Send dit spørgsmål og svar + tag_selector: + add_btn: Tilføj nøgleord + create_btn: Opret et nyt nøgleord + search_tag: Søg nøgleord + hint: Beskriv hvad dit spørgsmål handler om, mindst et nøgleord er påkrævet. + hint_zero_tags: Beskriv hvad dit indhold handler om. + hint_more_than_one_tag: "Beskriv hvad dit indhold handler om, i det mindste {{min_tags_number}} nøgleord er påkrævet." + no_result: Ingen nøgleord matchede + tag_required_text: Påkrævet nøgleord (mindst én) + header: + nav: + question: Spørgsmål + tag: Nøgleord + user: Brugere + badges: Emblemer + profile: Profil + setting: Indstillinger + logout: Log Ud + admin: Administrator + review: Gennemgå + bookmark: Bogmærker + moderation: Moderering + search: + placeholder: Søg + footer: + build_on: Drevet af <1>Apache Answer1> + upload_img: + name: Skift + loading: indlæser... + pic_auth_code: + title: Captcha + placeholder: Skriv teksten ovenfor + msg: + empty: Captcha må ikke være tomt. + inactive: + first: >- + Du er næsten færdig! Vi har sendt en aktiveringsmail tilEr du sikker på, at du vil tilføje et andet svar?
Du kan i stedet bruge redigeringslinket til at forfine og forbedre dit eksisterende svar.
+ empty: Svar skal udfyldes. + characters: indhold skal være mindst 6 tegn. + tips: + header_1: Tak for dit svar + li1_1: Vær sikker på at besvare spørgsmålet. Giv oplysninger og del din forskning. + li1_2: Begrund eventuelle udsagn med referencer eller personlige erfaringer. + header_2: Men undgå... + li2_1: Spørger om hjælp, søger afklaring, eller reagerer på andre svar. + reopen: + confirm_btn: Genåbn + title: Genåbn dette indlæg + content: Er du sikker på, at du vil genåbne? + list: + confirm_btn: Liste + title: Sæt dette indlæg på listen + content: Er du sikker på du vil sætte på listen? + unlist: + confirm_btn: Fjern fra listen + title: Fjern dette indlæg fra listen + content: Er du sikker på at du vil fjerne fra listen? + pin: + title: Fastgør dette indlæg + content: Er du sikker på, at du ønsker at fastgøre globalt? Dette indlæg vises øverst på alle indlægs-lister. + confirm_btn: Fastgør + delete: + title: Slet dette indlæg + question: >- + Vi anbefaler ikke, at sletter spørgsmål med svar, fordi det fratager fremtidige læsere denne viden.Gentaget sletning af besvarede spørgsmål kan resultere i, at din konto bliver blokeret fra at spørge. Er du sikker på, at du ønsker at slette? + answer_accepted: >- +
Vi anbefaler ikke at slette accepteret svar fordi det fratager fremtidige læsere denne viden.
Gentagen sletning af accepterede svar kan resultere i, at din konto bliver blokeret fra besvarelse. Er du sikker på, at du ønsker at slette? + other: Er du sikker på, at du vil slette? + tip_answer_deleted: Dette svar er blevet slettet + undelete_title: Genopret dette indlæg + undelete_desc: Er du sikker på du ønsker at genoprette? + btns: + confirm: Bekræft + cancel: Annuller + edit: Rediger + save: Gem + delete: Slet + undelete: Genopret + list: Sæt på liste + unlist: Fjern fra liste + unlisted: Fjernet fra liste + login: Log ind + signup: Opret konto + logout: Log Ud + verify: Verificér + create: Opret + approve: Godkend + reject: Afvis + skip: Spring Over + discard_draft: Kassér udkast + pinned: Fastgjort + all: Alle + question: Spørgsmål + answer: Svar + comment: Kommentar + refresh: Genopfrisk + resend: Send igen + deactivate: Deaktiver + active: Aktiv + suspend: Suspendér + unsuspend: Ophæv suspendering + close: Luk + reopen: Genåbn + ok: Ok + light: Lys + dark: Mørk + system_setting: Systemindstilling + default: Standard + reset: Nulstil + tag: Nøgleord + post_lowercase: indlæg + filter: Filtrer + ignore: Ignorér + submit: Indsend + normal: Normal + closed: Lukket + deleted: Slettet + deleted_permanently: Slettet permanent + pending: Ventende + more: Mere + view: Vis + card: Kort + compact: Kompakt + display_below: Vis nedenfor + always_display: Vis altid + or: eller + back_sites: Tilbage til websteder + search: + title: Søgeresultater + keywords: Nøgleord + options: Muligheder + follow: Følg + following: Følger + counts: "{{count}} Resultater" + counts_loading: "... Resultater" + more: Mere + sort_btns: + relevance: Relevans + newest: Nyeste + active: Aktiv + score: Bedømmelse + more: Mere + tips: + title: Avancerede Søgetips + tag: "<1>[tag]1> søgning med et nøgleord" + user: "<1>user:username1> søgning efter forfatter" + answer: "<1>answers:01> ubesvarede spørgsmål" + score: "<1>score:31> opslag med 3+ score" + question: "<1>is:question1> søgespørgsmål" + is_answer: "<1>is:answer1> søgesvar" + empty: Vi kunne ikke finde noget.{{.AnswerSummary}}
Ich denke, Sie kennen die Antwort.
{{.CommentSummary}}
einen Beitrag erwähnen: #post_id
um Links
<https://url.com>
[Titel](https://url.com)Zwischen den Absätzen Zeilenumbrüche einfügen
_italic_ oder **fett**
Code um 4 Leerzeichen einrücken
Zitat durch Setzen von > am Anfang der Zeile
Backtick-Escapes `wie _this_`
Codeumrandungen mit Backticks `
`
Code hier
``Wir erlauben es nicht, Tags mit Beiträgenzu löschen.
Bitte entfernen Sie dieses Tag zuerst aus den Beiträgen.
+ tip_with_synonyms: >- +Wir erlauben nicht Tags mit Synonymenzu löschen.
Bitte entfernen Sie zuerst die Synonyme von diesem Schlagwort.
+ tip: Bist du sicher, dass du löschen möchtest? + close: Schließen + merge: + title: Tags zusammenführen + source_tag_title: Quell-Tag + source_tag_description: Das Quell-Tag und seine zugehörigen Daten werden dem Ziel-Tag zugeordnet. + target_tag_title: Ziel-Tag + target_tag_description: Ein Synonym zwischen diesen beiden Tags wird nach dem Zusammenführen erstellt. + no_results: Keine zusammenpassenden Tags gefunden + btn_submit: Absenden + btn_close: Schließen + edit_tag: + title: Tag bearbeiten + default_reason: Tag bearbeiten + default_first_reason: Tag hinzufügen + btn_save_edits: Änderungen speichern + btn_cancel: Abbrechen + dates: + long_date: DD. MMM + long_date_with_year: "DD. MMM YYYY" + long_date_with_time: "DD. MMM YYYY [at] HH:mm" + now: Gerade eben + x_seconds_ago: "Vor {{count}}s" + x_minutes_ago: "Vor {{count}}m" + x_hours_ago: "Vor {{count}}h" + hour: Stunde + day: tag + hours: Stunden + days: Tage + month: month + months: months + year: year + reaction: + heart: Herz + smile: Lächeln + frown: Stirnrunzeln + btn_label: Reaktionen hinzufügen oder entfernen + undo_emoji: '{{ emoji }} Reaktion rückgängig machen' + react_emoji: mit {{ emoji }} reagieren + unreact_emoji: '{{ emoji }} Reaktion entfernen' + comment: + btn_add_comment: Einen Kommentar hinzufügen + reply_to: Antwort an + btn_reply: Antwort + btn_edit: Bearbeiten + btn_delete: Löschen + btn_flag: Melden + btn_save_edits: Änderungen speichern + btn_cancel: Abbrechen + show_more: "{{count}} mehr Kommentare" + tip_question: >- + Verwende Kommentare, um nach weiteren Informationen zu fragen oder Verbesserungen vorzuschlagen. Vermeide es, Fragen in Kommentaren zu beantworten. + tip_answer: >- + Verwende Stellungsnahmen, um anderen Nutzern zu antworten oder sie über Änderungen zu informieren. Wenn du neue Informationen hinzufügst, bearbeite deinen Beitrag, anstatt zu kommentieren. + tip_vote: Es fügt dem Beitrag etwas Nützliches hinzu + edit_answer: + title: Antwort bearbeiten + default_reason: Antwort bearbeiten + default_first_reason: Antwort hinzufügen + form: + fields: + revision: + label: Version + answer: + label: Antwort + feedback: + characters: der Inhalt muss mindestens 6 Zeichen lang sein. + edit_summary: + label: Zusammenfassung bearbeiten + placeholder: >- + Erkläre kurz deine Änderungen (korrigierte Rechtschreibung, korrigierte Grammatik, verbesserte Formatierung) + btn_save_edits: Änderungen speichern + btn_cancel: Abbrechen + tags: + title: Schlagwörter + sort_buttons: + popular: Beliebt + name: Name + newest: Neueste + button_follow: Folgen + button_following: Folgend + tag_label: fragen + search_placeholder: Nach Tagnamen filtern + no_desc: Der Tag hat keine Beschreibung. + more: Mehr + wiki: Wiki + ask: + title: Create Question + edit_title: Frage bearbeiten + default_reason: Frage bearbeiten + default_first_reason: Create question + similar_questions: Ähnliche Fragen + form: + fields: + revision: + label: Version + title: + label: Titel + placeholder: What's your topic? Be specific. + msg: + empty: Der Titel darf nicht leer sein. + range: Titel bis zu 150 Zeichen + body: + label: Körper + msg: + empty: Körper darf nicht leer sein. + hint: + optional_body: Describe what the question is about. + minimum_characters: "Describe what the question is about, at least {{min_content_length}} characters are required." + tags: + label: Stichworte + msg: + empty: Tags dürfen nicht leer sein. + answer: + label: Antwort + msg: + empty: Antwort darf nicht leer sein. + edit_summary: + label: Zusammenfassung bearbeiten + placeholder: >- + Erkläre kurz deine Änderungen (korrigierte Rechtschreibung, korrigierte Grammatik, verbesserte Formatierung) + btn_post_question: Poste deine Frage + btn_save_edits: Änderungen speichern + answer_question: Eigene Frage beantworten + post_question&answer: Poste deine Frage und Antwort + tag_selector: + add_btn: Schlagwort hinzufügen + create_btn: Neuen Tag erstellen + search_tag: Tag suchen + hint: Describe what your content is about, at least one tag is required. + hint_zero_tags: Describe what your content is about. + hint_more_than_one_tag: "Describe what your content is about, at least {{min_tags_number}} tags are required." + no_result: Keine Tags gefunden + tag_required_text: Benötigter Tag (mindestens eins) + header: + nav: + question: Fragen + tag: Schlagwörter + user: Benutzer + badges: Abzeichen + profile: Profil + setting: Einstellungen + logout: Ausloggen + admin: Administrator + review: Überprüfung + bookmark: Lesezeichen + moderation: Moderation + search: + placeholder: Suchen + footer: + build_on: Powered by <1> Apache Answer 1> + upload_img: + name: Ändern + loading: wird geladen... + pic_auth_code: + title: Captcha + placeholder: Gib den Text oben ein + msg: + empty: Captcha darf nicht leer sein. + inactive: + first: >- + Du bist fast fertig! Wir haben eine Aktivierungsmail anBist du sicher, dass du eine weitere Antwort hinzufügen willst?
Du könntest stattdessen den Bearbeiten-Link verwenden, um deine existierende Antwort zu verfeinern und zu verbessern.
+ empty: Antwort darf nicht leer sein. + characters: der Inhalt muss mindestens 6 Zeichen lang sein. + tips: + header_1: Danke für deine Antwort + li1_1: Bitte stelle sicher, dass du die Frage beantwortest. Gib Details an und erzähle von deiner Recherche. + li1_2: Untermauere alle Aussagen, die du erstellst, mit Referenzen oder persönlichen Erfahrungen. + header_2: Aber vermeide... + li2_1: Bitte um Hilfe, um Klarstellung oder um Antwort auf andere Antworten. + reopen: + confirm_btn: Wieder öffnen + title: Diesen Beitrag erneut öffnen + content: Bist du sicher, dass du wieder öffnen willst? + list: + confirm_btn: Liste + title: Diesen Beitrag auflisten + content: Möchten Sie diesen Beitrag wirklich in der Liste anzeigen? + unlist: + confirm_btn: Von Liste nehmen + title: Diesen Beitrag von der Liste nehmen + content: Möchten Sie diesen Beitrag wirklich aus der Liste ausblenden? + pin: + title: Diesen Beitrag anpinnen + content: Bist du sicher, dass du den Beitrag global anheften möchtest? Dieser Beitrag wird in allen Beitragslisten ganz oben erscheinen. + confirm_btn: Anheften + delete: + title: Diesen Beitrag löschen + question: >- + Wir raten davon ab, Fragen mit Antworten zu löschen, weil dadurch zukünftigen Lesern dieses Wissen vorenthalten wird.Wiederholtes Löschen von beantworteten Fragen kann dazu führen, dass dein Konto für Fragen gesperrt wird. Bist du sicher, dass du löschen möchtest? + answer_accepted: >- +
Wir empfehlen nicht, akzeptierte Antworten zu löschen, denn dadurch wird zukünftigen Lesern dieses Wissen vorenthalten.
Das wiederholte Löschen von akzeptierten Antworten kann dazu führen, dass dein Konto für die Beantwortung gesperrt wird. Bist du sicher, dass du löschen möchtest? + other: Bist du sicher, dass du löschen möchtest? + tip_answer_deleted: Diese Antwort wurde gelöscht + undelete_title: Diesen Beitrag wiederherstellen + undelete_desc: Bist du sicher, dass du die Löschung umkehren willst? + btns: + confirm: Bestätigen + cancel: Abbrechen + edit: Bearbeiten + save: Speichern + delete: Löschen + undelete: Wiederherstellen + list: Liste + unlist: Verstecken + unlisted: Versteckt + login: Einloggen + signup: Registrieren + logout: Ausloggen + verify: Überprüfen + create: Erstellen + approve: Genehmigen + reject: Ablehnen + skip: Überspringen + discard_draft: Entwurf verwerfen + pinned: Angeheftet + all: Alle + question: Frage + answer: Antwort + comment: Kommentar + refresh: Aktualisieren + resend: Erneut senden + deactivate: Deaktivieren + active: Aktiv + suspend: Sperren + unsuspend: Entsperren + close: Schließen + reopen: Wieder öffnen + ok: Okay + light: Hell + dark: Dunkel + system_setting: System-Einstellung + default: Standard + reset: Zurücksetzen + tag: Tag + post_lowercase: post + filter: Filter + ignore: Ignorieren + submit: Absenden + normal: Normal + closed: Geschlossen + deleted: Gelöscht + deleted_permanently: Dauerhaft gelöscht + pending: Ausstehend + more: Mehr + view: Betrachten + card: Karte + compact: Kompakt + display_below: Unten anzeigen + always_display: Immer anzeigen + or: oder + back_sites: Zurück zur Website + search: + title: Suchergebnisse + keywords: Schlüsselwörter + options: Optionen + follow: Folgen + following: Folgend + counts: "{{count}} Ergebnisse" + counts_loading: "... Results" + more: Mehr + sort_btns: + relevance: Relevanz + newest: Neueste + active: Aktiv + score: Punktzahl + more: Mehr + tips: + title: Erweiterte Suchtipps + tag: "<1>[tag]1> Suche mit einem Tag" + user: "<1>user:username1> Suche nach Autor" + answer: "<1>Antworten:01> unbeantwortete Fragen" + score: "<1>score:31> Beiträge mit einer 3+ Punktzahl" + question: "<1>is:question1> Suchfragen" + is_answer: "<1>ist:answer1> Suchantworten" + empty: Wir konnten nichts finden.