Guest User

Untitled

a guest
Apr 26th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. /* @flow */
  2.  
  3. import R from 'ramda';
  4.  
  5. // Utils
  6. import * as crud from '../../utils/sequelize/crud';
  7. import * as logic from '../../utils/logic/';
  8. import facebook from '../../utils/facebook/';
  9.  
  10. // Models
  11. import { Session, User } from '../models';
  12.  
  13. // Types
  14. import type { SessionType } from '../Session/flow';
  15. import type { UserType } from './flow';
  16.  
  17. type P<T> = Promise<T>;
  18.  
  19. type FacebookUserType = {
  20. email: string,
  21. first_name: string,
  22. last_name: string,
  23. birthday?: string,
  24. cover: string,
  25. gender?: string,
  26. link?: string,
  27. };
  28.  
  29. type FormattedUserType = {
  30. email: string,
  31. password: boolean,
  32. firstname: string,
  33. lastname: string,
  34. username: string,
  35. userpic: string,
  36. };
  37.  
  38. type ComposedUserDataType = {
  39. fbUser: FacebookUserType,
  40. user: UserType,
  41. };
  42.  
  43. export const mutation: string = `
  44. authorization (
  45. token: String
  46. ): User
  47. `;
  48.  
  49. export default {
  50. /**
  51. * Authorization via Facebook
  52. */
  53. authorization: async (
  54. root: any,
  55. { token }: { token: string },
  56. ): Promise<UserType> => {
  57. /**
  58. * Create new user session
  59. */
  60. const createSession = async (
  61. { id: userId }: UserType,
  62. ): P<SessionType> =>
  63. crud.create(
  64. 'Session', {
  65. userId,
  66. token,
  67. },
  68. );
  69.  
  70. /**
  71. * Register new user
  72. */
  73. const register = (
  74. { fbUser }: { fbUser: FacebookUserType },
  75. ): P<UserType> =>
  76. R.pipeP(
  77. () => facebook.user.format(fbUser, token),
  78. (formattedUser) => crud.create('User', formattedUser),
  79. (user) => R.pipe(
  80. () => {
  81. createSession(user);
  82. logic.createSelfBot(user.id);
  83. },
  84. R.always(user),
  85. )(user),
  86. )(fbUser);
  87.  
  88. /**
  89. * Update user session
  90. */
  91. const update = (
  92. { user }: ComposedUserDataType,
  93. ): P<UserType> =>
  94. R.pipeP(
  95. (): P<SessionType> => Session.findOne({ where: { token } }),
  96. async (session): P<void> => R.isNil(session) && createSession(user),
  97. R.always(user),
  98. )(user);
  99.  
  100. return R.pipeP(
  101. (): P<FacebookUserType> => facebook.user.get(token),
  102. async (fbUser) => ({
  103. fbUser,
  104. user: await User.findOne({ where: { email: fbUser.email } }),
  105. }),
  106. (args: ComposedUserDataType): P<UserType> => (
  107. R.isNil(R.prop('user', args))
  108. ? register(args)
  109. : update(args)
  110. ),
  111. )(token);
  112. },
  113. };
Add Comment
Please, Sign In to add comment