You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.0 KiB

11 months ago
  1. const { EventLogs } = require("../models/eventLogs");
  2. const { Invite } = require("../models/invite");
  3. const { User } = require("../models/user");
  4. const { reqBody } = require("../utils/http");
  5. function inviteEndpoints(app) {
  6. if (!app) return;
  7. app.get("/invite/:code", async (request, response) => {
  8. try {
  9. const { code } = request.params;
  10. const invite = await Invite.get({ code });
  11. if (!invite) {
  12. response.status(200).json({ invite: null, error: "Invite not found." });
  13. return;
  14. }
  15. if (invite.status !== "pending") {
  16. response
  17. .status(200)
  18. .json({ invite: null, error: "Invite is no longer valid." });
  19. return;
  20. }
  21. response
  22. .status(200)
  23. .json({ invite: { code, status: invite.status }, error: null });
  24. } catch (e) {
  25. console.error(e);
  26. response.sendStatus(500).end();
  27. }
  28. });
  29. app.post("/invite/:code", async (request, response) => {
  30. try {
  31. const { code } = request.params;
  32. const { username, password } = reqBody(request);
  33. const invite = await Invite.get({ code });
  34. if (!invite || invite.status !== "pending") {
  35. response
  36. .status(200)
  37. .json({ success: false, error: "Invite not found or is invalid." });
  38. return;
  39. }
  40. const { user, error } = await User.create({
  41. username,
  42. password,
  43. role: "default",
  44. });
  45. if (!user) {
  46. console.error("Accepting invite:", error);
  47. response
  48. .status(200)
  49. .json({ success: false, error: "Could not create user." });
  50. return;
  51. }
  52. await Invite.markClaimed(invite.id, user);
  53. await EventLogs.logEvent(
  54. "invite_accepted",
  55. {
  56. username: user.username,
  57. },
  58. user.id
  59. );
  60. response.status(200).json({ success: true, error: null });
  61. } catch (e) {
  62. console.error(e);
  63. response.sendStatus(500).end();
  64. }
  65. });
  66. }
  67. module.exports = { inviteEndpoints };