| /* |
| * 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 object_info |
| |
| import ( |
| "context" |
| |
| "github.com/apache/answer/internal/base/constant" |
| "github.com/apache/answer/internal/base/reason" |
| "github.com/apache/answer/internal/schema" |
| answercommon "github.com/apache/answer/internal/service/answer_common" |
| "github.com/apache/answer/internal/service/comment_common" |
| questioncommon "github.com/apache/answer/internal/service/question_common" |
| tagcommon "github.com/apache/answer/internal/service/tag_common" |
| "github.com/apache/answer/pkg/checker" |
| "github.com/apache/answer/pkg/obj" |
| "github.com/segmentfault/pacman/errors" |
| ) |
| |
| // ObjService user service |
| type ObjService struct { |
| answerRepo answercommon.AnswerRepo |
| questionRepo questioncommon.QuestionRepo |
| commentRepo comment_common.CommentCommonRepo |
| tagRepo tagcommon.TagCommonRepo |
| tagCommon *tagcommon.TagCommonService |
| } |
| |
| // NewObjService new object service |
| func NewObjService( |
| answerRepo answercommon.AnswerRepo, |
| questionRepo questioncommon.QuestionRepo, |
| commentRepo comment_common.CommentCommonRepo, |
| tagRepo tagcommon.TagCommonRepo, |
| tagCommon *tagcommon.TagCommonService, |
| ) *ObjService { |
| return &ObjService{ |
| answerRepo: answerRepo, |
| questionRepo: questionRepo, |
| commentRepo: commentRepo, |
| tagRepo: tagRepo, |
| tagCommon: tagCommon, |
| } |
| } |
| func (os *ObjService) GetUnreviewedRevisionInfo(ctx context.Context, objectID string) (objInfo *schema.UnreviewedRevisionInfoInfo, err error) { |
| objectType, err := obj.GetObjectTypeStrByObjectID(objectID) |
| if err != nil { |
| return nil, err |
| } |
| switch objectType { |
| case constant.QuestionObjectType: |
| questionInfo, exist, err := os.questionRepo.GetQuestion(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| taglist, err := os.tagCommon.GetObjectEntityTag(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| os.tagCommon.TagsFormatRecommendAndReserved(ctx, taglist) |
| tags, err := os.tagCommon.TagFormat(ctx, taglist) |
| if err != nil { |
| return nil, err |
| } |
| objInfo = &schema.UnreviewedRevisionInfoInfo{ |
| CreatedAt: questionInfo.CreatedAt.Unix(), |
| ObjectID: questionInfo.ID, |
| QuestionID: questionInfo.ID, |
| ObjectType: objectType, |
| ObjectCreatorUserID: questionInfo.UserID, |
| Title: questionInfo.Title, |
| Content: questionInfo.OriginalText, |
| Html: questionInfo.ParsedText, |
| AnswerCount: questionInfo.AnswerCount, |
| AnswerAccepted: !checker.IsNotZeroString(questionInfo.AcceptedAnswerID), |
| Tags: tags, |
| Status: questionInfo.Status, |
| ShowStatus: questionInfo.Show, |
| } |
| case constant.AnswerObjectType: |
| answerInfo, exist, err := os.answerRepo.GetAnswer(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| |
| questionInfo, exist, err := os.questionRepo.GetQuestion(ctx, answerInfo.QuestionID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.UnreviewedRevisionInfoInfo{ |
| CreatedAt: answerInfo.CreatedAt.Unix(), |
| ObjectID: answerInfo.ID, |
| QuestionID: answerInfo.QuestionID, |
| AnswerID: answerInfo.ID, |
| ObjectType: objectType, |
| ObjectCreatorUserID: answerInfo.UserID, |
| Title: questionInfo.Title, |
| Content: answerInfo.OriginalText, |
| Html: answerInfo.ParsedText, |
| Status: answerInfo.Status, |
| AnswerAccepted: questionInfo.AcceptedAnswerID == answerInfo.ID, |
| } |
| case constant.TagObjectType: |
| tagInfo, exist, err := os.tagRepo.GetTagByID(ctx, objectID, true) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.UnreviewedRevisionInfoInfo{ |
| CreatedAt: tagInfo.CreatedAt.Unix(), |
| ObjectID: tagInfo.ID, |
| ObjectType: objectType, |
| Title: tagInfo.SlugName, |
| Content: tagInfo.OriginalText, |
| Html: tagInfo.ParsedText, |
| Status: tagInfo.Status, |
| } |
| case constant.CommentObjectType: |
| commentInfo, exist, err := os.commentRepo.GetCommentWithoutStatus(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.UnreviewedRevisionInfoInfo{ |
| CreatedAt: commentInfo.CreatedAt.Unix(), |
| ObjectID: commentInfo.ID, |
| CommentID: commentInfo.ID, |
| ObjectType: objectType, |
| ObjectCreatorUserID: commentInfo.UserID, |
| Content: commentInfo.OriginalText, |
| Html: commentInfo.ParsedText, |
| Status: commentInfo.Status, |
| } |
| if len(commentInfo.QuestionID) > 0 { |
| questionInfo, exist, err := os.questionRepo.GetQuestion(ctx, commentInfo.QuestionID) |
| if err != nil { |
| return nil, err |
| } |
| if exist { |
| objInfo.QuestionID = questionInfo.ID |
| } |
| answerInfo, exist, err := os.answerRepo.GetAnswer(ctx, commentInfo.ObjectID) |
| if err != nil { |
| return nil, err |
| } |
| if exist { |
| objInfo.AnswerID = answerInfo.ID |
| } |
| } |
| } |
| if objInfo == nil { |
| err = errors.BadRequest(reason.ObjectNotFound) |
| } |
| return objInfo, err |
| } |
| |
| // GetInfo get object simple information |
| func (os *ObjService) GetInfo(ctx context.Context, objectID string) (objInfo *schema.SimpleObjectInfo, err error) { |
| objectType, err := obj.GetObjectTypeStrByObjectID(objectID) |
| if err != nil { |
| return nil, err |
| } |
| switch objectType { |
| case constant.QuestionObjectType: |
| questionInfo, exist, err := os.questionRepo.GetQuestion(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.SimpleObjectInfo{ |
| ObjectID: questionInfo.ID, |
| ObjectCreatorUserID: questionInfo.UserID, |
| QuestionID: questionInfo.ID, |
| QuestionCreatorUserID: questionInfo.UserID, |
| QuestionStatus: questionInfo.Status, |
| QuestionShow: questionInfo.Show, |
| ObjectType: objectType, |
| Title: questionInfo.Title, |
| Content: questionInfo.ParsedText, // todo trim |
| } |
| case constant.AnswerObjectType: |
| answerInfo, exist, err := os.answerRepo.GetAnswer(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| questionInfo, exist, err := os.questionRepo.GetQuestion(ctx, answerInfo.QuestionID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.SimpleObjectInfo{ |
| ObjectID: answerInfo.ID, |
| ObjectCreatorUserID: answerInfo.UserID, |
| QuestionID: answerInfo.QuestionID, |
| QuestionCreatorUserID: questionInfo.UserID, |
| QuestionStatus: questionInfo.Status, |
| QuestionShow: questionInfo.Show, |
| AnswerStatus: answerInfo.Status, |
| AnswerID: answerInfo.ID, |
| ObjectType: objectType, |
| Title: questionInfo.Title, // this should be question title |
| Content: answerInfo.ParsedText, // todo trim |
| } |
| case constant.CommentObjectType: |
| commentInfo, exist, err := os.commentRepo.GetComment(ctx, objectID) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.SimpleObjectInfo{ |
| ObjectID: commentInfo.ID, |
| ObjectCreatorUserID: commentInfo.UserID, |
| ObjectType: objectType, |
| Content: commentInfo.ParsedText, // todo trim |
| CommentID: commentInfo.ID, |
| CommentStatus: commentInfo.Status, |
| } |
| if len(commentInfo.QuestionID) > 0 { |
| questionInfo, exist, err := os.questionRepo.GetQuestion(ctx, commentInfo.QuestionID) |
| if err != nil { |
| return nil, err |
| } |
| if exist { |
| objInfo.QuestionID = questionInfo.ID |
| objInfo.QuestionCreatorUserID = questionInfo.UserID |
| objInfo.QuestionStatus = questionInfo.Status |
| objInfo.QuestionShow = questionInfo.Show |
| objInfo.Title = questionInfo.Title |
| } |
| answerInfo, exist, err := os.answerRepo.GetAnswer(ctx, commentInfo.ObjectID) |
| if err != nil { |
| return nil, err |
| } |
| if exist { |
| objInfo.AnswerID = answerInfo.ID |
| } |
| } |
| case constant.TagObjectType: |
| tagInfo, exist, err := os.tagRepo.GetTagByID(ctx, objectID, true) |
| if err != nil { |
| return nil, err |
| } |
| if !exist { |
| break |
| } |
| objInfo = &schema.SimpleObjectInfo{ |
| ObjectID: tagInfo.ID, |
| ObjectCreatorUserID: tagInfo.UserID, |
| TagID: tagInfo.ID, |
| TagStatus: tagInfo.Status, |
| ObjectType: objectType, |
| Title: tagInfo.SlugName, |
| Content: tagInfo.ParsedText, // todo trim |
| } |
| } |
| if objInfo == nil { |
| err = errors.BadRequest(reason.ObjectNotFound) |
| } |
| return objInfo, err |
| } |