internal/service/answer_common/answer.go (105 lines of code) (raw):
/*
* 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 answercommon
import (
"context"
"github.com/apache/answer/internal/base/handler"
"github.com/apache/answer/internal/entity"
"github.com/apache/answer/internal/schema"
"github.com/apache/answer/pkg/htmltext"
"github.com/apache/answer/pkg/uid"
)
type AnswerRepo interface {
AddAnswer(ctx context.Context, answer *entity.Answer) (err error)
RemoveAnswer(ctx context.Context, id string) (err error)
RecoverAnswer(ctx context.Context, answerID string) (err error)
UpdateAnswer(ctx context.Context, answer *entity.Answer, cols []string) (err error)
GetAnswer(ctx context.Context, id string) (answer *entity.Answer, exist bool, err error)
GetAnswerList(ctx context.Context, answer *entity.Answer) (answerList []*entity.Answer, err error)
GetAnswerPage(ctx context.Context, page, pageSize int, answer *entity.Answer) (answerList []*entity.Answer, total int64, err error)
UpdateAcceptedStatus(ctx context.Context, acceptedAnswerID string, questionID string) error
GetByID(ctx context.Context, answerID string) (*entity.Answer, bool, error)
GetByIDs(ctx context.Context, answerIDs ...string) ([]*entity.Answer, error)
GetCountByQuestionID(ctx context.Context, questionID string) (int64, error)
GetCountByUserID(ctx context.Context, userID string) (int64, error)
GetIDsByUserIDAndQuestionID(ctx context.Context, userID string, questionID string) ([]string, error)
SearchList(ctx context.Context, search *entity.AnswerSearch) ([]*entity.Answer, int64, error)
GetPersonalAnswerPage(ctx context.Context, cond *entity.PersonalAnswerPageQueryCond) (
resp []*entity.Answer, total int64, err error)
AdminSearchList(ctx context.Context, search *schema.AdminAnswerPageReq) ([]*entity.Answer, int64, error)
UpdateAnswerStatus(ctx context.Context, answerID string, status int) (err error)
GetAnswerCount(ctx context.Context) (count int64, err error)
RemoveAllUserAnswer(ctx context.Context, userID string) (err error)
SumVotesByQuestionID(ctx context.Context, questionID string) (float64, error)
DeletePermanentlyAnswers(ctx context.Context) (err error)
}
// AnswerCommon user service
type AnswerCommon struct {
answerRepo AnswerRepo
}
func NewAnswerCommon(answerRepo AnswerRepo) *AnswerCommon {
return &AnswerCommon{
answerRepo: answerRepo,
}
}
func (as *AnswerCommon) SearchAnswerIDs(ctx context.Context, userID, questionID string) ([]string, error) {
ids, err := as.answerRepo.GetIDsByUserIDAndQuestionID(ctx, userID, questionID)
if err != nil {
return nil, err
}
return ids, nil
}
func (as *AnswerCommon) AdminSearchList(ctx context.Context, req *schema.AdminAnswerPageReq) (
resp []*entity.Answer, count int64, err error) {
resp, count, err = as.answerRepo.AdminSearchList(ctx, req)
if handler.GetEnableShortID(ctx) {
for _, item := range resp {
item.ID = uid.EnShortID(item.ID)
item.QuestionID = uid.EnShortID(item.QuestionID)
}
}
return resp, count, err
}
func (as *AnswerCommon) Search(ctx context.Context, search *entity.AnswerSearch) ([]*entity.Answer, int64, error) {
list, count, err := as.answerRepo.SearchList(ctx, search)
if err != nil {
return list, count, err
}
return list, count, err
}
func (as *AnswerCommon) PersonalAnswerPage(ctx context.Context,
cond *entity.PersonalAnswerPageQueryCond) ([]*entity.Answer, int64, error) {
return as.answerRepo.GetPersonalAnswerPage(ctx, cond)
}
func (as *AnswerCommon) ShowFormat(ctx context.Context, data *entity.Answer) *schema.AnswerInfo {
info := schema.AnswerInfo{}
info.ID = data.ID
info.QuestionID = data.QuestionID
info.Content = data.OriginalText
info.HTML = data.ParsedText
info.Accepted = data.Accepted
info.VoteCount = data.VoteCount
info.CreateTime = data.CreatedAt.Unix()
info.UpdateTime = data.UpdatedAt.Unix()
if data.UpdatedAt.Unix() < 1 {
info.UpdateTime = 0
}
info.UserID = data.UserID
info.UpdateUserID = data.LastEditUserID
info.Status = data.Status
info.MemberActions = make([]*schema.PermissionMemberAction, 0)
return &info
}
func (as *AnswerCommon) AdminShowFormat(ctx context.Context, data *entity.Answer) *schema.AdminAnswerInfo {
info := schema.AdminAnswerInfo{}
info.ID = data.ID
info.QuestionID = data.QuestionID
info.Accepted = data.Accepted
info.VoteCount = data.VoteCount
info.CreateTime = data.CreatedAt.Unix()
info.UpdateTime = data.UpdatedAt.Unix()
if data.UpdatedAt.Unix() < 1 {
info.UpdateTime = 0
}
info.UserID = data.UserID
info.UpdateUserID = data.LastEditUserID
info.Description = htmltext.FetchExcerpt(data.ParsedText, "...", 240)
return &info
}