@ntalmagor/3drise-common 1.0.0

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.
Files changed (61) hide show
  1. package/build/database.d.ts +3 -0
  2. package/build/database.js +33 -0
  3. package/build/errors/bad-request-error.d.ts +9 -0
  4. package/build/errors/bad-request-error.js +16 -0
  5. package/build/errors/custom-error.d.ts +8 -0
  6. package/build/errors/custom-error.js +10 -0
  7. package/build/errors/database-connection-error.d.ts +9 -0
  8. package/build/errors/database-connection-error.js +16 -0
  9. package/build/errors/not-authorized-error.d.ts +8 -0
  10. package/build/errors/not-authorized-error.js +15 -0
  11. package/build/errors/not-found-error.d.ts +8 -0
  12. package/build/errors/not-found-error.js +15 -0
  13. package/build/errors/request-validation-error.d.ts +14 -0
  14. package/build/errors/request-validation-error.js +22 -0
  15. package/build/events/base-listener.d.ts +18 -0
  16. package/build/events/base-listener.js +32 -0
  17. package/build/events/base-publisher.d.ts +13 -0
  18. package/build/events/base-publisher.js +20 -0
  19. package/build/events/subjects.d.ts +9 -0
  20. package/build/events/subjects.js +13 -0
  21. package/build/events/types/order-status.d.ts +6 -0
  22. package/build/events/types/order-status.js +18 -0
  23. package/build/events/types/upload-status.d.ts +18 -0
  24. package/build/events/types/upload-status.js +22 -0
  25. package/build/events/upload-complete-event.d.ts +9 -0
  26. package/build/events/upload-complete-event.js +2 -0
  27. package/build/index.d.ts +24 -0
  28. package/build/index.js +48 -0
  29. package/build/middlewares/current-user.d.ts +16 -0
  30. package/build/middlewares/current-user.js +26 -0
  31. package/build/middlewares/error-handler.d.ts +2 -0
  32. package/build/middlewares/error-handler.js +14 -0
  33. package/build/middlewares/require-auth.d.ts +2 -0
  34. package/build/middlewares/require-auth.js +11 -0
  35. package/build/middlewares/validate-request.d.ts +2 -0
  36. package/build/middlewares/validate-request.js +13 -0
  37. package/build/models/Asset.d.ts +52 -0
  38. package/build/models/Asset.js +133 -0
  39. package/build/models/Project.d.ts +27 -0
  40. package/build/models/Project.js +106 -0
  41. package/build/models/ProjectAsset.d.ts +12 -0
  42. package/build/models/ProjectAsset.js +58 -0
  43. package/build/models/ProjectDependency.d.ts +11 -0
  44. package/build/models/ProjectDependency.js +57 -0
  45. package/build/models/Transaction.d.ts +22 -0
  46. package/build/models/Transaction.js +92 -0
  47. package/build/models/User.d.ts +17 -0
  48. package/build/models/User.js +79 -0
  49. package/build/models/UserAsset.d.ts +13 -0
  50. package/build/models/UserAsset.js +62 -0
  51. package/build/models/index.d.ts +15 -0
  52. package/build/models/index.js +54 -0
  53. package/build/utils/redis.d.ts +0 -0
  54. package/build/utils/redis.js +1 -0
  55. package/build/utils/redisClient.d.ts +4 -0
  56. package/build/utils/redisClient.js +22 -0
  57. package/build/utils/storage.d.ts +16 -0
  58. package/build/utils/storage.js +102 -0
  59. package/build/utils/types.d.ts +10 -0
  60. package/build/utils/types.js +2 -0
  61. package/package.json +45 -0
