feature/fanout #3
			
				
			
		
		
		
	|  | @ -117,6 +117,14 @@ issues: | |||
|         - gocognit | ||||
|         - contextcheck | ||||
| 
 | ||||
|   exclude-dirs: | ||||
|     - internal/model | ||||
| 
 | ||||
|   exclude-files: | ||||
|     - .*_test.go | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| linters-settings: | ||||
|   gci: | ||||
|     sections: | ||||
|  |  | |||
							
								
								
									
										1
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										1
									
								
								Makefile
								
								
								
								
							|  | @ -18,6 +18,7 @@ test: # 進行測試 | |||
| fmt: # 格式優化
 | ||||
| 	$(GOFMT) -w $(GOFILES) | ||||
| 	goimports -w  ./ | ||||
| 	golangci-lint run | ||||
| 
 | ||||
| .PHONY: gen-rpc | ||||
| gen-rpc: # 建立 rpc code
 | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| package domain | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
|  | @ -51,9 +50,7 @@ const ( | |||
| ) | ||||
| 
 | ||||
| func CommentError(ec ErrorCode, s ...string) *ers.LibError { | ||||
| 	return ers.NewError(code.CloudEPTweeting, code.DBError, | ||||
| 		ec.ToUint32(), | ||||
| 		fmt.Sprintf("%s", strings.Join(s, " "))) | ||||
| 	return ers.NewError(code.CloudEPTweeting, code.DBError, ec.ToUint32(), strings.Join(s, " ")) | ||||
| } | ||||
| 
 | ||||
