/* * 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. */ export interface FormValue { value: T; isInvalid: boolean; errorMsg: string; [prop: string]: any; } export interface FormDataType { [prop: string]: FormValue; } export interface FieldError { error_field: string; error_msg: string; } export interface Paging { page: number; page_size?: number; } export type ReportType = 'question' | 'answer' | 'comment' | 'user'; export type ReportAction = 'close' | 'flag' | 'review'; export interface ReportParams { type: ReportType; action: ReportAction; } export interface TagBase { display_name: string; slug_name: string; original_text?: string; recommend?: boolean; reserved?: boolean; } export interface Tag extends TagBase { main_tag_slug_name?: string; parsed_text?: string; tag_id?: string; } export interface SynonymsTag extends Tag { tag_id: string; tag?: string; } export interface TagInfo extends TagBase { tag_id: string; original_text: string; parsed_text: string; follow_count: number; question_count: number; is_follower: boolean; member_actions; created_at?; updated_at?; main_tag_slug_name?: string; excerpt?; status: string; } export interface QuestionParams extends ImgCodeReq { title: string; url_title?: string; content: string; tags: Tag[]; } export interface QuestionWithAnswer extends QuestionParams { answer_content: string; } export interface ListResult { count: number; list: T[]; } export interface AnswerParams extends ImgCodeReq { content: string; html: string; question_id: string; id: string; edit_summary?: string; } export interface LoginReqParams { e_mail: string; /** password */ pass: string; captcha_id?: string; captcha_code?: string; } export interface RegisterReqParams extends LoginReqParams { name: string; } export interface ModifyPasswordReq { old_pass: string; pass: string; } /** User */ export interface ModifyUserReq { display_name: string; username?: string; avatar: any; bio: string; bio_html?: string; location: string; website: string; } enum RoleId { User = 1, Admin = 2, Moderator = 3, } export interface User { username: string; rank: number; vote_count: number; display_name: string; avatar: string; } export interface UserInfoBase { id?: string; avatar: any; username: string; display_name: string; rank: number; website: string; location: string; ip_info?: string; status?: 'normal' | 'suspended' | 'deleted' | 'inactive'; /** roles */ role_id?: RoleId; } export interface UserInfoRes extends UserInfoBase { bio: string; bio_html: string; create_time?: string; /** * value = 1 active; * value = 2 inactivated */ mail_status: number; language: string; e_mail?: string; have_password: boolean; [prop: string]: any; } export type UploadType = 'post' | 'avatar' | 'branding' | 'post_attachment'; export interface UploadReq { file: FormData; } export interface ImgCodeReq { captcha_id?: string; captcha_code?: string; } export interface ImgCodeRes { captcha_id: string; captcha_img: string; verify: boolean; } export interface PasswordResetReq extends ImgCodeReq { e_mail: string; } export interface PasswordReplaceReq extends ImgCodeReq { code: string; pass: string; } export interface CaptchaReq extends ImgCodeReq { verify: ImgCodeRes['verify']; } export type CaptchaKey = | 'email' | 'password' | 'edit_userinfo' | 'question' | 'answer' | 'comment' | 'edit' | 'invitation_answer' | 'search' | 'report' | 'delete' | 'vote'; export interface SetNoticeReq { notice_switch: boolean; } export interface NotificationBadgeAward { notification_id: string; badge_id: string; name: string; icon: string; level: number; } export interface NotificationStatus { inbox: number; achievement: number; revision: number; can_revision: boolean; badge_award: NotificationBadgeAward | null; } export interface QuestionDetailRes { id: string; title: string; content: string; html: string; tags: any[]; view_count: number; unique_view_count?: number; answer_count: number; favorites_count: number; follow_counts: 0; accepted_answer_id: string; last_answer_id: string; create_time: string; update_time: string; user_info: UserInfoBase; answered: boolean; collected: boolean; answer_ids: string[]; [prop: string]: any; } export interface AnswersReq extends Paging { order?: 'default' | 'updated' | 'created'; question_id: string; } export interface AnswerItem { id: string; question_id: string; content: string; html: string; create_time: string; update_time: string; user_info: UserInfoBase; [prop: string]: any; } export interface PostAnswerReq extends ImgCodeReq { content: string; html?: string; question_id: string; } export interface PageUser { id?; displayName; userName?; avatar_url?; } export interface LangsType { label: string; value: string; } /** * @description interface for Question */ export type QuestionOrderBy = | 'recommend' | 'newest' | 'active' | 'hot' | 'score' | 'unanswered' | 'frequent'; export interface QueryQuestionsReq extends Paging { order: QuestionOrderBy; tag?: string; in_days?: number; } export type AdminQuestionStatus = | 'available' | 'pending' | 'closed' | 'deleted'; export type AdminContentsFilterBy = 'normal' | 'pending' | 'closed' | 'deleted'; export interface AdminContentsReq extends Paging { status: AdminContentsFilterBy; query?: string; } /** * @description interface for Answer */ export type AdminAnswerStatus = 'available' | 'deleted'; /** * @description interface for Users */ export type UserFilterBy = | 'normal' | 'staff' | 'inactive' | 'suspended' | 'deleted'; export type BadgeFilterBy = 'all' | 'active' | 'inactive'; export type InstalledPluginsFilterBy = | 'all' | 'active' | 'inactive' | 'outdated'; /** * @description interface for Flags */ export type FlagStatus = 'pending' | 'completed'; export type FlagType = 'all' | 'question' | 'answer' | 'comment'; export interface AdminFlagsReq extends Paging { status: FlagStatus; object_type: FlagType; } /** * @description interface for Admin Settings */ export interface AdminSettingsGeneral { name: string; short_description: string; description: string; site_url: string; contact_email: string; permalink?: number; } export interface HelmetBase { pageTitle?: string; description?: string; keywords?: string; } export interface HelmetUpdate extends Omit { title?: string; subtitle?: string; } export interface AdminSettingsInterface { language: string; time_zone?: string; } export interface AdminSettingsSmtp { encryption: string; from_email: string; from_name: string; smtp_authentication: boolean; smtp_host: string; smtp_password?: string; smtp_port: number; smtp_username?: string; test_email_recipient?: string; } export interface AdminSettingsUsers { allow_update_avatar: boolean; allow_update_bio: boolean; allow_update_display_name: boolean; allow_update_location: boolean; allow_update_username: boolean; allow_update_website: boolean; default_avatar: string; gravatar_base_url: string; } export interface AdminSettingsSecurity { external_content_display: string; check_update: boolean; login_required: boolean; } export interface SiteSettings { branding: AdminSettingBranding; general: AdminSettingsGeneral; interface: AdminSettingsInterface; login: AdminSettingsLogin; custom_css_html: AdminSettingsCustom; theme: AdminSettingsTheme; site_seo: AdminSettingsSeo; site_users: AdminSettingsUsers; site_advanced: AdminSettingsWrite; site_questions: AdminQuestionSetting; site_tags: AdminTagsSetting; version: string; revision: string; site_security: AdminSettingsSecurity; ai_enabled: boolean; } export interface AdminSettingBranding { logo: string; square_icon: string; mobile_logo?: string; favicon?: string; } export interface AdminSettingsLegal { privacy_policy_original_text?: string; privacy_policy_parsed_text?: string; terms_of_service_original_text?: string; terms_of_service_parsed_text?: string; } export interface AdminSettingsWrite { max_image_size?: number; max_attachment_size?: number; max_image_megapixel?: number; authorized_image_extensions?: string[]; authorized_attachment_extensions?: string[]; } export interface AdminSettingsSeo { robots: string; /** * 0: not set * 1:with title * 2: no title */ permalink: number; } export type themeConfig = { navbar_style: string; primary_color: string; [k: string]: string | number; }; export interface AdminSettingsTheme { theme: string; color_scheme: string; layout: string; theme_options?: { label: string; value: string }[]; theme_config: Record; } export interface AdminSettingsCustom { custom_css: string; custom_head: string; custom_header: string; custom_footer: string; custom_sidebar: string; } export interface AdminSettingsLogin { allow_new_registrations: boolean; allow_email_registrations: boolean; allow_email_domains: string[]; allow_password_login: boolean; require_email_verification: boolean; } /** * @description interface for Activity */ export interface FollowParams { is_cancel: boolean; object_id: string; } /** * @description search request params */ export interface SearchParams extends ImgCodeReq { q: string; order: string; page: number; size?: number; } /** * @description search response data */ export interface SearchResItem { object_type: string; object: { url_title?: string; id: string; question_id?: string; title: string; excerpt: string; created_at: number; user_info: UserInfoBase; vote_count: number; answer_count: number; accepted: boolean; tags: TagBase[]; status?: string; }; } export interface SearchRes extends ListResult { extra: any; } export interface AdminDashboard { info: { question_count: number; resolved_count: number; resolved_rate: string; unanswered_count: number; unanswered_rate: string; answer_count: number; comment_count: number; vote_count: number; user_count: number; report_count: number; uploading_files: boolean; smtp: 'enabled' | 'disabled' | 'not_configured'; time_zone: string; occupying_storage_space: string; app_start_time: number; https: boolean; login_required: boolean; go_version: string; database_version: string; database_size: string; version_info: { remote_version: string; version: string; }; }; } export interface TimelineReq { show_vote: boolean; object_id: string; } export interface TimelineItem { activity_id: number; revision_id: number; created_at: number; activity_type: string; comment: string; object_id: string; object_type: string; cancelled: boolean; cancelled_at: any; user_info: UserInfoBase; } export interface TimelineObject { title: string; url_title?: string; object_type: string; question_id: string; answer_id: string; main_tag_slug_name?: string; display_name?: string; } export interface TimelineRes { object_info: TimelineObject; timeline: TimelineItem[]; } export interface SuggestReviewItem { type: 'question' | 'answer' | 'tag'; info: { url_title?: string; object_id: string; title: string; content: string; html: string; tags: Tag[]; }; unreviewed_info: { id: string; use_id: string; object_id: string; title: string; status: 0 | 1; create_at: number; user_info: UserInfoBase; reason: string; content: Tag | QuestionDetailRes | AnswerItem; }; } export interface SuggestReviewResp { count: number; list: SuggestReviewItem[]; } export interface ReasonItem { content_type: string; description: string; name: string; placeholder: string; reason_type: number; } export interface BaseReviewItem { object_type: 'question' | 'answer' | 'comment' | 'user'; object_id: string; object_show_status: number; object_status: number; tags: Tag[]; title: string; original_text: string; author_user_info: UserInfoBase; created_at: number; submit_at: number; comment_id: string; question_id: string; answer_id: string; answer_count: number; answer_accepted?: boolean; flag_id: string; url_title: string; parsed_text: string; } export interface FlagReviewItem extends BaseReviewItem { reason: ReasonItem; reason_content: string; submitter_user: UserInfoBase; } export interface FlagReviewResp { count: number; list: FlagReviewItem[]; } export interface QueuedReviewItem extends BaseReviewItem { review_id: number; reason: string; submitter_display_name: string; } export interface QueuedReviewResp { count: number; list: QueuedReviewItem[]; } export interface UserRoleItem { id: number; name: string; description: string; } export interface MemberActionItem { action: string; name: string; type: string; } export interface QuestionOperationReq { id: string; operation: 'pin' | 'unpin' | 'hide' | 'show'; } export interface OauthBindEmailReq { binding_key: string; email: string; must: boolean; } export interface UserOauthConnectorItem { icon: string; name: string; link: string; binding: boolean; external_id: string; } export interface NotificationConfigItem { enable: boolean; key: string; } export interface NotificationConfig { all_new_question: NotificationConfigItem; all_new_question_for_following_tags: NotificationConfigItem; inbox: NotificationConfigItem; } export interface ActivatedPlugin { slug_name: string; enabled: boolean; } export interface UserPluginsConfigRes { name: string; slug_name: string; } export interface ReviewTypeItem { label: string; name: string; todo_amount: number; } export interface PutFlagReviewParams { operation_type: | 'edit_post' | 'close_post' | 'delete_post' | 'unlist_post' | 'ignore_report'; flag_id: string; close_msg?: string; close_type?: number; title?: string; content?: string; tags?: Tag[]; // mention_username_list?: any; captcha_code?: any; captcha_id?: any; } /** * @description response for reaction */ export interface ReactionItems { reaction_summary: ReactionItem[]; } export interface ReactionItem { emoji: string; count: number; tooltip: string; is_active: boolean; } export interface BadgeListItem { id: string; name: string; icon: string; award_count: number; earned: boolean; /** 1: bronze 2: silver 3:gold */ level: number; earned_count?: number; } export interface BadgeListGroupItem { badges: BadgeListItem[]; group_name: string; } export interface BadgeInfo extends BadgeListItem { description: string; earned_count: number; is_single: boolean; } export interface AdminBadgeListItem extends BadgeListItem { group_name: string; status: string; description: string; } export interface BadgeDetailListReq { page: number; page_size: number; badge_id: string; username?: string | null; } export interface BadgeDetailListItem { created_at: number; author_user_info: UserInfoBase; object_type: string; object_id: string; url_title: string; question_id: string; answer_id: string; comment_id: string; } export interface BadgeDetailListRes { count: number; list: BadgeDetailListItem[]; } export interface AdminApiKeysItem { access_key: string; created_at: number; description: string; id: number; last_used_at: number; scope: string; } export interface AddOrEditApiKeyParams { description: string; scope?: string; id?: number; } export interface AiConfig { enabled: boolean; chosen_provider: string; ai_providers: Array<{ provider: string; api_host: string; api_key: string; model: string; }>; } export interface AiProviderItem { name: string; display_name: string; default_api_host: string; } export interface ConversationListItem { conversation_id: string; created_at: number; topic: string; } export interface AdminConversationListItem { id: string; topic: string; helpful_count: number; unhelpful_count: number; created_at: number; user_info: UserInfoBase; } export interface ConversationDetailItem { chat_completion_id: string; content: string; reasoning_content?: string; role: string; helpful: number; unhelpful: number; created_at: number; } export interface ConversationDetail { conversation_id: string; created_at: number; records: ConversationDetailItem[]; topic: string; updated_at: number; } export interface VoteConversationParams { cancel: boolean; chat_completion_id: string; vote_type: 'helpful' | 'unhelpful'; } export interface AdminQuestionSetting { min_tags: number; min_content: number; restrict_answer: boolean; } export interface AdminTagsSetting { recommend_tags: Tag[]; required_tag: boolean; reserved_tags: Tag[]; }