chore: update list memos

This commit is contained in:
Steven
2023-12-06 22:44:49 +08:00
parent 055a327b5e
commit fa6693a7ae
8 changed files with 111 additions and 296 deletions

View File

@ -147,9 +147,7 @@ func (s *APIV1Service) registerMemoRoutes(g *echo.Group) {
// @Router /api/v1/memo [GET]
func (s *APIV1Service) GetMemoList(c echo.Context) error {
ctx := c.Request().Context()
hasParentFlag := false
find := &store.FindMemo{
HasParent: &hasParentFlag,
OrderByPinned: true,
}
if userID, err := util.ConvertStringToInt32(c.QueryParam("creatorId")); err == nil {
@ -450,10 +448,7 @@ func (s *APIV1Service) CreateMemo(c echo.Context) error {
// - creatorUsername is listed at ./web/src/helpers/api.ts:82, but it's not present here
func (s *APIV1Service) GetAllMemos(c echo.Context) error {
ctx := c.Request().Context()
hasParentFlag := false
findMemoMessage := &store.FindMemo{
HasParent: &hasParentFlag,
}
findMemoMessage := &store.FindMemo{}
_, ok := c.Get(userIDContextKey).(int32)
if !ok {
findMemoMessage.VisibilityList = []store.Visibility{store.Public}
@ -510,10 +505,8 @@ func (s *APIV1Service) GetAllMemos(c echo.Context) error {
func (s *APIV1Service) GetMemoStats(c echo.Context) error {
ctx := c.Request().Context()
normalStatus := store.Normal
hasParentFlag := false
findMemoMessage := &store.FindMemo{
RowStatus: &normalStatus,
HasParent: &hasParentFlag,
ExcludeContent: true,
}
if creatorID, err := util.ConvertStringToInt32(c.QueryParam("creatorId")); err == nil {
@ -744,8 +737,16 @@ func (s *APIV1Service) UpdateMemo(c echo.Context) error {
return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Memo not found: %d", memoID))
}
memoMessage, err := s.convertMemoFromStore(ctx, memo)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to compose memo").SetInternal(err)
}
if patchMemoRequest.ResourceIDList != nil {
addedResourceIDList, removedResourceIDList := getIDListDiff(memo.ResourceIDList, patchMemoRequest.ResourceIDList)
originResourceIDList := []int32{}
for _, resource := range memoMessage.ResourceList {
originResourceIDList = append(originResourceIDList, resource.ID)
}
addedResourceIDList, removedResourceIDList := getIDListDiff(originResourceIDList, patchMemoRequest.ResourceIDList)
for _, resourceID := range addedResourceIDList {
if _, err := s.Store.UpdateResource(ctx, &store.UpdateResource{
ID: resourceID,
@ -764,15 +765,15 @@ func (s *APIV1Service) UpdateMemo(c echo.Context) error {
}
if patchMemoRequest.RelationList != nil {
patchMemoRelationList := make([]*store.MemoRelation, 0)
patchMemoRelationList := make([]*MemoRelation, 0)
for _, memoRelation := range patchMemoRequest.RelationList {
patchMemoRelationList = append(patchMemoRelationList, &store.MemoRelation{
patchMemoRelationList = append(patchMemoRelationList, &MemoRelation{
MemoID: memo.ID,
RelatedMemoID: memoRelation.RelatedMemoID,
Type: store.MemoRelationType(memoRelation.Type),
Type: memoRelation.Type,
})
}
addedMemoRelationList, removedMemoRelationList := getMemoRelationListDiff(memo.RelationList, patchMemoRelationList)
addedMemoRelationList, removedMemoRelationList := getMemoRelationListDiff(memoMessage.RelationList, patchMemoRelationList)
for _, memoRelation := range addedMemoRelationList {
if _, err := s.Store.UpsertMemoRelation(ctx, memoRelation); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert memo relation").SetInternal(err)
@ -810,7 +811,7 @@ func (s *APIV1Service) UpdateMemo(c echo.Context) error {
}
func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Memo) (*Memo, error) {
memoResponse := &Memo{
memoMessage := &Memo{
ID: memo.ID,
RowStatus: RowStatus(memo.RowStatus.String()),
CreatorID: memo.CreatorID,
@ -823,63 +824,81 @@ func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Mem
// Compose creator name.
user, err := s.Store.GetUser(ctx, &store.FindUser{
ID: &memoResponse.CreatorID,
ID: &memoMessage.CreatorID,
})
if err != nil {
return nil, err
}
if user.Nickname != "" {
memoResponse.CreatorName = user.Nickname
memoMessage.CreatorName = user.Nickname
} else {
memoResponse.CreatorName = user.Username
memoMessage.CreatorName = user.Username
}
memoResponse.CreatorUsername = user.Username
memoMessage.CreatorUsername = user.Username
// Compose display ts.
memoResponse.DisplayTs = memoResponse.CreatedTs
memoMessage.DisplayTs = memoMessage.CreatedTs
// Find memo display with updated ts setting.
memoDisplayWithUpdatedTs, err := s.getMemoDisplayWithUpdatedTsSettingValue(ctx)
if err != nil {
return nil, err
}
if memoDisplayWithUpdatedTs {
memoResponse.DisplayTs = memoResponse.UpdatedTs
memoMessage.DisplayTs = memoMessage.UpdatedTs
}
// Compose related resources.
resourceList, err := s.Store.ListResources(ctx, &store.FindResource{
MemoID: &memo.ID,
})
if err != nil {
return nil, errors.Wrapf(err, "failed to list resources")
}
memoMessage.ResourceList = []*Resource{}
for _, resource := range resourceList {
memoMessage.ResourceList = append(memoMessage.ResourceList, convertResourceFromStore(resource))
}
// Compose related memo relations.
relationList := []*MemoRelation{}
for _, relation := range memo.RelationList {
tempList, err := s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
MemoID: &memo.ID,
})
if err != nil {
return nil, err
}
for _, relation := range tempList {
relationList = append(relationList, convertMemoRelationFromStore(relation))
}
memoResponse.RelationList = relationList
resourceList := []*Resource{}
for _, resourceID := range memo.ResourceIDList {
resource, err := s.Store.GetResource(ctx, &store.FindResource{
ID: &resourceID,
})
if resource != nil && err == nil {
resourceList = append(resourceList, convertResourceFromStore(resource))
}
tempList, err = s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
RelatedMemoID: &memo.ID,
})
if err != nil {
return nil, err
}
memoResponse.ResourceList = resourceList
if memo.ParentID != nil {
parentMemo, err := s.Store.GetMemo(ctx, &store.FindMemo{
ID: memo.ParentID,
})
if err != nil {
return nil, err
}
if parentMemo != nil {
parent, err := s.convertMemoFromStore(ctx, parentMemo)
for _, relation := range tempList {
relationList = append(relationList, convertMemoRelationFromStore(relation))
}
memoMessage.RelationList = relationList
for _, relation := range memoMessage.RelationList {
if relation.MemoID == memoMessage.ID && relation.Type == MemoRelationComment {
parentMemo, err := s.Store.GetMemo(ctx, &store.FindMemo{
ID: &relation.RelatedMemoID,
})
if err != nil {
return nil, err
}
memoResponse.Parent = parent
if parentMemo != nil {
parent, err := s.convertMemoFromStore(ctx, parentMemo)
if err != nil {
return nil, err
}
memoMessage.Parent = parent
}
}
}
return memoResponse, nil
return memoMessage, nil
}
func (s *APIV1Service) getMemoDisplayWithUpdatedTsSettingValue(ctx context.Context) (bool, error) {
@ -912,7 +931,7 @@ func convertCreateMemoRequestToMemoMessage(memoCreate *CreateMemoRequest) *store
}
}
func getMemoRelationListDiff(oldList, newList []*store.MemoRelation) (addedList, removedList []*store.MemoRelation) {
func getMemoRelationListDiff(oldList, newList []*MemoRelation) (addedList, removedList []*store.MemoRelation) {
oldMap := map[string]bool{}
for _, relation := range oldList {
oldMap[fmt.Sprintf("%d-%s", relation.RelatedMemoID, relation.Type)] = true
@ -924,13 +943,21 @@ func getMemoRelationListDiff(oldList, newList []*store.MemoRelation) (addedList,
for _, relation := range oldList {
key := fmt.Sprintf("%d-%s", relation.RelatedMemoID, relation.Type)
if !newMap[key] {
removedList = append(removedList, relation)
removedList = append(removedList, &store.MemoRelation{
MemoID: relation.MemoID,
RelatedMemoID: relation.RelatedMemoID,
Type: store.MemoRelationType(relation.Type),
})
}
}
for _, relation := range newList {
key := fmt.Sprintf("%d-%s", relation.RelatedMemoID, relation.Type)
if !oldMap[key] {
addedList = append(addedList, relation)
addedList = append(addedList, &store.MemoRelation{
MemoID: relation.MemoID,
RelatedMemoID: relation.RelatedMemoID,
Type: store.MemoRelationType(relation.Type),
})
}
}
return addedList, removedList