| func CommentErrorL(ec ErrorCode, | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ func NewNeo4J(conf *Config, opts ...Option) *Client { | |||
| // Conn initiates connection to the database and returns a Neo4j driver instance.
 | ||||
| func (c *Client) Conn() (neo4j.DriverWithContext, error) { | ||||
| 	auth := neo4j.BasicAuth(c.serviceConf.Username, c.serviceConf.Password, "") | ||||
| 	driver, err := neo4j.NewDriverWithContext(c.serviceConf.URI, auth, func(c *n4Cfg.Config) {}) | ||||
| 	driver, err := neo4j.NewDriverWithContext(c.serviceConf.URI, auth, func(_ *n4Cfg.Config) {}) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("neo4j driver initialization error: %w", err) | ||||
| 	} | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ func (l *DeleteCommentLogic) DeleteComment(in *tweeting.DeleteCommentReq) (*twee | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to del comment").Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -41,8 +41,8 @@ func convertToCommentDetailItem(item *model.Comment) *tweeting.CommentDetail { | |||
| 		Uid:          item.UID, | ||||
| 		Content:      item.Content, | ||||
| 		CreatedAt:    item.CreateAt, | ||||
| 		LikeCount:    int64(item.LikeCount), | ||||
| 		DislikeCount: int64(item.DisLikeCount), | ||||
| 		LikeCount:    item.LikeCount, | ||||
| 		DislikeCount: item.DisLikeCount, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -82,6 +82,7 @@ func (l *GetCommentsLogic) GetComments(in *tweeting.GetCommentsReq) (*tweeting.G | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to find comment").Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -27,16 +27,16 @@ func NewUpdateCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Upd | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| type checkCommentId struct { | ||||
| 	CommentId string `validate:"required"` | ||||
| type checkCommentID struct { | ||||
| 	CommentID string `validate:"required"` | ||||
| 	Content   string `json:"content,omitempty" validate:"lte=500"` | ||||
| } | ||||
| 
 | ||||
| // UpdateComment 更新評論
 | ||||
| func (l *UpdateCommentLogic) UpdateComment(in *tweeting.UpdateCommentReq) (*tweeting.OKResp, error) { | ||||
| 	// 驗證資料
 | ||||
| 	if err := l.svcCtx.Validate.ValidateAll(&checkCommentId{ | ||||
| 		CommentId: in.GetCommentId(), | ||||
| 	if err := l.svcCtx.Validate.ValidateAll(&checkCommentID{ | ||||
| 		CommentID: in.GetCommentId(), | ||||
| 		Content:   in.GetContent(), | ||||
| 	}); err != nil { | ||||
| 		// 錯誤代碼 05-011-00
 | ||||
|  | @ -75,6 +75,7 @@ func (l *UpdateCommentLogic) UpdateComment(in *tweeting.UpdateCommentReq) (*twee | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to update comment:", in.CommentId).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ type newTweetingReq struct { | |||
| 	UID      string   `json:"uid" validate:"required"` | ||||
| 	Content  string   `json:"content" validate:"required,lte=500"` // 貼文限制 500 字內
 | ||||
| 	Tags     []string `json:"tags"` | ||||
| 	MediaUrl []string `json:"media_url"` | ||||
| 	MediaURL []string `json:"media_url"` | ||||
| 	IsAd     bool     `json:"is_ad"` // default false
 | ||||
| } | ||||
| 
 | ||||
|  | @ -85,6 +85,7 @@ func (l *CreatePostLogic) CreatePost(in *tweeting.NewPostReq) (*tweeting.PostRes | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to add new post").Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ func (l *DeletePostLogic) DeletePost(in *tweeting.DeletePostsReq) (*tweeting.OKR | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to del post").Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,8 +54,8 @@ func convertToPostDetailItem(item *model.Post) *tweeting.PostDetailItem { | |||
| 		IsAd:         item.IsAd, | ||||
| 		CreatedAt:    item.CreateAt, | ||||
| 		UpdateAt:     item.UpdateAt, | ||||
| 		LikeCount:    int64(item.Like), | ||||
| 		DislikeCount: int64(item.DisLike), | ||||
| 		LikeCount:    item.Like, | ||||
| 		DislikeCount: item.DisLike, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -102,6 +102,7 @@ func (l *ListPostsLogic) ListPosts(in *tweeting.QueryPostsReq) (*tweeting.ListPo | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to find posts").Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ func NewUpdatePostLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Update | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| type checkPostId struct { | ||||
| type checkPostID struct { | ||||
| 	PostID  string `validate:"required"` | ||||
| 	Content string `json:"content,omitempty" validate:"lte=500"` | ||||
| } | ||||
|  | @ -36,7 +36,7 @@ type checkPostId struct { | |||
| // UpdatePost 更新貼文
 | ||||
| func (l *UpdatePostLogic) UpdatePost(in *tweeting.UpdatePostReq) (*tweeting.OKResp, error) { | ||||
| 	// 驗證資料
 | ||||
| 	if err := l.svcCtx.Validate.ValidateAll(&checkPostId{ | ||||
| 	if err := l.svcCtx.Validate.ValidateAll(&checkPostID{ | ||||
| 		PostID:  in.GetPostId(), | ||||
| 		Content: in.GetContent(), | ||||
| 	}); err != nil { | ||||
|  | @ -53,7 +53,7 @@ func (l *UpdatePostLogic) UpdatePost(in *tweeting.UpdatePostReq) (*tweeting.OKRe | |||
| 	update.ID = oid | ||||
| 	update.Tags = in.GetTags() | ||||
| 	// 將 Media 存入
 | ||||
| 	var media []model.Media | ||||
| 	media := make([]model.Media, 0, len(in.GetMedia())) | ||||
| 	for _, item := range in.GetMedia() { | ||||
| 		media = append(media, model.Media{ | ||||
| 			Links: item.Url, | ||||
|  | @ -88,6 +88,7 @@ func (l *UpdatePostLogic) UpdatePost(in *tweeting.UpdatePostReq) (*tweeting.OKRe | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to update post", in.PostId).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,9 +2,10 @@ package socialnetworkservicelogic | |||
| 
 | ||||
| import ( | ||||
| 	"app-cloudep-tweeting-service/internal/domain" | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 	"context" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,9 +3,10 @@ package socialnetworkservicelogic | |||
| import ( | ||||
| 	"app-cloudep-tweeting-service/internal/domain" | ||||
| 	"app-cloudep-tweeting-service/internal/domain/repository" | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 	"context" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,9 +2,10 @@ package socialnetworkservicelogic | |||
| 
 | ||||
| import ( | ||||
| 	"app-cloudep-tweeting-service/internal/domain" | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 	"context" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,9 +3,10 @@ package socialnetworkservicelogic | |||
| import ( | ||||
| 	"app-cloudep-tweeting-service/internal/domain" | ||||
| 	"app-cloudep-tweeting-service/internal/domain/repository" | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 	"context" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,9 +2,10 @@ package socialnetworkservicelogic | |||
| 
 | ||||
| import ( | ||||
| 	"app-cloudep-tweeting-service/internal/domain" | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 	"context" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,9 +2,10 @@ package socialnetworkservicelogic | |||
| 
 | ||||
| import ( | ||||
| 	"app-cloudep-tweeting-service/internal/domain" | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 	"context" | ||||
| 
 | ||||
| 	ers "code.30cm.net/digimon/library-go/errs" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 
 | ||||
|  |  | |||
|  | @ -69,6 +69,7 @@ func (l *AddPostLogic) AddPost(in *tweeting.AddPostToTimelineReq) (*tweeting.OKR | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to insert timeline repo :", in.GetUid()).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -52,6 +52,7 @@ func (l *ClearNoMoreDataFlagLogic) ClearNoMoreDataFlag(in *tweeting.DoNoMoreData | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to clear no more data flag timeline repo :", in.GetUid()).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -61,6 +61,7 @@ func (l *FetchTimelineLogic) FetchTimeline(in *tweeting.GetTimelineReq) (*tweeti | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to fetch timeline repo :", in.GetUid()).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -52,6 +52,7 @@ func (l *HasNoMoreDataLogic) HasNoMoreData(in *tweeting.DoNoMoreDataReq) (*tweet | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to get no more data flag:", in.GetUid()).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -52,6 +52,7 @@ func (l *SetNoMoreDataFlagLogic) SetNoMoreDataFlag(in *tweeting.DoNoMoreDataReq) | |||
| 				{Key: "err", Value: err}, | ||||
| 			}, | ||||
| 			"failed to set no more data flag:", in.GetUid()).Wrap(err) | ||||
| 
 | ||||
| 		return nil, e | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,6 +6,9 @@ import ( | |||
| 	client4J "app-cloudep-tweeting-service/internal/lib/neo4j" | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/zeromicro/go-zero/core/logx" | ||||
| 
 | ||||
| 	"github.com/neo4j/neo4j-go-driver/v5/neo4j" | ||||
| ) | ||||
| 
 | ||||
|  | @ -27,6 +30,7 @@ func MustSocialNetworkRepository(param SocialNetworkParam) repository.SocialNetw | |||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) CreateUserNode(ctx context.Context, uid string) error { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|  | @ -53,6 +57,7 @@ func (s *SocialNetworkRepository) CreateUserNode(ctx context.Context, uid string | |||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) MarkFollowerRelation(ctx context.Context, fromUID, toUID string) error { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|  | @ -88,6 +93,7 @@ func (s *SocialNetworkRepository) MarkFollowerRelation(ctx context.Context, from | |||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) GetFollower(ctx context.Context, req repository.FollowReq) (repository.FollowResp, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return repository.FollowResp{}, err | ||||
|  | @ -113,11 +119,17 @@ func (s *SocialNetworkRepository) GetFollower(ctx context.Context, req repositor | |||
| 		return repository.FollowResp{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	var uids []string | ||||
| 	var uidList []string | ||||
| 	for run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if uid, ok := record.Get("uid"); ok { | ||||
| 			uids = append(uids, uid.(string)) | ||||
| 		uid, ok := record.Get("uid") | ||||
| 		if ok { | ||||
| 			if uidStr, ok := uid.(string); ok { | ||||
| 				uidList = append(uidList, uidStr) | ||||
| 			} else { | ||||
| 				// TODO 可以印 log
 | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -127,12 +139,13 @@ func (s *SocialNetworkRepository) GetFollower(ctx context.Context, req repositor | |||
| 	} | ||||
| 
 | ||||
| 	return repository.FollowResp{ | ||||
| 		UIDs:  uids, | ||||
| 		UIDs:  uidList, | ||||
| 		Total: total, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) GetFollowee(ctx context.Context, req repository.FollowReq) (repository.FollowResp, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return repository.FollowResp{}, err | ||||
|  | @ -158,11 +171,17 @@ func (s *SocialNetworkRepository) GetFollowee(ctx context.Context, req repositor | |||
| 		return repository.FollowResp{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	var uids []string | ||||
| 	var uidList []string | ||||
| 	for run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if uid, ok := record.Get("uid"); ok { | ||||
| 			uids = append(uids, uid.(string)) | ||||
| 		uid, ok := record.Get("uid") | ||||
| 		if ok { | ||||
| 			if uidStr, ok := uid.(string); ok { | ||||
| 				uidList = append(uidList, uidStr) | ||||
| 			} else { | ||||
| 				// 可以印 log
 | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -172,12 +191,13 @@ func (s *SocialNetworkRepository) GetFollowee(ctx context.Context, req repositor | |||
| 	} | ||||
| 
 | ||||
| 	return repository.FollowResp{ | ||||
| 		UIDs:  uids, | ||||
| 		UIDs:  uidList, | ||||
| 		Total: total, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) GetFollowerCount(ctx context.Context, uid string) (int64, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
|  | @ -204,7 +224,11 @@ func (s *SocialNetworkRepository) GetFollowerCount(ctx context.Context, uid stri | |||
| 	if run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if followerCount, ok := record.Get("followerCount"); ok { | ||||
| 			count = followerCount.(int64) | ||||
| 			if dc, ok := followerCount.(int64); ok { | ||||
| 				count = dc | ||||
| 			} else { | ||||
| 				logx.Info("followerCount error") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -212,6 +236,7 @@ func (s *SocialNetworkRepository) GetFollowerCount(ctx context.Context, uid stri | |||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) GetFolloweeCount(ctx context.Context, uid string) (int64, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
|  | @ -238,7 +263,11 @@ func (s *SocialNetworkRepository) GetFolloweeCount(ctx context.Context, uid stri | |||
| 	if run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if followeeCount, ok := record.Get("followeeCount"); ok { | ||||
| 			count = followeeCount.(int64) | ||||
| 			if dc, ok := followeeCount.(int64); ok { | ||||
| 				count = dc | ||||
| 			} else { | ||||
| 				logx.Info("followeeCount error") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -246,6 +275,7 @@ func (s *SocialNetworkRepository) GetFolloweeCount(ctx context.Context, uid stri | |||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) RemoveFollowerRelation(ctx context.Context, fromUID, toUID string) error { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|  | @ -274,6 +304,7 @@ func (s *SocialNetworkRepository) RemoveFollowerRelation(ctx context.Context, fr | |||
| 
 | ||||
| // GetDegreeBetweenUsers 取得這兩個點之間的度數 (最短路徑長度)
 | ||||
| func (s *SocialNetworkRepository) GetDegreeBetweenUsers(ctx context.Context, uid1, uid2 string) (int64, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
|  | @ -302,7 +333,11 @@ func (s *SocialNetworkRepository) GetDegreeBetweenUsers(ctx context.Context, uid | |||
| 	if run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if deg, ok := record.Get("degree"); ok { | ||||
| 			degree = deg.(int64) | ||||
| 			if degreeValue, ok := deg.(int64); ok { | ||||
| 				degree = degreeValue | ||||
| 			} else { | ||||
| 				logx.Info("degree error") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -311,6 +346,7 @@ func (s *SocialNetworkRepository) GetDegreeBetweenUsers(ctx context.Context, uid | |||
| 
 | ||||
| // GetUIDsWithinNDegrees 取得某個節點在 n 度內關係所有 UID
 | ||||
| func (s *SocialNetworkRepository) GetUIDsWithinNDegrees(ctx context.Context, uid string, degrees, pageSize, pageIndex int64) ([]string, int64, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return nil, 0, err | ||||
|  | @ -339,11 +375,17 @@ func (s *SocialNetworkRepository) GetUIDsWithinNDegrees(ctx context.Context, uid | |||
| 		return nil, 0, fmt.Errorf("failed to get uids within %d degrees of user: %w", degrees, err) | ||||
| 	} | ||||
| 
 | ||||
| 	var uids []string | ||||
| 	var uidList []string | ||||
| 	for run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if uid, ok := record.Get("uid"); ok { | ||||
| 			uids = append(uids, uid.(string)) | ||||
| 		uid, ok := record.Get("uid") | ||||
| 		if ok { | ||||
| 			if uidStr, ok := uid.(string); ok { | ||||
| 				uidList = append(uidList, uidStr) | ||||
| 			} else { | ||||
| 				// 可以印 log
 | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -353,10 +395,11 @@ func (s *SocialNetworkRepository) GetUIDsWithinNDegrees(ctx context.Context, uid | |||
| 		return nil, 0, err | ||||
| 	} | ||||
| 
 | ||||
| 	return uids, totalCount, nil | ||||
| 	return uidList, totalCount, nil | ||||
| } | ||||
| 
 | ||||
| func (s *SocialNetworkRepository) getTotalUIDsWithinNDegrees(ctx context.Context, uid string, degrees int64) (int64, error) { | ||||
| 	//nolint:contextcheck
 | ||||
| 	session, err := s.neo4jClient.Conn() | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
|  | @ -384,7 +427,11 @@ func (s *SocialNetworkRepository) getTotalUIDsWithinNDegrees(ctx context.Context | |||
| 	if run.Next(ctx) { | ||||
| 		record := run.Record() | ||||
| 		if count, ok := record.Get("totalCount"); ok { | ||||
| 			totalCount = count.(int64) | ||||
| 			if countV, ok := count.(int64); ok { | ||||
| 				totalCount = countV | ||||
| 			} else { | ||||
| 				logx.Info("totalCount error") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -139,5 +139,6 @@ func (t *TimelineRepository) ClearNoMoreDataFlag(ctx context.Context, uid string | |||
| 	key := domain.TimelineRedisKey.With(uid).ToString() | ||||
| 	// 移除 "NoMoreData" 標誌
 | ||||
| 	_, err := t.redis.ZremCtx(ctx, key, domain.LastOfTimelineFlag) | ||||
| 
 | ||||
| 	return err | ||||
| } | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ import ( | |||
| 	"context" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/logic/commentservice" | ||||
| 	commentservicelogic "app-cloudep-tweeting-service/internal/logic/commentservice" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ import ( | |||
| 	"context" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/logic/postservice" | ||||
| 	postservicelogic "app-cloudep-tweeting-service/internal/logic/postservice" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ import ( | |||
| 	"context" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/logic/socialnetworkservice" | ||||
| 	socialnetworkservicelogic "app-cloudep-tweeting-service/internal/logic/socialnetworkservice" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ import ( | |||
| 	"context" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/logic/timelineservice" | ||||
| 	timelineservicelogic "app-cloudep-tweeting-service/internal/logic/timelineservice" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ import ( | |||
| 	"fmt" | ||||
| ) | ||||
| 
 | ||||
| func mustMongoConnectUrl(c config.Config) string { | ||||
| func mustMongoConnectURL(c config.Config) string { | ||||
| 	return fmt.Sprintf("%s://%s:%s", | ||||
| 		c.Mongo.Schema, | ||||
| 		c.Mongo.Host, | ||||
|  | @ -18,10 +18,12 @@ func mustMongoConnectUrl(c config.Config) string { | |||
| 
 | ||||
| func MustPostModel(c config.Config) model.PostModel { | ||||
| 	postCollection := model.Post{} | ||||
| 	return model.NewPostModel(mustMongoConnectUrl(c), c.Mongo.Database, postCollection.CollectionName()) | ||||
| 
 | ||||
| 	return model.NewPostModel(mustMongoConnectURL(c), c.Mongo.Database, postCollection.CollectionName()) | ||||
| } | ||||
| 
 | ||||
| func MustCommentModel(c config.Config) model.CommentModel { | ||||
| 	m := model.Comment{} | ||||
| 	return model.NewCommentModel(mustMongoConnectUrl(c), c.Mongo.Database, m.CollectionName()) | ||||
| 
 | ||||
| 	return model.NewCommentModel(mustMongoConnectURL(c), c.Mongo.Database, m.CollectionName()) | ||||
| } | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ import ( | |||
| 	"app-cloudep-tweeting-service/internal/lib/neo4j" | ||||
| 	model "app-cloudep-tweeting-service/internal/model/mongo" | ||||
| 	"app-cloudep-tweeting-service/internal/repository" | ||||
| 
 | ||||
| 	"github.com/zeromicro/go-zero/core/stores/redis" | ||||
| 
 | ||||
| 	vi "code.30cm.net/digimon/library-go/validator" | ||||
|  |  | |||
|  | @ -1,9 +1,6 @@ | |||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"app-cloudep-tweeting-service/gen_result/pb/tweeting" | ||||
| 	"app-cloudep-tweeting-service/internal/config" | ||||
| 	commentserviceServer "app-cloudep-tweeting-service/internal/server/commentservice" | ||||
|  | @ -11,6 +8,8 @@ import ( | |||
| 	socialnetworkserviceServer "app-cloudep-tweeting-service/internal/server/socialnetworkservice" | ||||
| 	timelineserviceServer "app-cloudep-tweeting-service/internal/server/timelineservice" | ||||
| 	"app-cloudep-tweeting-service/internal/svc" | ||||
| 	"flag" | ||||
| 	"log" | ||||
| 
 | ||||
| 	"github.com/zeromicro/go-zero/core/conf" | ||||
| 	"github.com/zeromicro/go-zero/core/service" | ||||
|  | @ -40,6 +39,6 @@ func main() { | |||
| 	}) | ||||
| 	defer s.Stop() | ||||
| 
 | ||||
| 	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn) | ||||
| 	log.Printf("Starting rpc server at %s...\n", c.ListenOn) | ||||
| 	s.Start() | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue