Repository: apache/answer
Branch: main
Commit: fca80abbaf38
Files: 1094
Total size: 7.8 MB
Directory structure:
gitextract_8j8m3hg4/
├── .asf.yaml
├── .editorconfig
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ ├── enhancement_request.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE/
│ │ └── pull_request_template.md
│ └── workflows/
│ ├── build-binary-for-release.yml
│ ├── build-image-for-latest-release.yml
│ ├── build-image-for-manual.yml
│ ├── build-image-for-release.yml
│ ├── build-image-for-test.yml
│ ├── check-asf-header.yml
│ └── lint.yml
├── .gitignore
├── .gitlab-ci.yml
├── .golangci.yaml
├── .goreleaser.yaml
├── .vaunt/
│ └── config.yaml
├── .vscode/
│ └── settings.json
├── Dockerfile
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── build/
│ └── README.md
├── charts/
│ ├── .helmignore
│ ├── Chart.yaml
│ ├── README.md
│ ├── templates/
│ │ ├── _helpers.tpl
│ │ ├── deployment.yaml
│ │ ├── hpa.yaml
│ │ ├── ingress.yaml
│ │ ├── pvc.yaml
│ │ ├── service.yaml
│ │ └── serviceaccount.yaml
│ └── values.yaml
├── cmd/
│ ├── answer/
│ │ └── main.go
│ ├── command.go
│ ├── main.go
│ ├── wire.go
│ └── wire_gen.go
├── configs/
│ ├── config.go
│ ├── config.yaml
│ ├── path_ignore.yaml
│ └── reserved-usernames.json
├── crowdin.yml
├── docker-compose.yaml
├── docs/
│ ├── docs.go
│ ├── release/
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ └── licenses/
│ │ ├── LICENSE-JedWatson-classnames.txt
│ │ ├── LICENSE-Machiel-slugify.txt
│ │ ├── LICENSE-Masterminds-semver.txt
│ │ ├── LICENSE-Qix--color.txt
│ │ ├── LICENSE-anargu-gin-brotli.txt
│ │ ├── LICENSE-asaskevich-govalidator.txt
│ │ ├── LICENSE-axios-axios.txt
│ │ ├── LICENSE-bwmarrin-snowflake.txt
│ │ ├── LICENSE-codemirror-basic-setup.txt
│ │ ├── LICENSE-codemirror-lang-markdown.txt
│ │ ├── LICENSE-codemirror-language-data.txt
│ │ ├── LICENSE-codemirror-state.txt
│ │ ├── LICENSE-codemirror-view.txt
│ │ ├── LICENSE-cznic-sqlite.txt
│ │ ├── LICENSE-disintegration-imaging.txt
│ │ ├── LICENSE-emn178-js-sha256.txt
│ │ ├── LICENSE-facebook-react.txt
│ │ ├── LICENSE-gin-gonic-gin.txt
│ │ ├── LICENSE-go-gomail-gomail.txt
│ │ ├── LICENSE-go-playground-locales.txt
│ │ ├── LICENSE-go-playground-universal-translator.txt
│ │ ├── LICENSE-go-playground-validator.txt
│ │ ├── LICENSE-go-resty-resty.txt
│ │ ├── LICENSE-go-sql-driver-mysql.txt
│ │ ├── LICENSE-go-yaml-yaml.txt
│ │ ├── LICENSE-goccy-go-json.txt
│ │ ├── LICENSE-golang-org-x.txt
│ │ ├── LICENSE-google-uuid.txt
│ │ ├── LICENSE-google-wire.txt
│ │ ├── LICENSE-grokify-html-strip-tags-go.txt
│ │ ├── LICENSE-i18next-i18next.txt
│ │ ├── LICENSE-i18next-react-i18next.txt
│ │ ├── LICENSE-iamkun-dayjs.txt
│ │ ├── LICENSE-jinzhu-copier.txt
│ │ ├── LICENSE-jinzhu-now.txt
│ │ ├── LICENSE-joho-godotenv.txt
│ │ ├── LICENSE-jordan-wright-email.txt
│ │ ├── LICENSE-jxson-front-matter.txt
│ │ ├── LICENSE-kpdecker-jsdiff.txt
│ │ ├── LICENSE-lib-pq.txt
│ │ ├── LICENSE-ljharb-qs.txt
│ │ ├── LICENSE-lodash-lodash.txt
│ │ ├── LICENSE-mark3labs-mcp-go.txt
│ │ ├── LICENSE-markedjs-marked.txt
│ │ ├── LICENSE-mattn-go-sqlite3.txt
│ │ ├── LICENSE-microcosm-cc-bluemonday.txt
│ │ ├── LICENSE-mojocn-base64Captcha.txt
│ │ ├── LICENSE-mozillazg-go-pinyin.txt
│ │ ├── LICENSE-npm-node-semver.txt
│ │ ├── LICENSE-ory-dockertest.txt
│ │ ├── LICENSE-pmndrs-zustand.txt
│ │ ├── LICENSE-react-bootstrap-react-bootstrap.txt
│ │ ├── LICENSE-remix-run-react-router.txt
│ │ ├── LICENSE-robfig-cron.txt
│ │ ├── LICENSE-sashabaranov-go-openai.txt
│ │ ├── LICENSE-scottleedavis-go-exif-remove.txt
│ │ ├── LICENSE-segmentfault-pacman.txt
│ │ ├── LICENSE-soldair-qrcode.txt
│ │ ├── LICENSE-spf13-cobra.txt
│ │ ├── LICENSE-staylor-react-helmet-async.txt
│ │ ├── LICENSE-stretchr-testify.txt
│ │ ├── LICENSE-sudodoki-copy-to-clipboard.txt
│ │ ├── LICENSE-swaggo-files.txt
│ │ ├── LICENSE-swaggo-gin-swagger.txt
│ │ ├── LICENSE-swaggo-swag.txt
│ │ ├── LICENSE-tidwall-gjson.txt
│ │ ├── LICENSE-twbs-bootstrap.txt
│ │ ├── LICENSE-twbs-icons.txt
│ │ ├── LICENSE-uber-go-mock.txt
│ │ ├── LICENSE-vercel-swr.txt
│ │ ├── LICENSE-xorm.txt
│ │ ├── LICENSE-yuin-goldmark.txt
│ │ └── LIcENSE-Bunlong-next-share.txt
│ ├── swagger.json
│ └── swagger.yaml
├── go.mod
├── go.sum
├── i18n/
│ ├── af_ZA.yaml
│ ├── ar_SA.yaml
│ ├── az_AZ.yaml
│ ├── bal_BA.yaml
│ ├── ban_ID.yaml
│ ├── bn_BD.yaml
│ ├── bs_BA.yaml
│ ├── ca_ES.yaml
│ ├── cs_CZ.yaml
│ ├── cy_GB.yaml
│ ├── da_DK.yaml
│ ├── de_DE.yaml
│ ├── el_GR.yaml
│ ├── en_US.yaml
│ ├── es_ES.yaml
│ ├── fa_IR.yaml
│ ├── fi_FI.yaml
│ ├── fr_FR.yaml
│ ├── he_IL.yaml
│ ├── hi_IN.yaml
│ ├── hu_HU.yaml
│ ├── hy_AM.yaml
│ ├── i18n.go
│ ├── i18n.yaml
│ ├── id_ID.yaml
│ ├── it_IT.yaml
│ ├── ja_JP.yaml
│ ├── ko_KR.yaml
│ ├── ml_IN.yaml
│ ├── nl_NL.yaml
│ ├── no_NO.yaml
│ ├── pl_PL.yaml
│ ├── pt_BR.yaml
│ ├── pt_PT.yaml
│ ├── ro_RO.yaml
│ ├── ru_RU.yaml
│ ├── sk_SK.yaml
│ ├── sq_AL.yaml
│ ├── sr_SP.yaml
│ ├── sv_SE.yaml
│ ├── te_IN.yaml
│ ├── tr_TR.yaml
│ ├── uk_UA.yaml
│ ├── vi_VN.yaml
│ ├── zh_CN.yaml
│ └── zh_TW.yaml
├── internal/
│ ├── base/
│ │ ├── conf/
│ │ │ └── conf.go
│ │ ├── constant/
│ │ │ ├── acticity.go
│ │ │ ├── ai_config.go
│ │ │ ├── cache_key.go
│ │ │ ├── comment.go
│ │ │ ├── constant.go
│ │ │ ├── ctx_flag.go
│ │ │ ├── email_tpl_key.go
│ │ │ ├── event.go
│ │ │ ├── meta.go
│ │ │ ├── notification.go
│ │ │ ├── object_type.go
│ │ │ ├── plugin_config_key.go
│ │ │ ├── privilege.go
│ │ │ ├── question.go
│ │ │ ├── reason.go
│ │ │ ├── revision.go
│ │ │ ├── site_info.go
│ │ │ ├── site_type.go
│ │ │ ├── upload.go
│ │ │ └── user.go
│ │ ├── cron/
│ │ │ ├── cron.go
│ │ │ └── provider.go
│ │ ├── data/
│ │ │ ├── config.go
│ │ │ └── data.go
│ │ ├── handler/
│ │ │ ├── handler.go
│ │ │ ├── lang.go
│ │ │ ├── response.go
│ │ │ └── short_id.go
│ │ ├── middleware/
│ │ │ ├── accept_language.go
│ │ │ ├── api_key_auth.go
│ │ │ ├── auth.go
│ │ │ ├── avatar.go
│ │ │ ├── header.go
│ │ │ ├── mcp_auth.go
│ │ │ ├── provider.go
│ │ │ ├── rate_limit.go
│ │ │ ├── short_id.go
│ │ │ ├── user_center_plugin_auth.go
│ │ │ └── visit_img_auth.go
│ │ ├── pager/
│ │ │ ├── pager.go
│ │ │ └── pagination.go
│ │ ├── path/
│ │ │ └── path.go
│ │ ├── queue/
│ │ │ ├── queue.go
│ │ │ └── queue_test.go
│ │ ├── reason/
│ │ │ ├── privilege.go
│ │ │ └── reason.go
│ │ ├── server/
│ │ │ ├── config.go
│ │ │ ├── http.go
│ │ │ ├── http_funcmap.go
│ │ │ └── provider.go
│ │ ├── translator/
│ │ │ ├── config.go
│ │ │ └── provider.go
│ │ └── validator/
│ │ └── validator.go
│ ├── cli/
│ │ ├── build.go
│ │ ├── config.go
│ │ ├── dump.go
│ │ ├── i18n.go
│ │ ├── install.go
│ │ ├── install_check.go
│ │ └── reset_password.go
│ ├── controller/
│ │ ├── activity_controller.go
│ │ ├── ai_controller.go
│ │ ├── ai_conversation_controller.go
│ │ ├── answer_controller.go
│ │ ├── badge_controller.go
│ │ ├── collection_controller.go
│ │ ├── comment_controller.go
│ │ ├── connector_controller.go
│ │ ├── controller.go
│ │ ├── dashboard_controller.go
│ │ ├── embed_controller.go
│ │ ├── follow_controller.go
│ │ ├── lang_controller.go
│ │ ├── mcp_controller.go
│ │ ├── meta_controller.go
│ │ ├── notification_controller.go
│ │ ├── permission_controller.go
│ │ ├── plugin_captcha_controller.go
│ │ ├── plugin_sidebar_controller.go
│ │ ├── plugin_user_center_controller.go
│ │ ├── question_controller.go
│ │ ├── rank_controller.go
│ │ ├── reason_controller.go
│ │ ├── render_controller.go
│ │ ├── report_controller.go
│ │ ├── review_controller.go
│ │ ├── revision_controller.go
│ │ ├── search_controller.go
│ │ ├── siteinfo_controller.go
│ │ ├── tag_controller.go
│ │ ├── template_controller.go
│ │ ├── template_render/
│ │ │ ├── answer.go
│ │ │ ├── comment.go
│ │ │ ├── controller.go
│ │ │ ├── question.go
│ │ │ ├── tags.go
│ │ │ └── userinfo.go
│ │ ├── upload_controller.go
│ │ ├── user_controller.go
│ │ ├── user_plugin_controller.go
│ │ └── vote_controller.go
│ ├── controller_admin/
│ │ ├── ai_conversation_admin_controller.go
│ │ ├── badge_controller.go
│ │ ├── controller.go
│ │ ├── e_api_key_controller.go
│ │ ├── plugin_controller.go
│ │ ├── role_controller.go
│ │ ├── siteinfo_controller.go
│ │ ├── theme_controller.go
│ │ └── user_backyard_controller.go
│ ├── entity/
│ │ ├── activity_entity.go
│ │ ├── ai_conversation.go
│ │ ├── ai_conversation_record.go
│ │ ├── answer_entity.go
│ │ ├── api_key_entity.go
│ │ ├── auth_user_entity.go
│ │ ├── badge_award_entity.go
│ │ ├── badge_entity.go
│ │ ├── badge_group_entity.go
│ │ ├── captcha_entity.go
│ │ ├── collection_entity.go
│ │ ├── collection_group_entity.go
│ │ ├── comment_entity.go
│ │ ├── config_entity.go
│ │ ├── file_record_entity.go
│ │ ├── meta_entity.go
│ │ ├── notification_entity.go
│ │ ├── plugin_config_entity.go
│ │ ├── plugin_kv_storage_entity.go
│ │ ├── plugin_user_config_entity.go
│ │ ├── power_entity.go
│ │ ├── question_entity.go
│ │ ├── question_link_entity.go
│ │ ├── report_entity.go
│ │ ├── review_entity.go
│ │ ├── revision_entity.go
│ │ ├── role_entity.go
│ │ ├── role_power_rel_entity.go
│ │ ├── site_info.go
│ │ ├── tag_entity.go
│ │ ├── tag_rel_entity.go
│ │ ├── uniqid_entity.go
│ │ ├── user_entity.go
│ │ ├── user_external_login_entity.go
│ │ ├── user_notification_config_entity.go
│ │ ├── user_role_rel_entity.go
│ │ └── version_entity.go
│ ├── install/
│ │ ├── install_controller.go
│ │ ├── install_from_env.go
│ │ ├── install_main.go
│ │ ├── install_req.go
│ │ └── install_server.go
│ ├── migrations/
│ │ ├── init.go
│ │ ├── init_data.go
│ │ ├── migrations.go
│ │ ├── v1.go
│ │ ├── v10.go
│ │ ├── v11.go
│ │ ├── v12.go
│ │ ├── v13.go
│ │ ├── v14.go
│ │ ├── v15.go
│ │ ├── v16.go
│ │ ├── v17.go
│ │ ├── v18.go
│ │ ├── v19.go
│ │ ├── v2.go
│ │ ├── v20.go
│ │ ├── v21.go
│ │ ├── v22.go
│ │ ├── v23.go
│ │ ├── v24.go
│ │ ├── v25.go
│ │ ├── v26.go
│ │ ├── v27.go
│ │ ├── v28.go
│ │ ├── v29.go
│ │ ├── v3.go
│ │ ├── v30.go
│ │ ├── v31.go
│ │ ├── v4.go
│ │ ├── v5.go
│ │ ├── v6.go
│ │ ├── v7.go
│ │ ├── v8.go
│ │ └── v9.go
│ ├── repo/
│ │ ├── activity/
│ │ │ ├── activity_repo.go
│ │ │ ├── answer_repo.go
│ │ │ ├── follow_repo.go
│ │ │ ├── review_repo.go
│ │ │ ├── user_active_repo.go
│ │ │ └── vote_repo.go
│ │ ├── activity_common/
│ │ │ ├── activity_repo.go
│ │ │ ├── follow.go
│ │ │ └── vote.go
│ │ ├── ai_conversation/
│ │ │ └── ai_conversation_repo.go
│ │ ├── answer/
│ │ │ └── answer_repo.go
│ │ ├── api_key/
│ │ │ └── api_key_repo.go
│ │ ├── auth/
│ │ │ └── auth.go
│ │ ├── badge/
│ │ │ ├── badge_event_rule.go
│ │ │ └── badge_repo.go
│ │ ├── badge_award/
│ │ │ └── badge_award_repo.go
│ │ ├── badge_group/
│ │ │ └── badge_group_repo.go
│ │ ├── captcha/
│ │ │ └── captcha.go
│ │ ├── collection/
│ │ │ ├── collection_group_repo.go
│ │ │ └── collection_repo.go
│ │ ├── comment/
│ │ │ └── comment_repo.go
│ │ ├── config/
│ │ │ └── config_repo.go
│ │ ├── export/
│ │ │ └── email_repo.go
│ │ ├── file_record/
│ │ │ └── file_record_repo.go
│ │ ├── limit/
│ │ │ └── limit.go
│ │ ├── meta/
│ │ │ └── meta_repo.go
│ │ ├── notification/
│ │ │ └── notification_repo.go
│ │ ├── plugin_config/
│ │ │ ├── plugin_config_repo.go
│ │ │ └── plugin_user_config_repo.go
│ │ ├── provider.go
│ │ ├── question/
│ │ │ └── question_repo.go
│ │ ├── rank/
│ │ │ └── user_rank_repo.go
│ │ ├── reason/
│ │ │ └── reason_repo.go
│ │ ├── repo_test/
│ │ │ ├── auth_test.go
│ │ │ ├── captcha_test.go
│ │ │ ├── comment_repo_test.go
│ │ │ ├── email_repo_test.go
│ │ │ ├── meta_repo_test.go
│ │ │ ├── notification_repo_test.go
│ │ │ ├── reason_repo_test.go
│ │ │ ├── recommend_test.go
│ │ │ ├── repo_main_test.go
│ │ │ ├── revision_repo_test.go
│ │ │ ├── siteinfo_repo_test.go
│ │ │ ├── tag_rel_repo_test.go
│ │ │ ├── tag_repo_test.go
│ │ │ ├── user_backyard_repo_test.go
│ │ │ └── user_repo_test.go
│ │ ├── report/
│ │ │ └── report_repo.go
│ │ ├── review/
│ │ │ └── review_repo.go
│ │ ├── revision/
│ │ │ └── revision_repo.go
│ │ ├── role/
│ │ │ ├── power_repo.go
│ │ │ ├── role_power_rel_repo.go
│ │ │ ├── role_repo.go
│ │ │ └── user_role_rel_repo.go
│ │ ├── search_common/
│ │ │ └── search_repo.go
│ │ ├── search_sync/
│ │ │ └── search_sync.go
│ │ ├── site_info/
│ │ │ └── siteinfo_repo.go
│ │ ├── tag/
│ │ │ ├── tag_rel_repo.go
│ │ │ └── tag_repo.go
│ │ ├── tag_common/
│ │ │ └── tag_common_repo.go
│ │ ├── unique/
│ │ │ └── uniqid_repo.go
│ │ ├── user/
│ │ │ ├── user_backyard_repo.go
│ │ │ └── user_repo.go
│ │ ├── user_external_login/
│ │ │ └── user_external_login_repo.go
│ │ └── user_notification_config/
│ │ └── user_notification_config_repo.go
│ ├── router/
│ │ ├── answer_api_router.go
│ │ ├── config.go
│ │ ├── mcp_router.go
│ │ ├── plugin_api_router.go
│ │ ├── provider.go
│ │ ├── static_router.go
│ │ ├── swagger_router.go
│ │ ├── template_router.go
│ │ ├── ui.go
│ │ └── ui_test.go
│ ├── schema/
│ │ ├── activity.go
│ │ ├── ai_config_schema.go
│ │ ├── ai_conversation_schema.go
│ │ ├── answer_activity_schema.go
│ │ ├── answer_schema.go
│ │ ├── api_key_schema.go
│ │ ├── backyard_user_schema.go
│ │ ├── badge_schema.go
│ │ ├── collection_group_schema.go
│ │ ├── comment_schema.go
│ │ ├── config_schema.go
│ │ ├── connector_schema.go
│ │ ├── dashboard_schema.go
│ │ ├── email_template.go
│ │ ├── err_schema.go
│ │ ├── event_schema.go
│ │ ├── follow_schema.go
│ │ ├── forbidden_schema.go
│ │ ├── mcp_schema.go
│ │ ├── mcp_tools/
│ │ │ └── mcp_tools.go
│ │ ├── meta_schema.go
│ │ ├── new_question_queue_schema.go
│ │ ├── notification_schema.go
│ │ ├── permission.go
│ │ ├── plugin_admin_schema.go
│ │ ├── plugin_user_center.go
│ │ ├── plugin_user_schema.go
│ │ ├── question_schema.go
│ │ ├── rank_schema.go
│ │ ├── reason_schema.go
│ │ ├── render_schema.go
│ │ ├── report_schema.go
│ │ ├── review_schema.go
│ │ ├── revision_schema.go
│ │ ├── role_schema.go
│ │ ├── search_schema.go
│ │ ├── search_schema_test.go
│ │ ├── simple_obj_info_schema.go
│ │ ├── siteinfo_schema.go
│ │ ├── sitemap_schema.go
│ │ ├── tag_list_schema.go
│ │ ├── tag_schema.go
│ │ ├── template_schema.go
│ │ ├── theme_schema.go
│ │ ├── user_external_login_schema.go
│ │ ├── user_notification_schema.go
│ │ ├── user_schema.go
│ │ └── vote_schema.go
│ └── service/
│ ├── action/
│ │ ├── captcha_service.go
│ │ └── captcha_strategy.go
│ ├── activity/
│ │ ├── activity.go
│ │ ├── answer_activity_service.go
│ │ ├── review_active.go
│ │ └── user_active.go
│ ├── activity_common/
│ │ ├── activity.go
│ │ ├── follow.go
│ │ └── vote.go
│ ├── activity_type/
│ │ └── activity_type.go
│ ├── activityqueue/
│ │ └── activity_queue.go
│ ├── ai_conversation/
│ │ └── ai_conversation_service.go
│ ├── answer_common/
│ │ └── answer.go
│ ├── apikey/
│ │ └── apikey_service.go
│ ├── auth/
│ │ └── auth.go
│ ├── badge/
│ │ ├── badge_award_service.go
│ │ ├── badge_event_handler.go
│ │ ├── badge_group_service.go
│ │ └── badge_service.go
│ ├── collection/
│ │ ├── collection_group_service.go
│ │ └── collection_service.go
│ ├── collection_common/
│ │ └── collection.go
│ ├── comment/
│ │ └── comment_service.go
│ ├── comment_common/
│ │ └── comment_service.go
│ ├── config/
│ │ └── config_service.go
│ ├── content/
│ │ ├── answer_service.go
│ │ ├── question_hottest_service.go
│ │ ├── question_service.go
│ │ ├── revision_service.go
│ │ ├── search_service.go
│ │ ├── user_service.go
│ │ └── vote_service.go
│ ├── dashboard/
│ │ ├── dashboard_service.go
│ │ └── dashboard_test.go
│ ├── eventqueue/
│ │ └── event_queue.go
│ ├── export/
│ │ └── email_service.go
│ ├── feature_toggle/
│ │ └── feature_toggle_service.go
│ ├── file_record/
│ │ └── file_record_service.go
│ ├── follow/
│ │ └── follow_service.go
│ ├── importer/
│ │ └── importer_service.go
│ ├── meta/
│ │ └── meta_service.go
│ ├── meta_common/
│ │ └── meta_common_service.go
│ ├── mock/
│ │ └── siteinfo_repo_mock.go
│ ├── noticequeue/
│ │ └── notice_queue.go
│ ├── notification/
│ │ ├── external_notification.go
│ │ ├── invite_answer_notification.go
│ │ ├── new_answer_notification.go
│ │ ├── new_comment_notification.go
│ │ ├── new_question_notification.go
│ │ └── notification_service.go
│ ├── notification_common/
│ │ └── notification.go
│ ├── object_info/
│ │ └── object_info.go
│ ├── permission/
│ │ ├── answer_permission.go
│ │ ├── comment_permission.go
│ │ ├── permission_name.go
│ │ ├── question_permission.go
│ │ └── tag_permission.go
│ ├── plugin_common/
│ │ └── plugin_common_service.go
│ ├── provider.go
│ ├── question_common/
│ │ └── question.go
│ ├── rank/
│ │ └── rank_service.go
│ ├── reason/
│ │ └── reason_service.go
│ ├── reason_common/
│ │ └── reason.go
│ ├── report/
│ │ └── report_service.go
│ ├── report_common/
│ │ └── report_common.go
│ ├── report_handle/
│ │ └── report_handle.go
│ ├── review/
│ │ └── review_service.go
│ ├── revision/
│ │ └── revision.go
│ ├── revision_common/
│ │ └── revision_service.go
│ ├── role/
│ │ ├── power_service.go
│ │ ├── role_power_rel_service.go
│ │ ├── role_service.go
│ │ └── user_role_rel_service.go
│ ├── search_common/
│ │ └── search.go
│ ├── search_parser/
│ │ └── search_parser.go
│ ├── service_config/
│ │ └── service_config.go
│ ├── siteinfo/
│ │ └── siteinfo_service.go
│ ├── siteinfo_common/
│ │ ├── siteinfo_service.go
│ │ └── siteinfo_service_test.go
│ ├── tag/
│ │ └── tag_service.go
│ ├── tag_common/
│ │ └── tag_common.go
│ ├── unique/
│ │ └── uniqid_service.go
│ ├── uploader/
│ │ └── upload.go
│ ├── user_admin/
│ │ └── user_backyard.go
│ ├── user_common/
│ │ └── user.go
│ ├── user_external_login/
│ │ ├── user_center_login_service.go
│ │ └── user_external_login_service.go
│ └── user_notification_config/
│ └── user_notification_config_service.go
├── licenserc.toml
├── pkg/
│ ├── checker/
│ │ ├── chinese.go
│ │ ├── email.go
│ │ ├── file_type.go
│ │ ├── password.go
│ │ ├── path_ignore.go
│ │ ├── question_link.go
│ │ ├── question_link_test.go
│ │ ├── reserved_username.go
│ │ ├── url.go
│ │ ├── username.go
│ │ └── zero_string.go
│ ├── converter/
│ │ ├── array.go
│ │ ├── markdown.go
│ │ ├── str.go
│ │ └── user.go
│ ├── day/
│ │ ├── day.go
│ │ └── day_test.go
│ ├── dir/
│ │ └── dir.go
│ ├── display/
│ │ └── url.go
│ ├── encryption/
│ │ └── md5.go
│ ├── gravatar/
│ │ ├── gravatar.go
│ │ └── gravatar_test.go
│ ├── htmltext/
│ │ ├── htmltext.go
│ │ └── htmltext_test.go
│ ├── obj/
│ │ └── obj.go
│ ├── random/
│ │ └── random_username.go
│ ├── token/
│ │ └── token.go
│ ├── uid/
│ │ ├── id.go
│ │ └── sid.go
│ └── writer/
│ └── writer.go
├── plugin/
│ ├── agent.go
│ ├── base.go
│ ├── cache.go
│ ├── captcha.go
│ ├── cdn.go
│ ├── config.go
│ ├── connector.go
│ ├── embed.go
│ ├── filter.go
│ ├── importer.go
│ ├── kv_storage.go
│ ├── notification.go
│ ├── parser.go
│ ├── plugin.go
│ ├── plugin_test/
│ │ ├── kv_storage_test.go
│ │ └── plugin_main_test.go
│ ├── render.go
│ ├── reviewer.go
│ ├── search.go
│ ├── sidebar.go
│ ├── storage.go
│ ├── user_center.go
│ └── user_config.go
├── script/
│ ├── build_plugin.sh
│ ├── check-asf-header.sh
│ ├── entrypoint.sh
│ ├── gen-api.sh
│ └── plugin_list
└── ui/
├── .browserslistrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .lintstagedrc.json
├── .npmrc
├── .prettierrc.json
├── commitlint.config.js
├── config-overrides.js
├── package.json
├── pnpm-workspace.yaml
├── public/
│ ├── index.html
│ ├── manifest.json
│ └── robots.txt
├── scripts/
│ ├── env.js
│ ├── importPlugins.js
│ ├── loadPlugins.js
│ ├── preinstall.js
│ └── setup-eslint.js
├── src/
│ ├── App.test.tsx
│ ├── App.tsx
│ ├── behaviour/
│ │ └── useLegalClick.tsx
│ ├── common/
│ │ ├── _variable.scss
│ │ ├── color.scss
│ │ ├── constants.ts
│ │ ├── interface.ts
│ │ ├── pattern.ts
│ │ └── sideNavLayout.scss
│ ├── components/
│ │ ├── AccordionNav/
│ │ │ ├── index.css
│ │ │ └── index.tsx
│ │ ├── Actions/
│ │ │ └── index.tsx
│ │ ├── AdminSideNav/
│ │ │ └── index.tsx
│ │ ├── Avatar/
│ │ │ └── index.tsx
│ │ ├── BaseUserCard/
│ │ │ └── index.tsx
│ │ ├── BrandUpload/
│ │ │ └── index.tsx
│ │ ├── BubbleAi/
│ │ │ └── index.tsx
│ │ ├── BubbleUser/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── CardBadge/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── Comment/
│ │ │ ├── components/
│ │ │ │ ├── ActionBar/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Form/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Reply/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── Counts/
│ │ │ └── index.tsx
│ │ ├── CustomSidebar/
│ │ │ └── index.tsx
│ │ ├── Customize/
│ │ │ └── index.tsx
│ │ ├── CustomizeTheme/
│ │ │ └── index.tsx
│ │ ├── DiffContent/
│ │ │ └── index.tsx
│ │ ├── Editor/
│ │ │ ├── EditorContext.ts
│ │ │ ├── MarkdownEditor.tsx
│ │ │ ├── Select/
│ │ │ │ └── index.tsx
│ │ │ ├── ToolBars/
│ │ │ │ ├── blockquote.tsx
│ │ │ │ ├── bold.tsx
│ │ │ │ ├── code.tsx
│ │ │ │ ├── file.tsx
│ │ │ │ ├── heading.tsx
│ │ │ │ ├── help.tsx
│ │ │ │ ├── hr.tsx
│ │ │ │ ├── image.tsx
│ │ │ │ ├── indent.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── italic.tsx
│ │ │ │ ├── link.tsx
│ │ │ │ ├── ol.tsx
│ │ │ │ ├── outdent.tsx
│ │ │ │ ├── table.tsx
│ │ │ │ └── ul.tsx
│ │ │ ├── Viewer.tsx
│ │ │ ├── hooks/
│ │ │ │ └── useImageUpload.ts
│ │ │ ├── index.scss
│ │ │ ├── index.tsx
│ │ │ ├── toolItem.tsx
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ ├── codemirror/
│ │ │ │ ├── adapter.ts
│ │ │ │ ├── base.ts
│ │ │ │ ├── commands.ts
│ │ │ │ └── events.ts
│ │ │ └── index.ts
│ │ ├── Empty/
│ │ │ └── index.tsx
│ │ ├── FollowingTags/
│ │ │ └── index.tsx
│ │ ├── Footer/
│ │ │ └── index.tsx
│ │ ├── FormatTime/
│ │ │ └── index.tsx
│ │ ├── Header/
│ │ │ ├── components/
│ │ │ │ ├── NavItems/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── SearchInput/
│ │ │ │ └── index.tsx
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── HighlightText/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── HotQuestions/
│ │ │ └── index.tsx
│ │ ├── HttpErrorContent/
│ │ │ └── index.tsx
│ │ ├── Icon/
│ │ │ ├── index.tsx
│ │ │ └── svg.tsx
│ │ ├── ImgViewer/
│ │ │ ├── index.css
│ │ │ └── index.tsx
│ │ ├── InitialLoadingPlaceholder/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── Mentions/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── MobileSideNav/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── Modal/
│ │ │ ├── BadgeModal.tsx
│ │ │ ├── Confirm.tsx
│ │ │ ├── LoginToContinueModal.tsx
│ │ │ ├── Modal.tsx
│ │ │ ├── index.tsx
│ │ │ └── login.scss
│ │ ├── Operate/
│ │ │ └── index.tsx
│ │ ├── PageTags/
│ │ │ └── index.tsx
│ │ ├── Pagination/
│ │ │ └── index.tsx
│ │ ├── PinList/
│ │ │ └── index.tsx
│ │ ├── PluginRender/
│ │ │ └── index.tsx
│ │ ├── QueryGroup/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── QuestionList/
│ │ │ └── index.tsx
│ │ ├── QuestionListLoader/
│ │ │ └── index.tsx
│ │ ├── SchemaForm/
│ │ │ ├── README.md
│ │ │ ├── components/
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Check.tsx
│ │ │ │ ├── Input.tsx
│ │ │ │ ├── InputGroup.tsx
│ │ │ │ ├── Legend.tsx
│ │ │ │ ├── Select.tsx
│ │ │ │ ├── Switch.tsx
│ │ │ │ ├── TagSelector.tsx
│ │ │ │ ├── Textarea.tsx
│ │ │ │ ├── Timezone.tsx
│ │ │ │ ├── Upload.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.tsx
│ │ │ └── types.ts
│ │ ├── Sender/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── Share/
│ │ │ └── index.tsx
│ │ ├── SideNav/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── TabNav/
│ │ │ └── index.tsx
│ │ ├── Tag/
│ │ │ └── index.tsx
│ │ ├── TagSelector/
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── TagsLoader/
│ │ │ └── index.tsx
│ │ ├── TextArea/
│ │ │ └── index.tsx
│ │ ├── TimeZonePicker/
│ │ │ └── index.tsx
│ │ ├── Toast/
│ │ │ └── index.tsx
│ │ ├── Unactivate/
│ │ │ └── index.tsx
│ │ ├── UploadImg/
│ │ │ └── index.tsx
│ │ ├── UserCard/
│ │ │ └── index.tsx
│ │ ├── WelcomeTitle/
│ │ │ └── index.tsx
│ │ └── index.ts
│ ├── hooks/
│ │ ├── index.ts
│ │ ├── useActivationEmailModal/
│ │ │ └── index.tsx
│ │ ├── useCaptchaModal/
│ │ │ └── index.tsx
│ │ ├── useChangePasswordModal/
│ │ │ └── index.tsx
│ │ ├── useChangeProfileModal/
│ │ │ └── index.tsx
│ │ ├── useChangeUserRoleModal/
│ │ │ └── index.tsx
│ │ ├── useExternalToast/
│ │ │ └── index.tsx
│ │ ├── useLoginRedirect/
│ │ │ └── index.tsx
│ │ ├── usePageTags/
│ │ │ └── index.tsx
│ │ ├── usePageUsers/
│ │ │ └── index.tsx
│ │ ├── usePrompt/
│ │ │ └── index.tsx
│ │ ├── useReportModal/
│ │ │ └── index.tsx
│ │ ├── useSkeletonControl/
│ │ │ └── index.tsx
│ │ ├── useTagModal/
│ │ │ └── index.tsx
│ │ ├── useToast/
│ │ │ └── index.tsx
│ │ └── useUserModal/
│ │ └── index.tsx
│ ├── i18n/
│ │ └── init.ts
│ ├── index.scss
│ ├── index.tsx
│ ├── pages/
│ │ ├── 404/
│ │ │ ├── 403/
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── 50X/
│ │ │ └── index.tsx
│ │ ├── Admin/
│ │ │ ├── AiAssistant/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Action/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── DetailModal/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── AiSettings/
│ │ │ │ └── index.tsx
│ │ │ ├── Answers/
│ │ │ │ ├── components/
│ │ │ │ │ └── Action/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Apikeys/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Action/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── AddOrEditModal/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── CreatedModal/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ └── index.tsx
│ │ │ ├── Badges/
│ │ │ │ ├── components/
│ │ │ │ │ └── Action/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Branding/
│ │ │ │ └── index.tsx
│ │ │ ├── CssAndHtml/
│ │ │ │ └── index.tsx
│ │ │ ├── Dashboard/
│ │ │ │ ├── components/
│ │ │ │ │ ├── AnswerLinks/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── HealthStatus/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Statistics/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── SystemInfo/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ └── index.tsx
│ │ │ ├── Files/
│ │ │ │ └── index.tsx
│ │ │ ├── General/
│ │ │ │ └── index.tsx
│ │ │ ├── Interface/
│ │ │ │ └── index.tsx
│ │ │ ├── Login/
│ │ │ │ └── index.tsx
│ │ │ ├── Mcp/
│ │ │ │ └── index.tsx
│ │ │ ├── Plugins/
│ │ │ │ ├── Config/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Installed/
│ │ │ │ └── index.tsx
│ │ │ ├── Policies/
│ │ │ │ └── index.tsx
│ │ │ ├── Privileges/
│ │ │ │ └── index.tsx
│ │ │ ├── QaSettings/
│ │ │ │ └── index.tsx
│ │ │ ├── Questions/
│ │ │ │ ├── components/
│ │ │ │ │ └── Action/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Security/
│ │ │ │ └── index.tsx
│ │ │ ├── Seo/
│ │ │ │ └── index.tsx
│ │ │ ├── Smtp/
│ │ │ │ └── index.tsx
│ │ │ ├── TagsSettings/
│ │ │ │ └── index.tsx
│ │ │ ├── Themes/
│ │ │ │ └── index.tsx
│ │ │ ├── Users/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Action/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── DeleteUserModal/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── SuspenseUserModal/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── UsersSettings/
│ │ │ │ └── index.tsx
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── AiAssistant/
│ │ │ ├── components/
│ │ │ │ └── ConversationList/
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── Badges/
│ │ │ ├── Detail/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Badge/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── HeaderLoader/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Loader/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── UserCard/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── Install/
│ │ │ ├── components/
│ │ │ │ ├── FifthStep/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FirstStep/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FourthStep/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Progress/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SecondStep/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ThirdStep/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.ts
│ │ │ └── index.tsx
│ │ ├── Layout/
│ │ │ └── index.tsx
│ │ ├── Legal/
│ │ │ ├── Privacy/
│ │ │ │ └── index.tsx
│ │ │ ├── Tos/
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── Maintenance/
│ │ │ └── index.tsx
│ │ ├── Questions/
│ │ │ ├── Ask/
│ │ │ │ ├── components/
│ │ │ │ │ └── SearchQuestion/
│ │ │ │ │ ├── index.scss
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Detail/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Alert/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Answer/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── AnswerHead/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── ContentLoader/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── InviteToAnswer/
│ │ │ │ │ │ ├── PeopleDropdown.scss
│ │ │ │ │ │ ├── PeopleDropdown.tsx
│ │ │ │ │ │ ├── index.scss
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── LinkedQuestions/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Question/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Reactions/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── RelatedQuestions/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── WriteAnswer/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.scss
│ │ │ │ └── index.tsx
│ │ │ ├── EditAnswer/
│ │ │ │ ├── index.scss
│ │ │ │ └── index.tsx
│ │ │ ├── Linked/
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── Review/
│ │ │ ├── components/
│ │ │ │ ├── ApproveDropdown/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── EditPostModal/
│ │ │ │ │ ├── index.scss
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FlagContent/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── QueuedContent/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ReviewType/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SuggestContent/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.tsx
│ │ │ └── utils/
│ │ │ └── generateData.ts
│ │ ├── Search/
│ │ │ ├── components/
│ │ │ │ ├── AiCard/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Empty/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Head/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ListLoader/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SearchHead/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SearchItem/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Tips/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.ts
│ │ │ └── index.tsx
│ │ ├── SideNavLayout/
│ │ │ └── index.tsx
│ │ ├── SideNavLayoutWithoutFooter/
│ │ │ └── index.tsx
│ │ ├── Tags/
│ │ │ ├── Create/
│ │ │ │ └── index.tsx
│ │ │ ├── Detail/
│ │ │ │ └── index.tsx
│ │ │ ├── Edit/
│ │ │ │ └── index.tsx
│ │ │ ├── Info/
│ │ │ │ ├── components/
│ │ │ │ │ └── MergeTagModal/
│ │ │ │ │ ├── index.scss
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── Timeline/
│ │ │ ├── components/
│ │ │ │ └── Item/
│ │ │ │ └── index.tsx
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── UserCenter/
│ │ │ ├── Auth/
│ │ │ │ ├── components/
│ │ │ │ │ └── WeCom/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── service.ts
│ │ │ │ └── index.tsx
│ │ │ └── AuthFailed/
│ │ │ ├── components/
│ │ │ │ └── WeCom.tsx
│ │ │ └── index.tsx
│ │ └── Users/
│ │ ├── AccountForgot/
│ │ │ ├── components/
│ │ │ │ └── sendEmail.tsx
│ │ │ └── index.tsx
│ │ ├── ActivationResult/
│ │ │ └── index.tsx
│ │ ├── ActiveEmail/
│ │ │ └── index.tsx
│ │ ├── AuthCallback/
│ │ │ └── index.tsx
│ │ ├── ChangeEmail/
│ │ │ ├── components/
│ │ │ │ └── sendEmail.tsx
│ │ │ └── index.tsx
│ │ ├── ConfirmNewEmail/
│ │ │ └── index.tsx
│ │ ├── Login/
│ │ │ └── index.tsx
│ │ ├── Logout/
│ │ │ └── index.tsx
│ │ ├── Notifications/
│ │ │ ├── components/
│ │ │ │ ├── Achievements/
│ │ │ │ │ ├── index.scss
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Inbox/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── OauthBindEmail/
│ │ │ └── index.tsx
│ │ ├── PasswordReset/
│ │ │ └── index.tsx
│ │ ├── Personal/
│ │ │ ├── components/
│ │ │ │ ├── Alert/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Answers/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Badges/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Comments/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DefaultList/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ListHead/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── NavBar/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Overview/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Reputation/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TopList/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── UserInfo/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Votes/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.ts
│ │ │ └── index.tsx
│ │ ├── Register/
│ │ │ ├── components/
│ │ │ │ └── SignUpForm/
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ ├── Settings/
│ │ │ ├── Account/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ModifyEmail/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── ModifyPass/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── MyLogins/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ └── index.tsx
│ │ │ ├── Interface/
│ │ │ │ └── index.tsx
│ │ │ ├── Notification/
│ │ │ │ └── index.tsx
│ │ │ ├── Plugins/
│ │ │ │ └── index.tsx
│ │ │ ├── Profile/
│ │ │ │ └── index.tsx
│ │ │ ├── components/
│ │ │ │ └── Nav/
│ │ │ │ └── index.tsx
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ │ ├── Suspended/
│ │ │ └── index.tsx
│ │ ├── Unsubscribe/
│ │ │ └── index.tsx
│ │ └── index.tsx
│ ├── plugins/
│ │ ├── builtin/
│ │ │ ├── HostingConnector/
│ │ │ │ ├── i18n/
│ │ │ │ │ ├── en_US.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh_CN.yaml
│ │ │ │ ├── index.tsx
│ │ │ │ └── info.yaml
│ │ │ ├── SearchInfo/
│ │ │ │ ├── i18n/
│ │ │ │ │ ├── en_US.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh_CN.yaml
│ │ │ │ ├── index.tsx
│ │ │ │ ├── info.yaml
│ │ │ │ └── services.ts
│ │ │ ├── ThirdPartyConnector/
│ │ │ │ ├── i18n/
│ │ │ │ │ ├── en_US.yaml
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── zh_CN.yaml
│ │ │ │ ├── index.tsx
│ │ │ │ ├── info.yaml
│ │ │ │ └── services.ts
│ │ │ └── index.ts
│ │ └── index.ts
│ ├── react-app-env.d.ts
│ ├── router/
│ │ ├── RouteErrorBoundary.tsx
│ │ ├── RouteGuard.tsx
│ │ ├── alias.ts
│ │ ├── index.tsx
│ │ ├── pathFactory.ts
│ │ └── routes.ts
│ ├── services/
│ │ ├── admin/
│ │ │ ├── ai.ts
│ │ │ ├── answer.ts
│ │ │ ├── apikeys.ts
│ │ │ ├── badges.ts
│ │ │ ├── dashboard.ts
│ │ │ ├── flag.ts
│ │ │ ├── index.ts
│ │ │ ├── mcp.ts
│ │ │ ├── plugins.ts
│ │ │ ├── question.ts
│ │ │ ├── settings.ts
│ │ │ ├── tags.ts
│ │ │ └── users.ts
│ │ ├── client/
│ │ │ ├── Oauth.ts
│ │ │ ├── activity.ts
│ │ │ ├── ai.ts
│ │ │ ├── badges.ts
│ │ │ ├── index.ts
│ │ │ ├── legal.ts
│ │ │ ├── notification.ts
│ │ │ ├── personal.ts
│ │ │ ├── question.ts
│ │ │ ├── review.ts
│ │ │ ├── revision.ts
│ │ │ ├── search.ts
│ │ │ ├── settings.ts
│ │ │ ├── tag.ts
│ │ │ ├── timeline.ts
│ │ │ └── user.ts
│ │ ├── common.ts
│ │ ├── index.ts
│ │ ├── install/
│ │ │ └── index.ts
│ │ └── user-center/
│ │ └── index.ts
│ ├── stores/
│ │ ├── aiControl.ts
│ │ ├── branding.ts
│ │ ├── commentReply.ts
│ │ ├── customize.ts
│ │ ├── errorCode.ts
│ │ ├── index.ts
│ │ ├── interface.ts
│ │ ├── loggedUserInfo.ts
│ │ ├── loginSetting.ts
│ │ ├── loginToContinue.ts
│ │ ├── pageTags.ts
│ │ ├── seoSetting.ts
│ │ ├── sideNav.ts
│ │ ├── siteInfo.ts
│ │ ├── siteSecurity.ts
│ │ ├── themeSetting.ts
│ │ ├── toast.ts
│ │ ├── userCenter.ts
│ │ └── writeSetting.ts
│ └── utils/
│ ├── animateGift.ts
│ ├── color.ts
│ ├── common.ts
│ ├── floppyNavigation.ts
│ ├── guard.ts
│ ├── index.ts
│ ├── localize.ts
│ ├── pluginKit/
│ │ ├── index.ts
│ │ ├── interface.ts
│ │ └── utils.ts
│ ├── progress.ts
│ ├── request.ts
│ ├── requestAi.ts
│ ├── saveDraft.ts
│ ├── storage.ts
│ ├── storageWithExpires.ts
│ └── userCenter.ts
├── static.go
├── template/
│ ├── 404.html
│ ├── comment.html
│ ├── footer.html
│ ├── header.html
│ ├── homepage.html
│ ├── hot-question.html
│ ├── opensearch.xml
│ ├── page.html
│ ├── question-detail.html
│ ├── question.html
│ ├── related-question.html
│ ├── sidenav.html
│ ├── sitemap-list.xml
│ ├── sitemap.xml
│ ├── sort-btns.html
│ ├── tag-detail.html
│ └── tags.html
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .asf.yaml
================================================
# 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.
# NOTE: All configurations could be found here: https://cwiki.apache.org/confluence/display/INFRA/Git+-+.asf.yaml+features
github:
description: "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 Apache Answer."
homepage: https://answer.apache.org
labels:
- react
- go
- golang
- community
- forum
- question
- typescript
- q-and-a
- hacktoberfest
features:
wiki: true
issues: true
projects: true
discussions: false
enabled_merge_buttons:
squash: true
rebase: true
merge: false
protected_branches:
main: {}
notifications:
commits: commits@answer.apache.org
issues: issues@answer.apache.org
pullrequests: issues@answer.apache.org
discussions: issues@answer.apache.org
================================================
FILE: .editorconfig
================================================
# 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.
# http://editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.go]
indent_style = tab
indent_size = 2
[{Makefile, Dockerfile}]
indent_style = tab
indent_size = 4
[{*.yml, *.json}]
indent_style = space
indent_size = 2
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Report an issue to help the project improve.
title: ''
labels: bug
type: 'Bug'
assignees: ''
---
## Describe the bug
A clear and concise description of what the bug is.
## To Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
## Expected behavior
A clear and concise description of what you expected to happen.
## Screenshots
If applicable, add screenshots or video to help explain your problem.
## Platform
- Device: [e.g. Desktop, Mobile]
- OS: [e.g. macOS]
- Browser and version: [e.g. Chrome, Safari]
- Version: [e.g. v1.2.0]
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
# 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.
blank_issues_enabled: true
contact_links:
- name: Questions & Discussions
url: https://meta.answer.dev
about: If you have any questions while using.
================================================
FILE: .github/ISSUE_TEMPLATE/enhancement_request.md
================================================
---
name: Enhancement request
about: Suggest an enhancement for this project. Improve an existing feature.
title: ''
labels: enhancement
type: 'Feature'
assignees: ''
---
## Is your enhancement request related to a problem? Please describe
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
## Describe the solution you'd like
A clear and concise description of what you want to happen.
## Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea or possible new feature for this project.
title: ''
labels: new-feature
type: 'Feature'
assignees: ''
---
## Is your feature request related to a problem? Please describe
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
## Describe the solution you'd like
A clear and concise description of what you want to happen.
## Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
================================================
FILE: .github/PULL_REQUEST_TEMPLATE/pull_request_template.md
================================================
Fixes #
## Proposed Changes
-
-
-
================================================
FILE: .github/workflows/build-binary-for-release.yml
================================================
# 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.
name: Build Binary For Release
on:
push:
tags:
- "v*"
permissions:
contents: write
jobs:
build-goreleaser:
if: ${{ github.repository_owner == 'apache' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v3
with:
node-version: 20.18.1
- name: Node Build
run: make install-ui-packages ui
- name: Setup Go
uses: actions/setup-go@v3
with:
go-version: 1.23
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v4
with:
distribution: goreleaser
version: latest
args: release --clean --skip=validate
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/upload-artifact@v4
with:
name: answer
path: ./dist/*
================================================
FILE: .github/workflows/build-image-for-latest-release.yml
================================================
# 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.
name: Build Latest Docker Image For Release
on:
push:
tags:
- v2.*
- v1.*
- v0.*
- "!v*-RC*"
# pull_request:
# branches: [ "main" ]
jobs:
build:
if: ${{ github.repository_owner == 'apache' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: apache/answer
tags: |
type=raw,value=latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
file: ./Dockerfile
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/build-image-for-manual.yml
================================================
# 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.
name: Manual Build Docker Image For Release
on:
workflow_dispatch:
inputs:
tag_name:
type: string
required: true
description: 'DockerHub img tag name'
jobs:
build:
if: ${{ github.repository_owner == 'apache' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: apache/answer
tags: |
type=ref,enable=true,priority=600,prefix=,suffix=,event=branch
type=semver,pattern={{version}}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
file: ./Dockerfile
tags: apache/answer:${{ inputs.tag_name }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/build-image-for-release.yml
================================================
# 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.
name: Build Docker Image For Release
on:
push:
tags:
- v2.*
- v1.*
- v0.*
# pull_request:
# branches: [ "main" ]
jobs:
build:
if: ${{ github.repository_owner == 'apache' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: apache/answer
tags: |
type=ref,enable=true,priority=600,prefix=,suffix=,event=branch
type=semver,pattern={{version}}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
file: ./Dockerfile
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/build-image-for-test.yml
================================================
# 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.
name: Build Docker Image For Test
on:
push:
branches: [ "test" ]
jobs:
build:
if: ${{ github.repository_owner == 'apache' }}
name: Build and Push
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: apache/answer
tags: |
type=raw,value=test
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/check-asf-header.yml
================================================
# 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.
name: CI
on:
pull_request:
branches: [ main ]
push:
branches: [ main ]
# Concurrency strategy:
# github.workflow: distinguish this workflow from others
# github.event_name: distinguish `push` event from `pull_request` event
# github.event.number: set to the number of the pull request if `pull_request` event
# github.run_id: otherwise, it's a `push` or `schedule` event, only cancel if we rerun the workflow
#
# Reference:
# https://docs.github.com/en/actions/using-jobs/using-concurrency
# https://docs.github.com/en/actions/learn-github-actions/contexts#github-context
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.number || github.run_id }}
cancel-in-progress: true
jobs:
check:
name: Check and lint
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Check license header
uses: korandoru/hawkeye@v3
================================================
FILE: .github/workflows/lint.yml
================================================
# 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.
name: Lint
on:
push:
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.number || github.run_id }}
cancel-in-progress: true
jobs:
lint:
name: Lint (${{ matrix.os }})
runs-on: ${{ matrix.os }}
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.23"
cache: true
- name: Run go mod tidy
run: go mod tidy
- name: Run golangci-lint
run: make lint
- name: Check for uncommitted changes
shell: bash
run: |
if [ -n "$(git status --porcelain)" ]; then
echo "::error::Uncommitted changes detected"
git status
git diff
exit 1
fi
================================================
FILE: .gitignore
================================================
*.exe
*.orig
*.rej
*.so
*~
*.db
.DS_Store
._*
/.idea
/.fleet
/.vscode/*.log
/cmd/answer/*.sh
/cmd/answer/answer
/cmd/answer/uploads/*
/cmd/logs
/configs/config-dev.yaml
/go.work*
/logs
/ui/node_modules
/ui/build/*/*/*
/ui/build/*.json
/ui/build/*.html
/ui/build/*.txt
/vendor
Thumbs*.db
tmp
vendor/
/answer-data/
/answer
/new_answer
build/tools/
dist/
# Lint setup generated file
.husky/
# Environment variables
.env
================================================
FILE: .gitlab-ci.yml
================================================
# 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.
include:
- project: "segmentfault/devops/templates"
file: ".docker-build-push.yml"
- project: "segmentfault/devops/templates"
file: ".deploy-helm.yml"
stages:
- deploy-dev
"deploy-to-local-develop-environment":
stage: deploy-dev
extends: .deploy-helm
only:
- test
variables:
LoadBalancerIP: 10.0.10.98
KubernetesCluster: dev
KubernetesNamespace: "sf-web"
InstallArgs: --set service.loadBalancerIP=${LoadBalancerIP} --set image.tag=latest --set replicaCount=1 --set serivce.targetPort=80
ChartName: answer
InstallPolicy: replace
================================================
FILE: .golangci.yaml
================================================
# 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: "2"
linters:
exclusions:
paths:
- answer-data
- ui
- i18n
enable:
- asasalint # checks for pass []any as any in variadic func(...any)
- asciicheck # checks that your code does not contain non-ASCII identifiers
- bidichk # checks for dangerous unicode character sequences
- bodyclose # checks whether HTTP response body is closed successfully
- canonicalheader # checks whether net/http.Header uses canonical header
- copyloopvar # detects places where loop variables are copied (Go 1.22+)
- gocritic # provides diagnostics that check for bugs, performance and style issues
- misspell # finds commonly misspelled English words in comments and strings
- modernize # detects code that can be modernized to use newer Go features
- testifylint # checks usage of github.com/stretchr/testify
- unconvert # removes unnecessary type conversions
- unparam # reports unused function parameters
- whitespace # detects leading and trailing whitespace
formatters:
enable:
- gofmt
- goimports
settings:
gofmt:
simplify: true
rewrite-rules:
- pattern: 'interface{}'
replacement: 'any'
================================================
FILE: .goreleaser.yaml
================================================
# 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: 2
env:
- GO11MODULE=on
- GO111MODULE=on
- GOPROXY=https://goproxy.io,direct
- CGO_ENABLED=0
before:
hooks:
- go mod tidy
release:
draft: true
builds:
- id: build
main: ./cmd/answer/.
binary: answer
ldflags: -s -w -X github.com/apache/answer/cmd.Version={{.RawVersion}} -X github.com/apache/answer/cmd.Revision={{.ShortCommit}} -X github.com/apache/answer/cmd.Time={{.Date}} -X github.com/apache/answer/cmd.BuildUser=goreleaser
flags: -v
goos:
- linux
- darwin
goarch:
- amd64
- arm64
- id: build-windows
main: ./cmd/answer/.
binary: answer
ldflags: -s -w -X github.com/apache/answer/cmd.Version={{.RawVersion}} -X github.com/apache/answer/cmd.Revision={{.ShortCommit}} -X github.com/apache/answer/cmd.Time={{.Date}} -X github.com/apache/answer/cmd.BuildUser=goreleaser
flags: -v
goos:
- windows
goarch:
- amd64
archives:
- name_template: >-
apache-answer-{{ .RawVersion }}-bin-{{ .Os }}-{{ .Arch }}
files:
- src: "docs/release/LICENSE"
dst: LICENSE
- src: "docs/release/NOTICE"
dst: NOTICE
- src: "docs/release/licenses/*"
dst: licenses/
wrap_in_directory: true
checksum:
name_template: 'checksums.txt'
snapshot:
version_template: "{{ incpatch .Version }}"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
source:
enabled: true
name_template: apache-answer-{{ .RawVersion }}-src
prefix_template: "apache-answer-{{ .RawVersion }}-src/"
# goreleaser release --skip-validate --skip-publish --clean
================================================
FILE: .vaunt/config.yaml
================================================
# 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: 0.0.1
achievements:
- achievement:
name: Visionary Architect
icon: https://raw.githubusercontent.com/apache/answer/main/.vaunt/enhancement.png
description: Awarded for bringing up enhancement, dream big!
triggers:
- trigger:
actor: assignees
action: issue
condition: labels in ['enhancement'] & labels in ['LGTM']
- achievement:
name: Bug Hunter
icon: https://raw.githubusercontent.com/apache/answer/main/.vaunt/bug.png
description: Awarded for identifying real bugs, well spotted!
triggers:
- trigger:
actor: assignees
action: issue
condition: labels in ['bug'] & labels in ['LGTM']
================================================
FILE: .vscode/settings.json
================================================
{
"eslint.workingDirectories": [
"ui"
],
"explorer.autoReveal": "focusNoScroll",
"cSpell.words": [
"grecaptcha"
]
}
================================================
FILE: Dockerfile
================================================
# 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.
FROM golang:1.24-alpine AS golang-builder
LABEL maintainer="linkinstar@apache.org"
ARG GOPROXY
# ENV GOPROXY ${GOPROXY:-direct}
# ENV GOPROXY=https://proxy.golang.com.cn,direct
ENV GOPATH /go
ENV GOROOT /usr/local/go
ENV PACKAGE github.com/apache/answer
ENV BUILD_DIR ${GOPATH}/src/${PACKAGE}
ENV ANSWER_MODULE ${BUILD_DIR}
ARG TAGS="sqlite sqlite_unlock_notify"
ENV TAGS "bindata timetzdata $TAGS"
ARG CGO_EXTRA_CFLAGS
COPY . ${BUILD_DIR}
WORKDIR ${BUILD_DIR}
RUN apk --no-cache add build-base git bash nodejs npm && npm install -g pnpm@9.7.0 \
&& make clean build
RUN chmod 755 answer
RUN ["/bin/bash","-c","script/build_plugin.sh"]
RUN cp answer /usr/bin/answer
RUN mkdir -p /data/uploads && chmod 777 /data/uploads \
&& mkdir -p /data/i18n && cp -r i18n/*.yaml /data/i18n
FROM alpine
LABEL maintainer="linkinstar@apache.org"
ARG TIMEZONE
ENV TIMEZONE=${TIMEZONE:-"Asia/Shanghai"}
RUN apk update \
&& apk --no-cache add \
bash \
ca-certificates \
curl \
dumb-init \
gettext \
openssh \
sqlite \
gnupg \
tzdata \
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone
COPY --from=golang-builder /usr/bin/answer /usr/bin/answer
COPY --from=golang-builder /data /data
COPY /script/entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
VOLUME /data
EXPOSE 80
ENTRYPOINT ["/entrypoint.sh"]
================================================
FILE: LICENSE
================================================
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.
================================================
FILE: Makefile
================================================
.PHONY: build clean ui
VERSION=2.0.0
BIN=answer
DIR_SRC=./cmd/answer
DOCKER_CMD=docker
GO_ENV=CGO_ENABLED=0 GO111MODULE=on
Revision=$(shell git rev-parse --short HEAD 2>/dev/null || echo "")
GO_FLAGS=-ldflags="-X github.com/apache/answer/cmd.Version=$(VERSION) -X 'github.com/apache/answer/cmd.Revision=$(Revision)' -X 'github.com/apache/answer/cmd.Time=`date +%s`' -extldflags -static"
GO=$(GO_ENV) "$(shell which go)"
GOLANGCI_VERSION ?= v2.6.2
TOOLS_BIN := $(shell mkdir -p build/tools && realpath build/tools)
GOLANGCI = $(TOOLS_BIN)/golangci-lint-$(GOLANGCI_VERSION)
$(GOLANGCI):
rm -f $(TOOLS_BIN)/golangci-lint*
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_VERSION)/install.sh | sh -s -- -b $(TOOLS_BIN) $(GOLANGCI_VERSION)
mv $(TOOLS_BIN)/golangci-lint $(TOOLS_BIN)/golangci-lint-$(GOLANGCI_VERSION)
build: generate
@$(GO) build $(GO_FLAGS) -o $(BIN) $(DIR_SRC)
# https://dev.to/thewraven/universal-macos-binaries-with-go-1-16-3mm3
universal: generate
@GOOS=darwin GOARCH=amd64 $(GO_ENV) $(GO) build $(GO_FLAGS) -o ${BIN}_amd64 $(DIR_SRC)
@GOOS=darwin GOARCH=arm64 $(GO_ENV) $(GO) build $(GO_FLAGS) -o ${BIN}_arm64 $(DIR_SRC)
@lipo -create -output ${BIN} ${BIN}_amd64 ${BIN}_arm64
@rm -f ${BIN}_amd64 ${BIN}_arm64
generate:
@$(GO) get github.com/swaggo/swag/cmd/swag@v1.16.3
@$(GO) get github.com/google/wire/cmd/wire@v0.5.0
@$(GO) get go.uber.org/mock/mockgen@v0.6.0
@$(GO) install github.com/swaggo/swag/cmd/swag@v1.16.3
@$(GO) install github.com/google/wire/cmd/wire@v0.5.0
@$(GO) install go.uber.org/mock/mockgen@v0.6.0
@$(GO) generate ./...
@$(GO) mod tidy
check:
@mockgen -version
@swag -v
@wire flags
test:
@$(GO) test ./internal/repo/repo_test
# clean all build result
clean:
@$(GO) clean ./...
@rm -f $(BIN)
install-ui-packages:
@corepack enable
@corepack prepare pnpm@9.7.0 --activate
ui:
@cd ui && pnpm pre-install && pnpm build && cd -
lint: generate $(GOLANGCI)
@bash ./script/check-asf-header.sh
$(GOLANGCI) run
lint-fix: generate $(GOLANGCI)
@bash ./script/check-asf-header.sh
$(GOLANGCI) run --fix
all: clean build
================================================
FILE: NOTICE
================================================
Apache Answer
Copyright 2023-2025 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).
================================================
FILE: README.md
================================================
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.0
```
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)
================================================
FILE: build/README.md
================================================
# /build
Packaging and Continuous Integration.
================================================
FILE: charts/.helmignore
================================================
# 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/
================================================
FILE: charts/Chart.yaml
================================================
# 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"
================================================
FILE: charts/README.md
================================================
# 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
```
================================================
FILE: charts/templates/_helpers.tpl
================================================
{{/*
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 }}
================================================
FILE: charts/templates/deployment.yaml
================================================
# 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 }}
{{- if .Values.env }}
env:
{{- range .Values.env }}
- name: {{ .name }}
{{- if .value | quote }}
value: {{ .value | quote }}
{{- end }}
{{- if .valueFrom }}
valueFrom:
{{- toYaml .valueFrom | nindent 16 }}
{{- end }}
{{- 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 }}
================================================
FILE: charts/templates/hpa.yaml
================================================
# 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 }}
================================================
FILE: charts/templates/ingress.yaml
================================================
# 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 }}
================================================
FILE: charts/templates/pvc.yaml
================================================
# 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 }}
================================================
FILE: charts/templates/service.yaml
================================================
# 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 }}
================================================
FILE: charts/templates/serviceaccount.yaml
================================================
# 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 }}
================================================
FILE: charts/values.yaml
================================================
# 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: {}
================================================
FILE: cmd/answer/main.go
================================================
/*
* 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()
}
================================================
FILE: cmd/command.go
================================================
/*
* 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)
}
}
================================================
FILE: cmd/main.go
================================================
/*
* 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)),
)
}
================================================
FILE: cmd/wire.go
================================================
//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,
))
}
================================================
FILE: cmd/wire_gen.go
================================================
//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/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/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)
reviewService := review2.NewReviewService(reviewRepo, objService, userCommon, userRepo, questionRepo, answerRepo, userRoleRelService, externalService, tagCommonService, questionCommon, noticequeueService, siteInfoCommonService, commentCommonRepo)
commentService := comment2.NewCommentService(commentRepo, commentCommonRepo, userCommon, objService, voteRepo, emailService, userRepo, noticequeueService, externalService, service, eventqueueService, reviewService)
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)
answerService := content.NewAnswerService(answerRepo, questionRepo, questionCommon, userCommon, collectionCommon, userRepo, revisionService, answerActivityService, answerCommon, voteRepo, emailService, userRoleRelService, noticequeueService, externalService, service, reviewService, eventqueueService)
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)
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)
mcpController := controller.NewMCPController(searchService, siteInfoCommonService, tagCommonService, questionCommon, commentRepo, userCommon, answerRepo, featureToggleService)
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
}
================================================
FILE: configs/config.go
================================================
/*
* 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
================================================
FILE: configs/config.yaml
================================================
# 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: ''
================================================
FILE: configs/path_ignore.yaml
================================================
# 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
================================================
FILE: configs/reserved-usernames.json
================================================
["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"]
================================================
FILE: crowdin.yml
================================================
# 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
================================================
FILE: docker-compose.yaml
================================================
# 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:
================================================
FILE: docs/docs.go
================================================
/*
* 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"
},
"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",
"properties": {
"allow_email_domains": {
"type": "array",
"items": {
"type": "string"
}
},
"allow_email_registrations": {
"type": "boolean"
},
"allow_new_registrations": {
"type": "boolean"
},
"allow_password_login": {
"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"
}
}
},
"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)
}
================================================
FILE: docs/release/LICENSE
================================================
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) react-helmet-async (https://github.com/staylor/react-helmet-async) [link](./licenses/LICENSE-staylor-react-helmet-async.txt)
(Apache License, Version 2.0) golang-mock (https://github.com/golang/mock) [link](./licenses/LICENSE-golang-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) 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) 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) icons (https://github.com/twbs/icons) [link](./licenses/LICENSE-twbs-icons.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) @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) 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) i18next (https://github.com/i18next/i18next) [link](./licenses/LICENSE-i18next-i18next.txt)
(MIT License) lodash (https://github.com/lodash/lodash) [link](./licenses/LICENSE-lodash-lodash.txt)
(MIT License) marked (https://github.com/markedjs/marked) [link](./licenses/LICENSE-markedjs-marked.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) swr (https://github.com/vercel/swr) [link](./licenses/LICENSE-vercel-swr.txt)
(MIT License) zustand (https://github.com/pmndrs/zustand) [link](./licenses/LICENSE-pmndrs-zustand.txt)
(MIT License) mozillazg-go-pinyin (https://github.com/mozillazg/go-pinyin) [link](./licenses/LICENSE-mozillazg-go-pinyin.txt)
(MIT License) Machiel-slugify (https://github.com/Machiel/slugify) [link](./licenses/LICENSE-Machiel-slugify.txt)
(MIT License) Masterminds-semver (https://github.com/Masterminds/semver) [link](./licenses/LICENSE-Masterminds-semver.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) disintegration-imaging (https://github.com/disintegration/imaging) [link](./licenses/LICENSE-disintegration-imaging.txt)
(MIT License) gin-gonic-gin (https://github.com/gin-gonic/gin) [link](./licenses/LICENSE-gin-gonic-gin.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) goccy-go-json (https://github.com/goccy/go-json) [link](./licenses/LICENSE-goccy-go-json.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) jordan-wright-email (https://github.com/jordan-wright/email) [link](./licenses/LICENSE-jordan-wright-email.txt)
(MIT License) lib-pq (https://github.com/lib/pq) [link](./licenses/LICENSE-lib-pq.txt)
(MIT License) mattn-go-sqlite3 (https://github.com/mattn/go-sqlite3) [link](./licenses/LICENSE-mattn-go-sqlite3.txt)
(MIT License) segmentfault-pacman (https://github.com/segmentfault/pacman) [link](./licenses/LICENSE-segmentfault-pacman.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) 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) tidwall-gjson (https://github.com/tidwall/gjson) [link](./licenses/LICENSE-tidwall-gjson.txt)
(MIT License) yuin-goldmark (https://github.com/yuin/goldmark) [link](./licenses/LICENSE-yuin-goldmark.txt)
(MIT License) go-gomail-gomail (https://gopkg.in/gomail.v2) [link](./licenses/LICENSE-go-gomail-gomail.txt)
(MIT License) front-matter (https://github.com/jxson/front-matter) [link](./licenses/LICENSE-jxson-front-matter.txt)
(MIT License) js-sha256 (https://github.com/emn178/js-sha256) [link](./licenses/LICENSE-emn178-js-sha256.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 2-Clause) xorm (https://xorm.io/xorm) [link](./licenses/LICENSE-xorm.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) microcosm-cc-bluemonday (https://github.com/microcosm-cc/bluemonday) [link](./licenses/LICENSE-microcosm-cc-bluemonday.txt)
(BSD 3-Clause) cznic-sqlite (https://modernc.org/sqlite) [link](./licenses/LICENSE-cznic-sqlite.txt)
(BSD 3-Clause) jsdiff (https://github.com/kpdecker/jsdiff) [link](./licenses/LICENSE-kpdecker-jsdiff.txt)
(BSD 3-Clause) qs (https://github.com/ljharb/qs) [link](./licenses/LICENSE-ljharb-qs.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)
================================================
FILE: docs/release/NOTICE
================================================
Apache Answer
Copyright 2025 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).
================================================
FILE: docs/release/licenses/LICENSE-JedWatson-classnames.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-Machiel-slugify.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-Masterminds-semver.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-Qix--color.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-anargu-gin-brotli.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-asaskevich-govalidator.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-axios-axios.txt
================================================
# 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.
================================================
FILE: docs/release/licenses/LICENSE-bwmarrin-snowflake.txt
================================================
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.
================================================
FILE: docs/release/licenses/LICENSE-codemirror-basic-setup.txt
================================================
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"
================================================
FILE: go.mod
================================================
// 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.24.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/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.41.0
golang.org/x/image v0.20.0
golang.org/x/net v0.43.0
golang.org/x/term v0.34.0
golang.org/x/text v0.28.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/sys v0.35.0 // indirect
golang.org/x/tools v0.36.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
================================================
FILE: go.sum
================================================
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/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.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
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.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
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.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
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.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
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.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
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.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
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.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
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.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
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=
================================================
FILE: i18n/af_ZA.yaml
================================================
# 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.