@@ -0,0 +1,62 @@
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
+ exports.UserAsset = void 0;
13
+ const sequelize_typescript_1 = require("sequelize-typescript");
14
+ const User_1 = require("./User");
15
+ const Asset_1 = require("./Asset");
16
+ let UserAsset = class UserAsset extends sequelize_typescript_1.Model {
17
+ };
18
+ exports.UserAsset = UserAsset;
19
+ __decorate([
20
+ sequelize_typescript_1.PrimaryKey,
21
+ (0, sequelize_typescript_1.Default)(sequelize_typescript_1.DataType.UUIDV4),
22
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.UUID),
23
+ __metadata("design:type", String)
24
+ ], UserAsset.prototype, "id", void 0);
25
+ __decorate([
26
+ (0, sequelize_typescript_1.ForeignKey)(() => User_1.User),
27
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.UUID),
28
+ __metadata("design:type", String)
29
+ ], UserAsset.prototype, "userId", void 0);
30
+ __decorate([
31
+ (0, sequelize_typescript_1.ForeignKey)(() => Asset_1.Asset),
32
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.UUID),
33
+ __metadata("design:type", String)
34
+ ], UserAsset.prototype, "assetId", void 0);
35
+ __decorate([
36
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.DATE),
37
+ __metadata("design:type", Date)
38
+ ], UserAsset.prototype, "acquiredAt", void 0);
39
+ __decorate([
40
+ sequelize_typescript_1.CreatedAt,
41
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.DATE),
42
+ __metadata("design:type", Date)
43
+ ], UserAsset.prototype, "createdAt", void 0);
44
+ __decorate([
45
+ sequelize_typescript_1.UpdatedAt,
46
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.DATE),
47
+ __metadata("design:type", Date)
48
+ ], UserAsset.prototype, "updatedAt", void 0);
49
+ __decorate([
50
+ (0, sequelize_typescript_1.BelongsTo)(() => User_1.User),
51
+ __metadata("design:type", User_1.User)
52
+ ], UserAsset.prototype, "user", void 0);
53
+ __decorate([
54
+ (0, sequelize_typescript_1.BelongsTo)(() => Asset_1.Asset),
55
+ __metadata("design:type", Asset_1.Asset)
56
+ ], UserAsset.prototype, "asset", void 0);
57
+ exports.UserAsset = UserAsset = __decorate([
58
+ (0, sequelize_typescript_1.Table)({
59
+ tableName: 'user_assets',
60
+ timestamps: true,
61
+ })
62
+ ], UserAsset);
@@ -0,0 +1,15 @@
1
+ import 'reflect-metadata';
2
+ import sequelize from '../database';
3
+ import { User } from './User';
4
+ import { Project } from './Project';
5
+ import { ProjectDependency } from './ProjectDependency';
6
+ import { Transaction } from './Transaction';
7
+ import { Asset } from './Asset';
8
+ import { UserAsset } from './UserAsset';
9
+ import { ProjectAsset } from './ProjectAsset';
10
+ export declare const initializeDatabase: (force: boolean) => Promise<void>;
11
+ export { User, Project, ProjectDependency, Transaction, Asset, UserAsset, ProjectAsset };
12
+ export { ProjectStatus } from './Project';
13
+ export { TransactionStatus } from './Transaction';
14
+ export { AssetType, AssetPrivacy } from './Asset';
15
+ export default sequelize;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AssetPrivacy = exports.AssetType = exports.TransactionStatus = exports.ProjectStatus = exports.ProjectAsset = exports.UserAsset = exports.Asset = exports.Transaction = exports.ProjectDependency = exports.Project = exports.User = exports.initializeDatabase = void 0;
16
+ require("reflect-metadata");
17
+ const database_1 = __importDefault(require("../database"));
18
+ const User_1 = require("./User");
19
+ Object.defineProperty(exports, "User", { enumerable: true, get: function () { return User_1.User; } });
20
+ const Project_1 = require("./Project");
21
+ Object.defineProperty(exports, "Project", { enumerable: true, get: function () { return Project_1.Project; } });
22
+ const ProjectDependency_1 = require("./ProjectDependency");
23
+ Object.defineProperty(exports, "ProjectDependency", { enumerable: true, get: function () { return ProjectDependency_1.ProjectDependency; } });
24
+ const Transaction_1 = require("./Transaction");
25
+ Object.defineProperty(exports, "Transaction", { enumerable: true, get: function () { return Transaction_1.Transaction; } });
26
+ const Asset_1 = require("./Asset");
27
+ Object.defineProperty(exports, "Asset", { enumerable: true, get: function () { return Asset_1.Asset; } });
28
+ const UserAsset_1 = require("./UserAsset");
29
+ Object.defineProperty(exports, "UserAsset", { enumerable: true, get: function () { return UserAsset_1.UserAsset; } });
30
+ const ProjectAsset_1 = require("./ProjectAsset");
31
+ Object.defineProperty(exports, "ProjectAsset", { enumerable: true, get: function () { return ProjectAsset_1.ProjectAsset; } });
32
+ // Initialize database and sync models
33
+ const initializeDatabase = (force) => __awaiter(void 0, void 0, void 0, function* () {
34
+ try {
35
+ yield database_1.default.authenticate();
36
+ console.log('Database connection has been established successfully.');
37
+ // Sync all models
38
+ yield database_1.default.sync({ force }); // Set to true to drop and recreate tables
39
+ console.log('All models were synchronized successfully.');
40
+ }
41
+ catch (error) {
42
+ console.error('Unable to connect to the database:', error);
43
+ throw error;
44
+ }
45
+ });
46
+ exports.initializeDatabase = initializeDatabase;
47
+ var Project_2 = require("./Project");
48
+ Object.defineProperty(exports, "ProjectStatus", { enumerable: true, get: function () { return Project_2.ProjectStatus; } });
49
+ var Transaction_2 = require("./Transaction");
50
+ Object.defineProperty(exports, "TransactionStatus", { enumerable: true, get: function () { return Transaction_2.TransactionStatus; } });
51
+ var Asset_2 = require("./Asset");
52
+ Object.defineProperty(exports, "AssetType", { enumerable: true, get: function () { return Asset_2.AssetType; } });
53
+ Object.defineProperty(exports, "AssetPrivacy", { enumerable: true, get: function () { return Asset_2.AssetPrivacy; } });
54
+ exports.default = database_1.default;
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,4 @@
1
+ import type { Redis as RedisType } from 'ioredis';
2
+ declare const getRedisClient: () => RedisType;
3
+ export default getRedisClient;
4
+ export type { RedisType };
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ioredis_1 = __importDefault(require("ioredis"));
7
+ const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379';
8
+ let redisClient = null;
9
+ const getRedisClient = () => {
10
+ if (!redisClient) {
11
+ console.log('Initializing Redis connection...');
12
+ redisClient = new ioredis_1.default(redisUrl);
13
+ redisClient.on('connect', () => {
14
+ console.log('Connected to Redis');
15
+ });
16
+ redisClient.on('error', (err) => {
17
+ console.error('Redis connection error:', err);
18
+ });
19
+ }
20
+ return redisClient;
21
+ };
22
+ exports.default = getRedisClient;
@@ -0,0 +1,16 @@
1
+ import { S3Client } from '@aws-sdk/client-s3';
2
+ declare const s3: S3Client;
3
+ export default s3;
4
+ export declare function testConnection(): Promise<void>;
5
+ export interface FileObject {
6
+ key: string;
7
+ url: string;
8
+ size: number;
9
+ lastModified: Date;
10
+ contentType?: string;
11
+ }
12
+ export declare function uploadFile(bucket: string, key: string, body: Buffer, contentType?: string): Promise<FileObject>;
13
+ export declare function listAllFiles(bucket: string, prefix: string): Promise<FileObject[]>;
14
+ export declare function generatePublicUrl(bucket: string, path: string): string;
15
+ export declare function getFile(bucket: string, key: string): Promise<import("@aws-sdk/client-s3").GetObjectCommandOutput>;
16
+ export declare function deleteFile(bucket: string, key: string): Promise<void>;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.testConnection = testConnection;
13
+ exports.uploadFile = uploadFile;
14
+ exports.listAllFiles = listAllFiles;
15
+ exports.generatePublicUrl = generatePublicUrl;
16
+ exports.getFile = getFile;
17
+ exports.deleteFile = deleteFile;
18
+ const client_s3_1 = require("@aws-sdk/client-s3");
19
+ // Configure these with your DigitalOcean Spaces credentials
20
+ const s3 = new client_s3_1.S3Client({
21
+ region: 'sfo3',
22
+ endpoint: 'https://sfo3.digitaloceanspaces.com',
23
+ credentials: {
24
+ accessKeyId: process.env.DO_SPACES_ACCESS_KEY || "DO00HBBJUNJG8873QHLX",
25
+ secretAccessKey: process.env.DO_SPACES_SECRET_KEY || "Ts9GDUs0myef5Pf8l8+t/CppTQjx2bNk5fk85qvMj2U",
26
+ },
27
+ });
28
+ exports.default = s3;
29
+ function testConnection() {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ try {
32
+ const result = yield s3.send(new client_s3_1.ListBucketsCommand({}));
33
+ console.log('Connected to DigitalOcean Spaces:', result.Buckets);
34
+ }
35
+ catch (err) {
36
+ console.error('Connection test failed:', err);
37
+ }
38
+ });
39
+ }
40
+ function uploadFile(bucket, key, body, contentType) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ yield s3.send(new client_s3_1.PutObjectCommand({
43
+ Bucket: bucket,
44
+ Key: key,
45
+ Body: body,
46
+ ACL: 'public-read',
47
+ ContentType: contentType,
48
+ }));
49
+ return {
50
+ key,
51
+ url: generatePublicUrl(bucket, key),
52
+ size: body.length,
53
+ lastModified: new Date(),
54
+ contentType,
55
+ };
56
+ });
57
+ }
58
+ function listAllFiles(bucket, prefix) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ console.log('Listing all files in bucket:', bucket);
61
+ try {
62
+ const command = new client_s3_1.ListObjectsV2Command({
63
+ Bucket: bucket,
64
+ Prefix: prefix,
65
+ });
66
+ const response = yield s3.send(command);
67
+ if (!response.Contents) {
68
+ return [];
69
+ }
70
+ return response.Contents.map(object => ({
71
+ key: object.Key || '',
72
+ url: generatePublicUrl(bucket, object.Key || ''),
73
+ size: object.Size || 0,
74
+ lastModified: object.LastModified || new Date(),
75
+ contentType: undefined, // S3 ListObjects doesn't return content type
76
+ }));
77
+ }
78
+ catch (error) {
79
+ console.error('Error listing files:', error);
80
+ throw error;
81
+ }
82
+ });
83
+ }
84
+ function generatePublicUrl(bucket, path) {
85
+ return `https://${bucket}.sfo3.digitaloceanspaces.com/${path}`;
86
+ }
87
+ function getFile(bucket, key) {
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ return yield s3.send(new client_s3_1.GetObjectCommand({
90
+ Bucket: bucket,
91
+ Key: key,
92
+ }));
93
+ });
94
+ }
95
+ function deleteFile(bucket, key) {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ yield s3.send(new client_s3_1.DeleteObjectCommand({
98
+ Bucket: bucket,
99
+ Key: key,
100
+ }));
101
+ });
102
+ }
@@ -0,0 +1,10 @@
1
+ export type MinifiedFile = {
2
+ name: string;
3
+ mediaLink: string;
4
+ size: string;
5
+ updated: string;
6
+ };
7
+ export type ImageFile = MinifiedFile & {
8
+ fullImageName: string;
9
+ fullImageLink: string;
10
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@ntalmagor/3drise-common",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./build/index.js",
6
+ "types": "./build/index.d.ts",
7
+ "files": [
8
+ "build/**/*"
9
+ ],
10
+ "scripts": {
11
+ "clean": "del-cli ./build/*",
12
+ "build": "npm run clean & tsc",
13
+ "pub": "git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish"
14
+ },
15
+ "keywords": [],
16
+ "author": "",
17
+ "license": "ISC",
18
+ "devDependencies": {
19
+ "del-cli": "^5.1.0",
20
+ "@types/cors": "^2.8.17",
21
+ "@types/node": "^20.19.17",
22
+ "nodemon": "^3.1.10",
23
+ "ts-node": "^10.9.1",
24
+ "typescript": "^5.3.3"
25
+ },
26
+ "dependencies": {
27
+ "@aws-sdk/client-s3": "^3.975.0",
28
+ "@types/cookie-session": "^2.0.48",
29
+ "@types/express": "^4.17.21",
30
+ "@types/jsonwebtoken": "^9.0.5",
31
+ "@types/transform-coordinates": "^1.0.3",
32
+ "@types/uuid": "^10.0.0",
33
+ "cookie-session": "^2.0.0",
34
+ "express": "^4.18.2",
35
+ "express-validator": "^7.0.1",
36
+ "ioredis": "^5.7.0",
37
+ "jsonwebtoken": "^9.0.2",
38
+ "mysql2": "^3.15.0",
39
+ "node-nats-streaming": "^0.3.2",
40
+ "sequelize": "^6.37.7",
41
+ "sequelize-typescript": "^2.1.6",
42
+ "transform-coordinates": "^1.0.0",
43
+ "uuid": "^13.0.0"
44
+ }
45
+ }