Guest User

Untitled

a guest
Jan 19th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.44 KB | None | 0 0
  1. import { ConnectionInformations, CreateUser, DatabaseInterface, Session } from '@accounts/types';
  2. import { Repository, getRepository } from 'typeorm';
  3. import { User } from '../entity/User';
  4. import { UserEmail } from '../entity/UserEmail';
  5. import { UserService } from '../entity/UserService';
  6. import { UserSession } from '../entity/UserSession';
  7.  
  8. type ISession = Session & UserSession;
  9.  
  10. export class Typeorm implements DatabaseInterface {
  11.  
  12. private userRepository: Repository<User>;
  13. private serviceRepository: Repository<UserService>;
  14. private emailRepository: Repository<UserEmail>;
  15. private sessionRepository: Repository<UserSession>;
  16.  
  17. constructor() {
  18. this.userRepository = getRepository(User);
  19. this.serviceRepository = getRepository(UserService);
  20. this.emailRepository = getRepository(UserEmail);
  21. this.sessionRepository = getRepository(UserSession);
  22. }
  23.  
  24. public async findUserByEmail(email: string): Promise<User | null> {
  25. return this.userRepository.findOne({
  26. where: { email },
  27. });
  28. }
  29.  
  30. public async findUserByUsername(username: string): Promise<User | null> {
  31. return this.userRepository.findOne({
  32. where: { username },
  33. });
  34. }
  35.  
  36. public async findUserById(userId: string): Promise<User | null> {
  37. const user = await this.userRepository.findOne(userId);
  38. if (!user) {
  39. throw new Error('User not found');
  40. }
  41. return user;
  42. }
  43.  
  44. public async findUserByResetPasswordToken(token: string): Promise<User | null> {
  45. const service = await this.serviceRepository.findOne({
  46. where: {
  47. name: 'password.reset',
  48. token,
  49. },
  50. });
  51. return service.user;
  52. }
  53.  
  54. public async findUserByEmailVerificationToken(token: string): Promise<User | null> {
  55. const service = await this.serviceRepository.findOne({
  56. where: {
  57. name: 'email.verification',
  58. token,
  59. },
  60. });
  61. return service.user;
  62. }
  63.  
  64. public async createUser(createUser: CreateUser): Promise<string> {
  65. const { username, email, password } = createUser;
  66.  
  67. const user = new User();
  68.  
  69. if (email) {
  70. const userEmail = new UserEmail();
  71. userEmail.address = email;
  72. userEmail.verified = false;
  73. this.emailRepository.save(userEmail);
  74. user.emails = [userEmail];
  75. }
  76.  
  77. if (password) {
  78. const userService = new UserService();
  79. userService.name = 'password';
  80. userService.options = { bcrypt: password };
  81. await this.serviceRepository.save(userService);
  82. user.services = [userService];
  83. }
  84.  
  85. if (username) {
  86. user.username = username;
  87. }
  88.  
  89. await this.userRepository.save(user);
  90.  
  91. return user.id;
  92. }
  93.  
  94. public async setUsername(userId: string, newUsername: string): Promise<void> {
  95. const user = await this.findUserById(userId);
  96. user.username = newUsername;
  97. await this.userRepository.save(user);
  98. }
  99.  
  100. public async setProfile(userId: string, profile: object): Promise<object> {
  101. const user = await this.findUserById(userId);
  102. user.profile = profile;
  103. await this.userRepository.save(user);
  104. return profile;
  105. }
  106.  
  107. public async findUserByServiceId(serviceName: string, serviceId: string): Promise<User | null> {
  108. const service = await this.serviceRepository.findOne({
  109. name: serviceName,
  110. id: serviceId,
  111. });
  112.  
  113. if (service) {
  114. return service.user;
  115. }
  116. }
  117.  
  118. public async setService(userId: string, serviceName: string, data: object): Promise<void> {
  119. const user = await this.findUserById(userId);
  120. const service = user.services.find((s) => s.name === serviceName);
  121. if (service) {
  122. service.options = data;
  123. await this.serviceRepository.save(service); // @todo is this needed?
  124. await this.userRepository.save(user);
  125. }
  126. }
  127.  
  128. public async unsetService(userId: string, serviceName: string): Promise<void> {
  129. const user = await this.findUserById(userId);
  130. const service = user.services && user.services.find((s) => s.name === serviceName);
  131. if (service) {
  132. await this.serviceRepository.remove(service);
  133. await this.userRepository.save(user);
  134. }
  135. }
  136.  
  137. public async findPasswordHash(userId: string): Promise<string | null> {
  138. const user = await this.findUserById(userId);
  139. const service = user.services && user.services.find((s) => s.name === 'password');
  140. return service.options && service.options.bcrypt;
  141. return null;
  142. }
  143.  
  144. public async setPassword(userId: string, newPassword: string): Promise<void> {
  145. const user = await this.findUserById(userId);
  146. const service = user.services && user.services.find((s) => s.name === 'password');
  147. service.options = { bcrypt: newPassword };
  148. await this.serviceRepository.save(service);
  149. await this.userRepository.save(user);
  150. }
  151.  
  152. public async addResetPasswordToken(userId: string, email: string, token: string, reason: string): Promise<void> {
  153. const user = await this.findUserById(userId);
  154. const service = new UserService();
  155. service.name = 'password.reset';
  156. service.token = token;
  157. service.options = {
  158. email: email.toLocaleLowerCase(),
  159. when: (new Date()).toJSON(),
  160. reason,
  161. };
  162. await this.serviceRepository.save(service);
  163. user.services.push(service);
  164. await this.userRepository.save(user);
  165. }
  166.  
  167. public async setResetPassword(userId: string, email: string, newPassword: string, token: string): Promise<void> {
  168. await this.setPassword(userId, newPassword);
  169. }
  170.  
  171. public async addEmail(userId: string, newEmail: string, verified: boolean): Promise<void> {
  172. const user = await this.findUserById(userId);
  173. const userEmail = new UserEmail();
  174. userEmail.address = newEmail;
  175. userEmail.verified = verified;
  176. user.emails.push(userEmail);
  177. await this.userRepository.save(user);
  178. }
  179.  
  180. public async removeEmail(userId: string, email: string): Promise<void> {
  181. const user = await this.findUserById(userId);
  182. const userEmail = user.emails.find((s) => s.address === email);
  183. if (!userEmail) {
  184. throw new Error('Email not found');
  185. }
  186. await this.emailRepository.remove(userEmail);
  187. }
  188.  
  189. public async verifyEmail(userId: string, email: string): Promise<void> {
  190. const user = await this.findUserById(userId);
  191. const userEmail = user.emails.find((s) => s.address === email);
  192. if (!userEmail) {
  193. throw new Error('Email not found');
  194. }
  195. userEmail.verified = true;
  196. await this.emailRepository.save(userEmail);
  197. }
  198.  
  199. public async addEmailVerificationToken(userId: string, email: string, token: string): Promise<void> {
  200. const user = await this.findUserById(userId);
  201. const service = new UserService();
  202. service.token = token;
  203. service.name = 'email.verification';
  204. await this.serviceRepository.save(service);
  205. user.services.push(service);
  206. await this.userRepository.save(user);
  207. }
  208.  
  209. public async setUserDeactivated(userId: string, deactivated: boolean): Promise<void> {
  210. const user = await this.findUserById(userId);
  211. user.deactivated = deactivated;
  212. await this.userRepository.save(user);
  213. }
  214.  
  215. public findSessionById(sessionId: string): Promise<Session | null> {
  216. return this.sessionRepository.findOne(sessionId) as Promise<ISession>;
  217. }
  218.  
  219. public findSessionByToken(token: string): Promise<ISession | null> {
  220. return this.sessionRepository.findOne({ token }) as Promise<ISession>;
  221. }
  222.  
  223. public async createSession(
  224. userId: string,
  225. token: string,
  226. connection: ConnectionInformations,
  227. extra?: object,
  228. ): Promise<string> {
  229. const user = await this.findUserById(userId);
  230. const session = new UserSession();
  231. session.token = token;
  232. session.userAgent = connection.userAgent;
  233. session.ip = connection.ip;
  234. session.extra = extra;
  235. session.valid = true;
  236. await this.sessionRepository.save(session);
  237.  
  238. user.sessions.push(session);
  239. await this.userRepository.save(user);
  240.  
  241. return session.id;
  242. }
  243.  
  244. public async updateSession(sessionId: string, connection: ConnectionInformations): Promise<void> {
  245. const session = await this.findSessionById(sessionId);
  246. session.userAgent = connection.userAgent;
  247. session.ip = connection.ip;
  248. await this.sessionRepository.save(session);
  249. }
  250.  
  251. public async invalidateSession(sessionId: string): Promise<void> {
  252. const session = await this.findSessionById(sessionId);
  253. session.valid = false;
  254. await this.sessionRepository.save(session);
  255. }
  256.  
  257. public async invalidateAllSessions(userId: string): Promise<void> {
  258. const user = await this.findUserById(userId);
  259. await Promise.all(
  260. user.sessions.map((session) =>
  261. this.sessionRepository.delete(session),
  262. ),
  263. );
  264. }
  265. }
Add Comment
Please, Sign In to add comment