blob: bead21c9df70681fefee0995c468c77b4a737ae6 [file]
/*
* 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 schema
import (
"strings"
"github.com/apache/answer/pkg/converter"
"github.com/mark3labs/mcp-go/mcp"
)
const (
MCPSearchCondKeyword = "keyword"
MCPSearchCondUsername = "username"
MCPSearchCondScore = "score"
MCPSearchCondTag = "tag"
MCPSearchCondPage = "page"
MCPSearchCondPageSize = "page_size"
MCPSearchCondTagName = "tag_name"
MCPSearchCondQuestionID = "question_id"
MCPSearchCondObjectID = "object_id"
)
type MCPSearchCond struct {
Keyword string `json:"keyword"`
Username string `json:"username"`
Score int `json:"score"`
Tags []string `json:"tags"`
QuestionID string `json:"question_id"`
}
type MCPSearchQuestionDetail struct {
QuestionID string `json:"question_id"`
}
type MCPSearchCommentCond struct {
ObjectID string `json:"object_id"`
}
type MCPSearchTagCond struct {
TagName string `json:"tag_name"`
}
type MCPSearchUserCond struct {
Username string `json:"username"`
}
type MCPSearchQuestionInfoResp struct {
QuestionID string `json:"question_id"`
Title string `json:"title"`
Content string `json:"content"`
Link string `json:"link"`
}
type MCPSearchAnswerInfoResp struct {
QuestionID string `json:"question_id"`
QuestionTitle string `json:"question_title,omitempty"`
AnswerID string `json:"answer_id"`
AnswerContent string `json:"answer_content"`
Link string `json:"link"`
}
type MCPSearchTagResp struct {
TagName string `json:"tag_name"`
DisplayName string `json:"display_name"`
Description string `json:"description"`
Link string `json:"link"`
}
type MCPSearchUserInfoResp struct {
Username string `json:"username"`
DisplayName string `json:"display_name"`
Avatar string `json:"avatar"`
Link string `json:"link"`
}
type MCPSearchCommentInfoResp struct {
CommentID string `json:"comment_id"`
Content string `json:"content"`
ObjectID string `json:"object_id"`
Link string `json:"link"`
}
func NewMCPSearchCond(request mcp.CallToolRequest) *MCPSearchCond {
cond := &MCPSearchCond{}
if keyword, ok := getRequestValue(request, MCPSearchCondKeyword); ok {
cond.Keyword = keyword
}
if username, ok := getRequestValue(request, MCPSearchCondUsername); ok {
cond.Username = username
}
if score, ok := getRequestNumber(request, MCPSearchCondScore); ok {
cond.Score = score
}
if tag, ok := getRequestValue(request, MCPSearchCondTag); ok {
cond.Tags = strings.Split(tag, ",")
}
if questionID, ok := getRequestValue(request, MCPSearchCondQuestionID); ok {
cond.QuestionID = questionID
}
return cond
}
func NewMCPSearchAnswerCond(request mcp.CallToolRequest) *MCPSearchCond {
cond := &MCPSearchCond{}
if questionID, ok := getRequestValue(request, MCPSearchCondQuestionID); ok {
cond.QuestionID = questionID
}
return cond
}
func NewMCPSearchQuestionDetail(request mcp.CallToolRequest) *MCPSearchQuestionDetail {
cond := &MCPSearchQuestionDetail{}
if questionID, ok := getRequestValue(request, MCPSearchCondQuestionID); ok {
cond.QuestionID = questionID
}
return cond
}
func NewMCPSearchCommentCond(request mcp.CallToolRequest) *MCPSearchCommentCond {
cond := &MCPSearchCommentCond{}
if keyword, ok := getRequestValue(request, MCPSearchCondObjectID); ok {
cond.ObjectID = keyword
}
return cond
}
func NewMCPSearchTagCond(request mcp.CallToolRequest) *MCPSearchTagCond {
cond := &MCPSearchTagCond{}
if tagName, ok := getRequestValue(request, MCPSearchCondTagName); ok {
cond.TagName = tagName
}
return cond
}
func NewMCPSearchUserCond(request mcp.CallToolRequest) *MCPSearchUserCond {
cond := &MCPSearchUserCond{}
if username, ok := getRequestValue(request, MCPSearchCondUsername); ok {
cond.Username = username
}
return cond
}
func getRequestValue(request mcp.CallToolRequest, key string) (string, bool) {
value, ok := request.GetArguments()[key].(string)
if !ok {
return "", false
}
return value, true
}
func getRequestNumber(request mcp.CallToolRequest, key string) (int, bool) {
value, ok := request.GetArguments()[key].(float64)
if !ok {
return 0, false
}
return int(value), true
}
func (cond *MCPSearchCond) ToQueryString() string {
var queryBuilder strings.Builder
if len(cond.Keyword) > 0 {
queryBuilder.WriteString(cond.Keyword)
}
if len(cond.Username) > 0 {
queryBuilder.WriteString(" user:" + cond.Username)
}
if cond.Score > 0 {
queryBuilder.WriteString(" score:" + converter.IntToString(int64(cond.Score)))
}
if len(cond.Tags) > 0 {
for _, tag := range cond.Tags {
queryBuilder.WriteString(" [" + tag + "]")
}
}
return strings.TrimSpace(queryBuilder.String())
}