@medusajs/user 0.0.1 → 0.0.2-next-20240319121007

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@ import { MapToConfig } from "@medusajs/utils";
2
2
  import { ModuleJoinerConfig } from "@medusajs/types";
3
3
  export declare const LinkableKeys: {
4
4
  user_id: string;
5
+ invite_id: string;
5
6
  };
6
7
  export declare const entityNameToLinkableKeysMap: MapToConfig;
7
8
  export declare const joinerConfig: ModuleJoinerConfig;
@@ -5,6 +5,7 @@ const _models_1 = require("./models");
5
5
  const modules_sdk_1 = require("@medusajs/modules-sdk");
6
6
  exports.LinkableKeys = {
7
7
  user_id: _models_1.User.name,
8
+ invite_id: _models_1.Invite.name,
8
9
  };
9
10
  const entityLinkableKeysMap = {};
10
11
  Object.entries(exports.LinkableKeys).forEach(([key, value]) => {
@@ -19,10 +20,19 @@ exports.joinerConfig = {
19
20
  serviceName: modules_sdk_1.Modules.USER,
20
21
  primaryKeys: ["id"],
21
22
  linkableKeys: exports.LinkableKeys,
22
- alias: {
23
- name: ["user", "users"],
24
- args: {
25
- entity: _models_1.User.name,
23
+ alias: [
24
+ {
25
+ name: ["user", "users"],
26
+ args: {
27
+ entity: _models_1.User.name,
28
+ },
26
29
  },
27
- },
30
+ {
31
+ name: ["invite", "invites"],
32
+ args: {
33
+ entity: _models_1.Invite.name,
34
+ methodSuffix: "Invites",
35
+ },
36
+ },
37
+ ],
28
38
  };
@@ -0,0 +1,5 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ export declare class Migration20240214033943 extends Migration {
3
+ up(): Promise<void>;
4
+ down(): Promise<void>;
5
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20240214033943 = void 0;
4
+ const utils_1 = require("@medusajs/utils");
5
+ const migrations_1 = require("@mikro-orm/migrations");
6
+ class Migration20240214033943 extends migrations_1.Migration {
7
+ async up() {
8
+ this.addSql('create table if not exists "invite" ("id" text not null, "email" text not null, "accepted" boolean not null default false, "token" text not null, "expires_at" timestamptz not null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "invite_pkey" primary key ("id"));');
9
+ this.addSql('alter table "invite" add column if not exists "email" text not null;');
10
+ this.addSql((0, utils_1.generatePostgresAlterColummnIfExistStatement)("invite", ["user_email"], "DROP NOT NULL"));
11
+ this.addSql('CREATE UNIQUE INDEX IF NOT EXISTS "IDX_invite_email" ON "invite" (email) WHERE deleted_at IS NULL;');
12
+ this.addSql('CREATE INDEX IF NOT EXISTS "IDX_invite_token" ON "invite" (token) WHERE deleted_at IS NULL;');
13
+ this.addSql('CREATE INDEX IF NOT EXISTS "IDX_invite_deleted_at" ON "invite" (deleted_at) WHERE deleted_at IS NOT NULL;');
14
+ this.addSql('create table if not exists "user" ("id" text not null, "first_name" text null, "last_name" text null, "email" text not null, "avatar_url" text null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "user_pkey" primary key ("id"));');
15
+ this.addSql('alter table "user" add column if not exists "avatar_url" text null;');
16
+ this.addSql('CREATE INDEX IF NOT EXISTS "IDX_user_email" ON "user" (email) WHERE deleted_at IS NULL;');
17
+ this.addSql('CREATE INDEX IF NOT EXISTS "IDX_user_deleted_at" ON "user" (deleted_at) WHERE deleted_at IS NOT NULL;');
18
+ }
19
+ async down() {
20
+ this.addSql('drop table if exists "invite" cascade;');
21
+ this.addSql('drop table if exists "user" cascade;');
22
+ }
23
+ }
24
+ exports.Migration20240214033943 = Migration20240214033943;
@@ -1 +1,2 @@
1
1
  export { default as User } from "./user";
2
+ export { default as Invite } from "./invite";
@@ -3,6 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.User = void 0;
6
+ exports.Invite = exports.User = void 0;
7
7
  var user_1 = require("./user");
8
8
  Object.defineProperty(exports, "User", { enumerable: true, get: function () { return __importDefault(user_1).default; } });
9
+ var invite_1 = require("./invite");
10
+ Object.defineProperty(exports, "Invite", { enumerable: true, get: function () { return __importDefault(invite_1).default; } });
@@ -0,0 +1,18 @@
1
+ import { OptionalProps } from "@mikro-orm/core";
2
+ import { DAL } from "@medusajs/types";
3
+ type OptionalFields = "metadata" | "accepted" | DAL.SoftDeletableEntityDateColumns;
4
+ export default class Invite {
5
+ [OptionalProps]: OptionalFields;
6
+ id: string;
7
+ email: string;
8
+ accepted: boolean;
9
+ token: string;
10
+ expires_at: Date;
11
+ metadata: Record<string, unknown> | null;
12
+ created_at: Date;
13
+ updated_at: Date;
14
+ deleted_at: Date | null;
15
+ onInit(): void;
16
+ beforeCreate(): void;
17
+ }
18
+ export {};
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const core_1 = require("@mikro-orm/core");
13
+ const utils_1 = require("@medusajs/utils");
14
+ const inviteEmailIndexName = "IDX_invite_email";
15
+ const inviteEmailIndexStatement = (0, utils_1.createPsqlIndexStatementHelper)({
16
+ name: inviteEmailIndexName,
17
+ tableName: "invite",
18
+ columns: "email",
19
+ where: "deleted_at IS NULL",
20
+ unique: true,
21
+ }).expression;
22
+ const inviteTokenIndexName = "IDX_invite_token";
23
+ const inviteTokenIndexStatement = (0, utils_1.createPsqlIndexStatementHelper)({
24
+ name: inviteTokenIndexName,
25
+ tableName: "invite",
26
+ columns: "token",
27
+ where: "deleted_at IS NULL",
28
+ }).expression;
29
+ const inviteDeletedAtIndexName = "IDX_invite_deleted_at";
30
+ const inviteDeletedAtIndexStatement = (0, utils_1.createPsqlIndexStatementHelper)({
31
+ name: inviteDeletedAtIndexName,
32
+ tableName: "invite",
33
+ columns: "deleted_at",
34
+ where: "deleted_at IS NOT NULL",
35
+ }).expression;
36
+ let Invite = class Invite {
37
+ constructor() {
38
+ this.accepted = false;
39
+ this.metadata = null;
40
+ this.deleted_at = null;
41
+ }
42
+ onInit() {
43
+ this.id = (0, utils_1.generateEntityId)(this.id, "invite");
44
+ }
45
+ beforeCreate() {
46
+ this.id = (0, utils_1.generateEntityId)(this.id, "invite");
47
+ }
48
+ };
49
+ __decorate([
50
+ (0, core_1.PrimaryKey)({ columnType: "text" }),
51
+ __metadata("design:type", String)
52
+ ], Invite.prototype, "id", void 0);
53
+ __decorate([
54
+ (0, core_1.Index)({
55
+ name: inviteEmailIndexName,
56
+ expression: inviteEmailIndexStatement,
57
+ }),
58
+ (0, core_1.Property)({ columnType: "text" }),
59
+ __metadata("design:type", String)
60
+ ], Invite.prototype, "email", void 0);
61
+ __decorate([
62
+ (0, core_1.Property)({ columnType: "boolean" }),
63
+ __metadata("design:type", Boolean)
64
+ ], Invite.prototype, "accepted", void 0);
65
+ __decorate([
66
+ (0, core_1.Index)({
67
+ name: inviteTokenIndexName,
68
+ expression: inviteTokenIndexStatement,
69
+ }),
70
+ (0, core_1.Property)({ columnType: "text" }),
71
+ __metadata("design:type", String)
72
+ ], Invite.prototype, "token", void 0);
73
+ __decorate([
74
+ (0, core_1.Property)({ columnType: "timestamptz" }),
75
+ __metadata("design:type", Date)
76
+ ], Invite.prototype, "expires_at", void 0);
77
+ __decorate([
78
+ (0, core_1.Property)({ columnType: "jsonb", nullable: true }),
79
+ __metadata("design:type", Object)
80
+ ], Invite.prototype, "metadata", void 0);
81
+ __decorate([
82
+ (0, core_1.Property)({
83
+ onCreate: () => new Date(),
84
+ columnType: "timestamptz",
85
+ defaultRaw: "now()",
86
+ }),
87
+ __metadata("design:type", Date)
88
+ ], Invite.prototype, "created_at", void 0);
89
+ __decorate([
90
+ (0, core_1.Property)({
91
+ onCreate: () => new Date(),
92
+ onUpdate: () => new Date(),
93
+ columnType: "timestamptz",
94
+ defaultRaw: "now()",
95
+ }),
96
+ __metadata("design:type", Date)
97
+ ], Invite.prototype, "updated_at", void 0);
98
+ __decorate([
99
+ (0, core_1.Index)({
100
+ name: inviteDeletedAtIndexName,
101
+ expression: inviteDeletedAtIndexStatement,
102
+ }),
103
+ (0, core_1.Property)({ columnType: "timestamptz", nullable: true }),
104
+ __metadata("design:type", Object)
105
+ ], Invite.prototype, "deleted_at", void 0);
106
+ __decorate([
107
+ (0, core_1.OnInit)(),
108
+ __metadata("design:type", Function),
109
+ __metadata("design:paramtypes", []),
110
+ __metadata("design:returntype", void 0)
111
+ ], Invite.prototype, "onInit", null);
112
+ __decorate([
113
+ (0, core_1.BeforeCreate)(),
114
+ __metadata("design:type", Function),
115
+ __metadata("design:paramtypes", []),
116
+ __metadata("design:returntype", void 0)
117
+ ], Invite.prototype, "beforeCreate", null);
118
+ Invite = __decorate([
119
+ (0, core_1.Entity)({ tableName: "invite" }),
120
+ (0, core_1.Filter)(utils_1.DALUtils.mikroOrmSoftDeletableFilterOptions)
121
+ ], Invite);
122
+ exports.default = Invite;
@@ -1,5 +1,18 @@
1
+ import { OptionalProps } from "@mikro-orm/core";
2
+ import { DAL } from "@medusajs/types";
3
+ type OptionalFields = "first_name" | "last_name" | "metadata" | "avatar_url" | DAL.SoftDeletableEntityDateColumns;
1
4
  export default class User {
5
+ [OptionalProps]?: OptionalFields;
2
6
  id: string;
7
+ first_name: string | null;
8
+ last_name: string | null;
9
+ email: string;
10
+ avatar_url: string | null;
11
+ metadata: Record<string, unknown> | null;
12
+ created_at: Date;
13
+ updated_at: Date;
14
+ deleted_at?: Date | null;
3
15
  onCreate(): void;
4
16
  onInit(): void;
5
17
  }
18
+ export {};
@@ -11,7 +11,28 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const core_1 = require("@mikro-orm/core");
13
13
  const utils_1 = require("@medusajs/utils");
14
+ const userEmailIndexName = "IDX_user_email";
15
+ const userEmailIndexStatement = (0, utils_1.createPsqlIndexStatementHelper)({
16
+ name: userEmailIndexName,
17
+ tableName: "user",
18
+ columns: "email",
19
+ where: "deleted_at IS NULL",
20
+ }).expression;
21
+ const userDeletedAtIndexName = "IDX_user_deleted_at";
22
+ const userDeletedAtIndexStatement = (0, utils_1.createPsqlIndexStatementHelper)({
23
+ name: userDeletedAtIndexName,
24
+ tableName: "user",
25
+ columns: "deleted_at",
26
+ where: "deleted_at IS NOT NULL",
27
+ }).expression;
14
28
  let User = class User {
29
+ constructor() {
30
+ this.first_name = null;
31
+ this.last_name = null;
32
+ this.avatar_url = null;
33
+ this.metadata = null;
34
+ this.deleted_at = null;
35
+ }
15
36
  onCreate() {
16
37
  this.id = (0, utils_1.generateEntityId)(this.id, "user");
17
38
  }
@@ -23,6 +44,55 @@ __decorate([
23
44
  (0, core_1.PrimaryKey)({ columnType: "text" }),
24
45
  __metadata("design:type", String)
25
46
  ], User.prototype, "id", void 0);
47
+ __decorate([
48
+ (0, core_1.Property)({ columnType: "text", nullable: true }),
49
+ __metadata("design:type", Object)
50
+ ], User.prototype, "first_name", void 0);
51
+ __decorate([
52
+ (0, core_1.Property)({ columnType: "text", nullable: true }),
53
+ __metadata("design:type", Object)
54
+ ], User.prototype, "last_name", void 0);
55
+ __decorate([
56
+ (0, core_1.Property)({ columnType: "text" }),
57
+ (0, core_1.Index)({
58
+ name: userEmailIndexName,
59
+ expression: userEmailIndexStatement,
60
+ }),
61
+ __metadata("design:type", String)
62
+ ], User.prototype, "email", void 0);
63
+ __decorate([
64
+ (0, core_1.Property)({ columnType: "text", nullable: true }),
65
+ __metadata("design:type", Object)
66
+ ], User.prototype, "avatar_url", void 0);
67
+ __decorate([
68
+ (0, core_1.Property)({ columnType: "jsonb", nullable: true }),
69
+ __metadata("design:type", Object)
70
+ ], User.prototype, "metadata", void 0);
71
+ __decorate([
72
+ (0, core_1.Property)({
73
+ onCreate: () => new Date(),
74
+ columnType: "timestamptz",
75
+ defaultRaw: "now()",
76
+ }),
77
+ __metadata("design:type", Date)
78
+ ], User.prototype, "created_at", void 0);
79
+ __decorate([
80
+ (0, core_1.Property)({
81
+ onCreate: () => new Date(),
82
+ onUpdate: () => new Date(),
83
+ columnType: "timestamptz",
84
+ defaultRaw: "now()",
85
+ }),
86
+ __metadata("design:type", Date)
87
+ ], User.prototype, "updated_at", void 0);
88
+ __decorate([
89
+ (0, core_1.Index)({
90
+ name: userDeletedAtIndexName,
91
+ expression: userDeletedAtIndexStatement,
92
+ }),
93
+ (0, core_1.Property)({ columnType: "timestamptz", nullable: true }),
94
+ __metadata("design:type", Object)
95
+ ], User.prototype, "deleted_at", void 0);
26
96
  __decorate([
27
97
  (0, core_1.BeforeCreate)(),
28
98
  __metadata("design:type", Function),
@@ -36,6 +106,7 @@ __decorate([
36
106
  __metadata("design:returntype", void 0)
37
107
  ], User.prototype, "onInit", null);
38
108
  User = __decorate([
39
- (0, core_1.Entity)()
109
+ (0, core_1.Entity)(),
110
+ (0, core_1.Filter)(utils_1.DALUtils.mikroOrmSoftDeletableFilterOptions)
40
111
  ], User);
41
112
  exports.default = User;
@@ -1 +1,2 @@
1
1
  export { default as UserModuleService } from "./user-module";
2
+ export { default as InviteService } from "./invite";
@@ -3,6 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.UserModuleService = void 0;
6
+ exports.InviteService = exports.UserModuleService = void 0;
7
7
  var user_module_1 = require("./user-module");
8
8
  Object.defineProperty(exports, "UserModuleService", { enumerable: true, get: function () { return __importDefault(user_module_1).default; } });
9
+ var invite_1 = require("./invite");
10
+ Object.defineProperty(exports, "InviteService", { enumerable: true, get: function () { return __importDefault(invite_1).default; } });
@@ -0,0 +1,24 @@
1
+ import { Context, DAL } from "@medusajs/types";
2
+ import { Invite } from "../models";
3
+ import { InviteServiceTypes } from "../types";
4
+ type InjectedDependencies = {
5
+ inviteRepository: DAL.RepositoryService;
6
+ };
7
+ declare const InviteService_base: new <TEntity_1 extends object = any>(container: InjectedDependencies) => import("@medusajs/types").InternalModuleService<TEntity_1, InjectedDependencies>;
8
+ export default class InviteService<TEntity extends Invite = Invite> extends InviteService_base<TEntity> {
9
+ protected readonly inviteRepository_: DAL.RepositoryService<TEntity>;
10
+ protected options_: {
11
+ jwt_secret: string;
12
+ valid_duration: number;
13
+ } | undefined;
14
+ constructor(container: InjectedDependencies);
15
+ withModuleOptions(options: any): InviteService<TEntity>;
16
+ private getOption;
17
+ create(data: InviteServiceTypes.CreateInviteDTO, context?: Context): Promise<TEntity>;
18
+ create(data: InviteServiceTypes.CreateInviteDTO[], context?: Context): Promise<TEntity[]>;
19
+ refreshInviteTokens(inviteIds: string[], context?: Context): Promise<TEntity[]>;
20
+ validateInviteToken(token: string, context?: Context): Promise<TEntity>;
21
+ private generateToken;
22
+ private validateToken;
23
+ }
24
+ export {};
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __metadata = (this && this.__metadata) || function (k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const crypto = __importStar(require("crypto"));
39
+ const utils_1 = require("@medusajs/utils");
40
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
41
+ const _models_1 = require("../models");
42
+ // 1 day
43
+ const DEFAULT_VALID_INVITE_DURATION = 60 * 60 * 24;
44
+ class InviteService extends utils_1.ModulesSdkUtils.internalModuleServiceFactory(_models_1.Invite) {
45
+ constructor(container) {
46
+ super(container);
47
+ this.inviteRepository_ = container.inviteRepository;
48
+ }
49
+ withModuleOptions(options) {
50
+ const service = new InviteService(this.__container__);
51
+ service.options_ = options;
52
+ return service;
53
+ }
54
+ getOption(key) {
55
+ if (!this.options_) {
56
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Options are not configured for InviteService, call "withModuleOptions" and provide options`);
57
+ }
58
+ return this.options_[key];
59
+ }
60
+ async create(data, context = {}) {
61
+ const data_ = Array.isArray(data) ? data : [data];
62
+ const invites = await super.create(data_, context);
63
+ const expiresIn = parseInt(this.getOption("valid_duration")) ||
64
+ DEFAULT_VALID_INVITE_DURATION;
65
+ const updates = invites.map((invite) => {
66
+ return {
67
+ id: invite.id,
68
+ expires_at: new Date().setMilliseconds(new Date().getMilliseconds() + expiresIn),
69
+ token: this.generateToken({ id: invite.id }),
70
+ };
71
+ });
72
+ return await super.update(updates, context);
73
+ }
74
+ async refreshInviteTokens(inviteIds, context = {}) {
75
+ const [invites, count] = await super.listAndCount({ id: inviteIds }, {}, context);
76
+ if (count !== inviteIds.length) {
77
+ const missing = (0, utils_1.arrayDifference)(inviteIds, invites.map((invite) => invite.id));
78
+ if (missing.length > 0) {
79
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `The following invites do not exist: ${missing.join(", ")}`);
80
+ }
81
+ }
82
+ const expiresIn = parseInt(this.getOption("valid_duration")) ||
83
+ DEFAULT_VALID_INVITE_DURATION;
84
+ const updates = invites.map((invite) => {
85
+ return {
86
+ id: invite.id,
87
+ expires_at: new Date().setMilliseconds(new Date().getMilliseconds() + expiresIn),
88
+ token: this.generateToken({ id: invite.id }),
89
+ };
90
+ });
91
+ return await super.update(updates, context);
92
+ }
93
+ async validateInviteToken(token, context) {
94
+ const decoded = this.validateToken(token);
95
+ const invite = await super.retrieve(decoded.payload.id, {}, context);
96
+ if (invite.expires_at < new Date()) {
97
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The invite has expired");
98
+ }
99
+ return invite;
100
+ }
101
+ generateToken(data) {
102
+ const jwtSecret = this.getOption("jwt_secret");
103
+ const expiresIn = parseInt(this.getOption("valid_duration")) ||
104
+ DEFAULT_VALID_INVITE_DURATION;
105
+ if (!jwtSecret) {
106
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No jwt_secret was provided in the UserModule's options. Please add one.");
107
+ }
108
+ return jsonwebtoken_1.default.sign(data, jwtSecret, {
109
+ expiresIn,
110
+ jwtid: crypto.randomUUID(),
111
+ });
112
+ }
113
+ validateToken(data) {
114
+ const jwtSecret = this.getOption("jwt_secret");
115
+ if (!jwtSecret) {
116
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No jwt_secret was provided in the UserModule's options. Please add one.");
117
+ }
118
+ return jsonwebtoken_1.default.verify(data, jwtSecret, { complete: true });
119
+ }
120
+ }
121
+ exports.default = InviteService;
122
+ __decorate([
123
+ (0, utils_1.InjectTransactionManager)("inviteRepository_"),
124
+ __metadata("design:type", Function),
125
+ __metadata("design:paramtypes", [Object, Object]),
126
+ __metadata("design:returntype", Promise)
127
+ ], InviteService.prototype, "create", null);
128
+ __decorate([
129
+ (0, utils_1.InjectTransactionManager)("inviteRepository_"),
130
+ __metadata("design:type", Function),
131
+ __metadata("design:paramtypes", [Array, Object]),
132
+ __metadata("design:returntype", Promise)
133
+ ], InviteService.prototype, "refreshInviteTokens", null);
134
+ __decorate([
135
+ (0, utils_1.InjectTransactionManager)("inviteRepository_"),
136
+ __metadata("design:type", Function),
137
+ __metadata("design:paramtypes", [String, Object]),
138
+ __metadata("design:returntype", Promise)
139
+ ], InviteService.prototype, "validateInviteToken", null);
@@ -1,22 +1,36 @@
1
- import { Context, DAL, InternalModuleDeclaration, ModuleJoinerConfig, UserTypes, CreateUserDTO, UpdateUserDTO, UserDTO, ModulesSdkTypes } from "@medusajs/types";
1
+ import { Context, DAL, InternalModuleDeclaration, ModuleJoinerConfig, UserTypes, ModulesSdkTypes, IEventBusModuleService } from "@medusajs/types";
2
2
  import { ModulesSdkUtils } from "@medusajs/utils";
3
- import { User } from "../models";
3
+ import { Invite, User } from "../models";
4
+ import InviteService from "./invite";
4
5
  type InjectedDependencies = {
5
6
  baseRepository: DAL.RepositoryService;
6
7
  userService: ModulesSdkTypes.InternalModuleService<any>;
8
+ inviteService: InviteService<any>;
9
+ eventBusModuleService: IEventBusModuleService;
7
10
  };
8
- declare const UserModuleService_base: new (container: InjectedDependencies) => ModulesSdkUtils.AbstractModuleService<InjectedDependencies, UserTypes.UserDTO, {}>;
9
- export default class UserModuleService<TUser extends User = User> extends UserModuleService_base implements UserTypes.IUserModuleService {
11
+ declare const UserModuleService_base: new (container: InjectedDependencies) => ModulesSdkUtils.AbstractModuleService<InjectedDependencies, UserTypes.UserDTO, {
12
+ Invite: {
13
+ dto: UserTypes.InviteDTO;
14
+ };
15
+ }>;
16
+ export default class UserModuleService<TUser extends User = User, TInvite extends Invite = Invite> extends UserModuleService_base implements UserTypes.IUserModuleService {
10
17
  protected readonly moduleDeclaration: InternalModuleDeclaration;
11
18
  __joinerConfig(): ModuleJoinerConfig;
12
19
  protected baseRepository_: DAL.RepositoryService;
13
20
  protected readonly userService_: ModulesSdkTypes.InternalModuleService<TUser>;
14
- constructor({ userService, baseRepository }: InjectedDependencies, moduleDeclaration: InternalModuleDeclaration);
15
- create(data: CreateUserDTO[], sharedContext?: Context): Promise<UserDTO[]>;
16
- create(data: CreateUserDTO, sharedContext?: Context): Promise<UserDTO>;
17
- protected create_(data: CreateUserDTO[], sharedContext: Context): Promise<TUser[]>;
18
- update(data: UpdateUserDTO[], sharedContext?: Context): Promise<UserDTO[]>;
19
- update(data: UpdateUserDTO, sharedContext?: Context): Promise<UserDTO>;
20
- protected update_(data: UpdateUserDTO[], sharedContext: Context): Promise<TUser[]>;
21
+ protected readonly inviteService_: InviteService<TInvite>;
22
+ constructor({ userService, inviteService, baseRepository }: InjectedDependencies, moduleDeclaration: InternalModuleDeclaration);
23
+ validateInviteToken(token: string, sharedContext?: Context): Promise<UserTypes.InviteDTO>;
24
+ refreshInviteTokens(inviteIds: string[], sharedContext?: Context): Promise<UserTypes.InviteDTO[]>;
25
+ refreshInviteTokens_(inviteIds: string[], sharedContext?: Context): Promise<TInvite[]>;
26
+ create(data: UserTypes.CreateUserDTO[], sharedContext?: Context): Promise<UserTypes.UserDTO[]>;
27
+ create(data: UserTypes.CreateUserDTO, sharedContext?: Context): Promise<UserTypes.UserDTO>;
28
+ update(data: UserTypes.UpdateUserDTO[], sharedContext?: Context): Promise<UserTypes.UserDTO[]>;
29
+ update(data: UserTypes.UpdateUserDTO, sharedContext?: Context): Promise<UserTypes.UserDTO>;
30
+ createInvites(data: UserTypes.CreateInviteDTO[], sharedContext?: Context): Promise<UserTypes.InviteDTO[]>;
31
+ createInvites(data: UserTypes.CreateInviteDTO, sharedContext?: Context): Promise<UserTypes.InviteDTO>;
32
+ private createInvites_;
33
+ updateInvites(data: UserTypes.UpdateInviteDTO[], sharedContext?: Context): Promise<UserTypes.InviteDTO[]>;
34
+ updateInvites(data: UserTypes.UpdateInviteDTO, sharedContext?: Context): Promise<UserTypes.InviteDTO>;
21
35
  }
22
36
  export {};
@@ -15,67 +15,190 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const utils_1 = require("@medusajs/utils");
16
16
  const joiner_config_1 = require("../joiner-config");
17
17
  const _models_1 = require("../models");
18
- const generateMethodForModels = [];
18
+ const generateMethodForModels = [_models_1.Invite];
19
19
  class UserModuleService extends utils_1.ModulesSdkUtils.abstractModuleServiceFactory(_models_1.User, generateMethodForModels, joiner_config_1.entityNameToLinkableKeysMap) {
20
20
  __joinerConfig() {
21
21
  return joiner_config_1.joinerConfig;
22
22
  }
23
- constructor({ userService, baseRepository }, moduleDeclaration) {
23
+ constructor({ userService, inviteService, baseRepository }, moduleDeclaration) {
24
24
  // @ts-ignore
25
25
  super(...arguments);
26
26
  this.moduleDeclaration = moduleDeclaration;
27
27
  this.baseRepository_ = baseRepository;
28
28
  this.userService_ = userService;
29
+ this.inviteService_ = inviteService.withModuleOptions(this.moduleDeclaration);
30
+ }
31
+ async validateInviteToken(token, sharedContext = {}) {
32
+ const invite = await this.inviteService_.validateInviteToken(token, sharedContext);
33
+ return await this.baseRepository_.serialize(invite, {
34
+ populate: true,
35
+ });
36
+ }
37
+ async refreshInviteTokens(inviteIds, sharedContext = {}) {
38
+ const invites = await this.refreshInviteTokens_(inviteIds, sharedContext);
39
+ sharedContext.messageAggregator?.saveRawMessageData(invites.map((invite) => ({
40
+ eventName: utils_1.UserEvents.invite_token_generated,
41
+ metadata: {
42
+ service: this.constructor.name,
43
+ action: "token_generated",
44
+ object: "invite",
45
+ },
46
+ data: { id: invite.id },
47
+ })));
48
+ return await this.baseRepository_.serialize(invites, {
49
+ populate: true,
50
+ });
51
+ }
52
+ async refreshInviteTokens_(inviteIds, sharedContext = {}) {
53
+ return await this.inviteService_.refreshInviteTokens(inviteIds, sharedContext);
29
54
  }
30
55
  async create(data, sharedContext = {}) {
31
56
  const input = Array.isArray(data) ? data : [data];
32
- const users = await this.create_(input, sharedContext);
57
+ const users = await this.userService_.create(input, sharedContext);
33
58
  const serializedUsers = await this.baseRepository_.serialize(users, {
34
59
  populate: true,
35
60
  });
61
+ sharedContext.messageAggregator?.saveRawMessageData(users.map((user) => ({
62
+ eventName: utils_1.UserEvents.created,
63
+ metadata: {
64
+ service: this.constructor.name,
65
+ action: utils_1.CommonEvents.CREATED,
66
+ object: "user",
67
+ },
68
+ data: { id: user.id },
69
+ })));
36
70
  return Array.isArray(data) ? serializedUsers : serializedUsers[0];
37
71
  }
38
- async create_(data, sharedContext) {
39
- return await this.userService_.create(data, sharedContext);
40
- }
41
72
  async update(data, sharedContext = {}) {
42
73
  const input = Array.isArray(data) ? data : [data];
43
- const updatedUsers = await this.update_(input, sharedContext);
74
+ const updatedUsers = await this.userService_.update(input, sharedContext);
44
75
  const serializedUsers = await this.baseRepository_.serialize(updatedUsers, {
45
76
  populate: true,
46
77
  });
78
+ sharedContext.messageAggregator?.saveRawMessageData(updatedUsers.map((user) => ({
79
+ eventName: utils_1.UserEvents.updated,
80
+ metadata: {
81
+ service: this.constructor.name,
82
+ action: utils_1.CommonEvents.UPDATED,
83
+ object: "user",
84
+ },
85
+ data: { id: user.id },
86
+ })));
47
87
  return Array.isArray(data) ? serializedUsers : serializedUsers[0];
48
88
  }
49
- async update_(data, sharedContext) {
50
- return await this.userService_.update(data, sharedContext);
89
+ async createInvites(data, sharedContext = {}) {
90
+ const input = Array.isArray(data) ? data : [data];
91
+ const invites = await this.createInvites_(input, sharedContext);
92
+ const serializedInvites = await this.baseRepository_.serialize(invites, {
93
+ populate: true,
94
+ });
95
+ sharedContext.messageAggregator?.saveRawMessageData(invites.map((invite) => ({
96
+ eventName: utils_1.UserEvents.invite_created,
97
+ metadata: {
98
+ service: this.constructor.name,
99
+ action: utils_1.CommonEvents.CREATED,
100
+ object: "invite",
101
+ },
102
+ data: { id: invite.id },
103
+ })));
104
+ sharedContext.messageAggregator?.saveRawMessageData(invites.map((invite) => ({
105
+ eventName: utils_1.UserEvents.invite_token_generated,
106
+ metadata: {
107
+ service: this.constructor.name,
108
+ action: "token_generated",
109
+ object: "invite",
110
+ },
111
+ data: { id: invite.id },
112
+ })));
113
+ return Array.isArray(data) ? serializedInvites : serializedInvites[0];
114
+ }
115
+ async createInvites_(data, sharedContext = {}) {
116
+ const toCreate = data.map((invite) => {
117
+ return {
118
+ ...invite,
119
+ expires_at: new Date(),
120
+ token: "placeholder",
121
+ };
122
+ });
123
+ return await this.inviteService_.create(toCreate, sharedContext);
124
+ }
125
+ async updateInvites(data, sharedContext = {}) {
126
+ const input = Array.isArray(data) ? data : [data];
127
+ const updatedInvites = await this.inviteService_.update(input, sharedContext);
128
+ const serializedInvites = await this.baseRepository_.serialize(updatedInvites, {
129
+ populate: true,
130
+ });
131
+ sharedContext.messageAggregator?.saveRawMessageData(serializedInvites.map((invite) => ({
132
+ eventName: utils_1.UserEvents.invite_updated,
133
+ metadata: {
134
+ service: this.constructor.name,
135
+ action: utils_1.CommonEvents.UPDATED,
136
+ object: "invite",
137
+ },
138
+ data: { id: invite.id },
139
+ })));
140
+ return Array.isArray(data) ? serializedInvites : serializedInvites[0];
51
141
  }
52
142
  }
53
143
  exports.default = UserModuleService;
144
+ __decorate([
145
+ (0, utils_1.InjectTransactionManager)("baseRepository_"),
146
+ __param(1, (0, utils_1.MedusaContext)()),
147
+ __metadata("design:type", Function),
148
+ __metadata("design:paramtypes", [String, Object]),
149
+ __metadata("design:returntype", Promise)
150
+ ], UserModuleService.prototype, "validateInviteToken", null);
54
151
  __decorate([
55
152
  (0, utils_1.InjectManager)("baseRepository_"),
153
+ (0, utils_1.EmitEvents)(),
56
154
  __param(1, (0, utils_1.MedusaContext)()),
57
155
  __metadata("design:type", Function),
58
- __metadata("design:paramtypes", [Object, Object]),
156
+ __metadata("design:paramtypes", [Array, Object]),
59
157
  __metadata("design:returntype", Promise)
60
- ], UserModuleService.prototype, "create", null);
158
+ ], UserModuleService.prototype, "refreshInviteTokens", null);
61
159
  __decorate([
62
160
  (0, utils_1.InjectTransactionManager)("baseRepository_"),
63
161
  __param(1, (0, utils_1.MedusaContext)()),
64
162
  __metadata("design:type", Function),
65
163
  __metadata("design:paramtypes", [Array, Object]),
66
164
  __metadata("design:returntype", Promise)
67
- ], UserModuleService.prototype, "create_", null);
165
+ ], UserModuleService.prototype, "refreshInviteTokens_", null);
68
166
  __decorate([
69
167
  (0, utils_1.InjectManager)("baseRepository_"),
168
+ (0, utils_1.EmitEvents)(),
169
+ __param(1, (0, utils_1.MedusaContext)()),
170
+ __metadata("design:type", Function),
171
+ __metadata("design:paramtypes", [Object, Object]),
172
+ __metadata("design:returntype", Promise)
173
+ ], UserModuleService.prototype, "create", null);
174
+ __decorate([
175
+ (0, utils_1.InjectManager)("baseRepository_"),
176
+ (0, utils_1.EmitEvents)(),
70
177
  __param(1, (0, utils_1.MedusaContext)()),
71
178
  __metadata("design:type", Function),
72
179
  __metadata("design:paramtypes", [Object, Object]),
73
180
  __metadata("design:returntype", Promise)
74
181
  ], UserModuleService.prototype, "update", null);
182
+ __decorate([
183
+ (0, utils_1.InjectManager)("baseRepository_"),
184
+ (0, utils_1.EmitEvents)(),
185
+ __param(1, (0, utils_1.MedusaContext)()),
186
+ __metadata("design:type", Function),
187
+ __metadata("design:paramtypes", [Object, Object]),
188
+ __metadata("design:returntype", Promise)
189
+ ], UserModuleService.prototype, "createInvites", null);
75
190
  __decorate([
76
191
  (0, utils_1.InjectTransactionManager)("baseRepository_"),
77
192
  __param(1, (0, utils_1.MedusaContext)()),
78
193
  __metadata("design:type", Function),
79
194
  __metadata("design:paramtypes", [Array, Object]),
80
195
  __metadata("design:returntype", Promise)
81
- ], UserModuleService.prototype, "update_", null);
196
+ ], UserModuleService.prototype, "createInvites_", null);
197
+ __decorate([
198
+ (0, utils_1.InjectManager)("baseRepository_"),
199
+ (0, utils_1.EmitEvents)(),
200
+ __param(1, (0, utils_1.MedusaContext)()),
201
+ __metadata("design:type", Function),
202
+ __metadata("design:paramtypes", [Object, Object]),
203
+ __metadata("design:returntype", Promise)
204
+ ], UserModuleService.prototype, "updateInvites", null);
@@ -2,4 +2,4 @@ import { Logger } from "@medusajs/types";
2
2
  export type InitializeModuleInjectableDependencies = {
3
3
  logger?: Logger;
4
4
  };
5
- export * as ServiceTypes from "./services";
5
+ export * from "./services";
@@ -10,18 +10,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
24
15
  };
25
16
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ServiceTypes = void 0;
27
- exports.ServiceTypes = __importStar(require("./services"));
17
+ __exportStar(require("./services"), exports);
@@ -1 +1 @@
1
- export * from "./user";
1
+ export * as InviteServiceTypes from "./invite";
@@ -10,8 +10,18 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
15
24
  };
16
25
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./user"), exports);
26
+ exports.InviteServiceTypes = void 0;
27
+ exports.InviteServiceTypes = __importStar(require("./invite"));
@@ -0,0 +1,5 @@
1
+ export interface CreateInviteDTO {
2
+ email: string;
3
+ accepted?: boolean;
4
+ metadata?: Record<string, unknown> | null;
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medusajs/user",
3
- "version": "0.0.1",
3
+ "version": "0.0.2-next-20240319121007",
4
4
  "description": "Medusa Users module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "prepublishOnly": "cross-env NODE_ENV=production tsc --build && tsc-alias -p tsconfig.json",
30
30
  "build": "rimraf dist && tsc --build && tsc-alias -p tsconfig.json",
31
31
  "test": "jest --runInBand --bail --forceExit -- src/**/__tests__/**/*.ts",
32
- "test:integration": "jest --runInBand --forceExit -- integration-tests/**/__tests__/**/*.ts",
32
+ "test:integration": "jest --forceExit -- integration-tests/**/__tests__/**/*.ts",
33
33
  "migration:generate": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm migration:generate",
34
34
  "migration:initial": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm migration:create --initial",
35
35
  "migration:create": " MIKRO_ORM_CLI=./mikro-orm.config.dev.ts mikro-orm migration:create",
@@ -40,7 +40,7 @@
40
40
  "@mikro-orm/cli": "5.9.7",
41
41
  "cross-env": "^5.2.1",
42
42
  "jest": "^29.6.3",
43
- "medusa-test-utils": "^1.1.40",
43
+ "medusa-test-utils": "1.1.42-next-20240319121007",
44
44
  "rimraf": "^3.0.2",
45
45
  "ts-jest": "^29.1.1",
46
46
  "ts-node": "^10.9.1",
@@ -48,14 +48,15 @@
48
48
  "typescript": "^5.1.6"
49
49
  },
50
50
  "dependencies": {
51
- "@medusajs/modules-sdk": "^1.12.7",
52
- "@medusajs/types": "^1.11.11",
53
- "@medusajs/utils": "^1.11.4",
51
+ "@medusajs/modules-sdk": "1.12.9-next-20240319121007",
52
+ "@medusajs/types": "1.11.14-next-20240319121007",
53
+ "@medusajs/utils": "1.11.7-next-20240319121007",
54
54
  "@mikro-orm/core": "5.9.7",
55
55
  "@mikro-orm/migrations": "5.9.7",
56
56
  "@mikro-orm/postgresql": "5.9.7",
57
57
  "awilix": "^8.0.0",
58
- "dotenv": "16.3.1",
58
+ "dotenv": "^16.4.5",
59
+ "jsonwebtoken": "^9.0.2",
59
60
  "knex": "2.4.2"
60
61
  }
61
62
  }
@@ -1,5 +0,0 @@
1
- import { Migration } from '@mikro-orm/migrations';
2
- export declare class Migration20240201081925 extends Migration {
3
- up(): Promise<void>;
4
- down(): Promise<void>;
5
- }
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Migration20240201081925 = void 0;
4
- const migrations_1 = require("@mikro-orm/migrations");
5
- class Migration20240201081925 extends migrations_1.Migration {
6
- async up() {
7
- this.addSql('create table "user" ("id" text not null, constraint "user_pkey" primary key ("id"));');
8
- }
9
- async down() {
10
- this.addSql('drop table if exists "user" cascade;');
11
- }
12
- }
13
- exports.Migration20240201081925 = Migration20240201081925;
@@ -1,10 +0,0 @@
1
- export type UserDTO = {
2
- id: string;
3
- };
4
- export type CreateUserDTO = {
5
- id?: string;
6
- };
7
- export type UpdateUserDTO = {
8
- id: string;
9
- };
10
- export type FilterableUserProps = {};
File without changes