/* * 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 plugin import ( "context" ) type SearchResult struct { // ID content ID ID string // Type content type, example: "answer", "question" Type string } type SearchContent struct { ObjectID string `json:"objectID"` Title string `json:"title"` Type string `json:"type"` Content string `json:"content"` Answers int64 `json:"answers"` Status SearchContentStatus `json:"status"` Tags []string `json:"tags"` QuestionID string `json:"questionID"` UserID string `json:"userID"` Views int64 `json:"views"` Created int64 `json:"created"` Active int64 `json:"active"` Score int64 `json:"score"` HasAccepted bool `json:"hasAccepted"` } type SearchBasicCond struct { // From zero-based page number Page int // Page size PageSize int // The keywords for search. Words []string // TagIDs is a list of tag IDs. TagIDs [][]string // The object's owner user ID. UserID string // The order of the search result. Order SearchOrderCond // Weathers the question is accepted or not. Only support search question. QuestionAccepted SearchAcceptedCond // Weathers the answer is accepted or not. Only support search answer. AnswerAccepted SearchAcceptedCond // Only support search answer. QuestionID string // greater than or equal to the number of votes. VoteAmount int // greater than or equal to the number of views. ViewAmount int // greater than or equal to the number of answers. Only support search question. AnswerAmount int } type SearchAcceptedCond int type SearchContentStatus int type SearchOrderCond string const ( AcceptedCondAll SearchAcceptedCond = iota AcceptedCondTrue AcceptedCondFalse ) const ( SearchContentStatusAvailable = 1 SearchContentStatusDeleted = 10 ) const ( SearchNewestOrder SearchOrderCond = "newest" SearchActiveOrder SearchOrderCond = "active" SearchScoreOrder SearchOrderCond = "score" SearchRelevanceOrder SearchOrderCond = "relevance" ) type Search interface { Base Description() SearchDesc RegisterSyncer(ctx context.Context, syncer SearchSyncer) SearchContents(ctx context.Context, cond *SearchBasicCond) (res []SearchResult, total int64, err error) SearchQuestions(ctx context.Context, cond *SearchBasicCond) (res []SearchResult, total int64, err error) SearchAnswers(ctx context.Context, cond *SearchBasicCond) (res []SearchResult, total int64, err error) UpdateContent(ctx context.Context, content *SearchContent) (err error) DeleteContent(ctx context.Context, objectID string) (err error) } type SearchDesc struct { // A svg icon it wil be display in search result page. optional Icon string `json:"icon"` // The link address of the search engine. optional Link string `json:"link"` } type SearchSyncer interface { GetAnswersPage(ctx context.Context, page, pageSize int) (answerList []*SearchContent, err error) GetQuestionsPage(ctx context.Context, page, pageSize int) (questionList []*SearchContent, err error) } var ( // CallSearch is a function that calls all registered parsers CallSearch, registerSearch = MakePlugin[Search](false) )