hellowin/kanca

View on GitHub
src/domain/metric/service/userMetric.js

Summary

Maintainability
C
1 day
Test Coverage
// @flow
import _ from 'lodash';

export class UserMetric {

  member: Member | void
  id: string
  name: string
  picture: string
  url: string | void
  posts: Post[]
  comments: Comment[]
  postsCount: number
  commentsCount: number
  postsSharesCount: number
  postsLikesCount: number
  getScore: (postWeight?: number, commentWeight?: number, postShareWeight?: number, postLikeWeight?: number) => number

  constructor(member?: Member, id: string, name: string, picture: string, url?: string) {
    this.member = member;
    this.id = id;
    this.name = name;
    this.picture = picture;
    this.url = url;
    this.posts = [];
    this.comments = [];
    this.postsCount = 0;
    this.commentsCount = 0;
    this.postsSharesCount = 0;
    this.postsLikesCount = 0;

    this.getScore = (postWeight = 1, commentWeight = 1, postShareWeight = 1, postLikeWeight = 1): number => {
      return this.postsCount * postWeight
        + this.commentsCount * commentWeight
        + this.postsSharesCount * postShareWeight
        + this.postsLikesCount * postLikeWeight;
    };
  }
}

const userFactory = (member?: Member, id: string, name: string, picture: string, url?: string): UserMetric =>
  new UserMetric(member, id, name, picture, url);

export const userMetric = (members: Member[], posts: Post[], comments: Comment[]): UserMetric[] => {
  // create user mapping
  const users = {};
  _.each(members, member => {
    const id = member.id;
    const name = member.name;
    const picture = member.picture.data.url;
    const url = member.link;
    const user = userFactory(member, id, name, picture, url);
    users[id] = user;
  });
  
  // create user posts mapping
  _.each(posts, feed => {
    const userId = (feed.from || {}).id;
    const userName = (feed.from || {}).name;
    // create empty user posts mapping
    if (!users[userId]) users[userId] = userFactory(undefined, userId, userName, '');
    if (feed.from) users[userId].posts.push(feed);
  });

  // create user comments mapping
  _.each(comments, comment => {
    const userId = (comment.from || {}).id;
    const userName = (comment.from || {}).name;
    // create empty user comments mapping
    if (!users[userId]) users[userId] = userFactory(undefined, userId, userName, '');

    if (comment.from) users[userId].comments.push(comment);
  });

  // calculate per user basis
  _.each(users, user => {
    user.postsCount = user.posts.length;
    user.postsSharesCount = 0;
    user.postsLikesCount = 0;
    user.commentsCount = user.comments.length;
    _.each(user.posts, post => {
      if (post.shares && post.shares.count) user.postsSharesCount += post.shares.count;
      if (post.likes && post.likes.data && post.likes.data.length) user.postsLikesCount += post.likes.data.length;
    });
  });

  return _.values(users);
};

export default userMetric;