@voscarmv/aimessagestore 1.0.3

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.
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # aimessagestore
2
+
3
+ Message storage and retrieval backend for [@voscarmv/aichatbot](https://www.npmjs.com/package/@voscarmv/aichatbot)
4
+
5
+ ## Install
6
+
7
+ You may install `postgresql` and create a new username, password and database, with this script:
8
+
9
+ ```bash
10
+ #!/bin/bash
11
+
12
+ ## Install postgresql
13
+ if grep -e 'DATABASE_URL=' ./.env ; then
14
+ exit
15
+ fi
16
+
17
+ sudo apt install -y postgresql postgresql-contrib
18
+
19
+ read -p "Postgres username: " PGUSER
20
+ read -s -p "Postgres password: " PASS
21
+ echo
22
+ read -p "Database name: " DB
23
+
24
+ sudo -u postgres psql <<EOF
25
+ CREATE DATABASE $DB;
26
+ CREATE USER $PGUSER WITH PASSWORD '$PASS';
27
+ GRANT ALL PRIVILEGES ON DATABASE $DB TO $PGUSER;
28
+ \c $DB
29
+ GRANT ALL ON SCHEMA public TO $PGUSER;
30
+ EOF
31
+
32
+ echo "DATABASE_URL=postgres://$PGUSER:$PASS@localhost/$DB" >> .env
33
+ echo "✅ Database, user, and .env file created. Edit .env if needed."
34
+ ```
35
+
36
+ Then just `npx drizzle-kit create` to create your `schema.ts` and you are ready to deploy with `npm publish`.
package/dist/db.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":""}
package/dist/db.js ADDED
@@ -0,0 +1,64 @@
1
+ // import 'dotenv/config';
2
+ // import { messages } from './schema.js';
3
+ // import { drizzle } from 'drizzle-orm/node-postgres';
4
+ // import {
5
+ // sql,
6
+ // eq,
7
+ // and,
8
+ // asc,
9
+ // type InferSelectModel
10
+ // } from 'drizzle-orm';
11
+ export {};
12
+ // const db = drizzle(process.env.DB_URL!);
13
+ // // Types
14
+ // export type Message = InferSelectModel<typeof messages>;
15
+ // // ---------------------- MESSAGES CRUD ----------------------
16
+ // export async function insertMessage(
17
+ // user_id: string,
18
+ // queued: boolean,
19
+ // message: object
20
+ // ): Promise<Message[]> {
21
+ // return await db
22
+ // .insert(messages)
23
+ // .values({
24
+ // user_id,
25
+ // queued,
26
+ // message: JSON.stringify(message)
27
+ // })
28
+ // .returning();
29
+ // }
30
+ // export async function readMessages(user_id: string): Promise<Message[]> {
31
+ // return await db
32
+ // .select()
33
+ // .from(messages)
34
+ // .where(eq(messages.user_id, user_id))
35
+ // .orderBy(asc(messages.updated_at), asc(messages.id));
36
+ // }
37
+ // export async function queuedMessages(user_id: string): Promise<Message[]> {
38
+ // return await db
39
+ // .select()
40
+ // .from(messages)
41
+ // .where(
42
+ // and(
43
+ // eq(messages.queued, true),
44
+ // eq(messages.user_id, user_id)
45
+ // )
46
+ // );
47
+ // }
48
+ // export async function unqueueMessages(user_id: string): Promise<Message[]> {
49
+ // return await db
50
+ // .update(messages)
51
+ // .set({
52
+ // queued: false,
53
+ // updated_at: sql`now()`
54
+ // })
55
+ // .where(eq(messages.user_id, user_id))
56
+ // .returning();
57
+ // }
58
+ // export async function deleteMessage(id: number): Promise<Message[]> {
59
+ // return await db
60
+ // .delete(messages)
61
+ // .where(eq(messages.id, id))
62
+ // .returning();
63
+ // }
64
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,0CAA0C;AAC1C,uDAAuD;AACvD,WAAW;AACX,WAAW;AACX,UAAU;AACV,WAAW;AACX,WAAW;AACX,4BAA4B;AAC5B,wBAAwB;;AAExB,2CAA2C;AAE3C,WAAW;AACX,2DAA2D;AAE3D,iEAAiE;AAEjE,uCAAuC;AACvC,uBAAuB;AACvB,uBAAuB;AACvB,sBAAsB;AACtB,0BAA0B;AAC1B,sBAAsB;AACtB,4BAA4B;AAC5B,oBAAoB;AACpB,uBAAuB;AACvB,sBAAsB;AACtB,+CAA+C;AAC/C,aAAa;AACb,wBAAwB;AACxB,IAAI;AAEJ,4EAA4E;AAC5E,sBAAsB;AACtB,oBAAoB;AACpB,0BAA0B;AAC1B,gDAAgD;AAChD,gEAAgE;AAChE,IAAI;AAEJ,8EAA8E;AAC9E,sBAAsB;AACtB,oBAAoB;AACpB,0BAA0B;AAC1B,kBAAkB;AAClB,mBAAmB;AACnB,6CAA6C;AAC7C,gDAAgD;AAChD,gBAAgB;AAChB,aAAa;AACb,IAAI;AAEJ,+EAA+E;AAC/E,sBAAsB;AACtB,4BAA4B;AAC5B,iBAAiB;AACjB,6BAA6B;AAC7B,qCAAqC;AACrC,aAAa;AACb,gDAAgD;AAChD,wBAAwB;AACxB,IAAI;AAEJ,wEAAwE;AACxE,sBAAsB;AACtB,4BAA4B;AAC5B,sCAAsC;AACtC,wBAAwB;AACxB,IAAI"}
@@ -0,0 +1,8 @@
1
+ CREATE TABLE "messages" (
2
+ "id" bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "messages_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1),
3
+ "user_id" varchar(255) NOT NULL,
4
+ "message" text NOT NULL,
5
+ "queued" boolean NOT NULL,
6
+ "created_at" timestamp DEFAULT now() NOT NULL,
7
+ "updated_at" timestamp DEFAULT now() NOT NULL
8
+ );
@@ -0,0 +1,81 @@
1
+ {
2
+ "id": "5356b30a-ed64-4370-bf5f-6cbfdae92a88",
3
+ "prevId": "00000000-0000-0000-0000-000000000000",
4
+ "version": "7",
5
+ "dialect": "postgresql",
6
+ "tables": {
7
+ "public.messages": {
8
+ "name": "messages",
9
+ "schema": "",
10
+ "columns": {
11
+ "id": {
12
+ "name": "id",
13
+ "type": "bigint",
14
+ "primaryKey": true,
15
+ "notNull": true,
16
+ "identity": {
17
+ "type": "always",
18
+ "name": "messages_id_seq",
19
+ "schema": "public",
20
+ "increment": "1",
21
+ "startWith": "1",
22
+ "minValue": "1",
23
+ "maxValue": "9223372036854775807",
24
+ "cache": "1",
25
+ "cycle": false
26
+ }
27
+ },
28
+ "user_id": {
29
+ "name": "user_id",
30
+ "type": "varchar(255)",
31
+ "primaryKey": false,
32
+ "notNull": true
33
+ },
34
+ "message": {
35
+ "name": "message",
36
+ "type": "text",
37
+ "primaryKey": false,
38
+ "notNull": true
39
+ },
40
+ "queued": {
41
+ "name": "queued",
42
+ "type": "boolean",
43
+ "primaryKey": false,
44
+ "notNull": true
45
+ },
46
+ "created_at": {
47
+ "name": "created_at",
48
+ "type": "timestamp",
49
+ "primaryKey": false,
50
+ "notNull": true,
51
+ "default": "now()"
52
+ },
53
+ "updated_at": {
54
+ "name": "updated_at",
55
+ "type": "timestamp",
56
+ "primaryKey": false,
57
+ "notNull": true,
58
+ "default": "now()"
59
+ }
60
+ },
61
+ "indexes": {},
62
+ "foreignKeys": {},
63
+ "compositePrimaryKeys": {},
64
+ "uniqueConstraints": {},
65
+ "policies": {},
66
+ "checkConstraints": {},
67
+ "isRLSEnabled": false
68
+ }
69
+ },
70
+ "enums": {},
71
+ "schemas": {},
72
+ "sequences": {},
73
+ "roles": {},
74
+ "policies": {},
75
+ "views": {},
76
+ "_meta": {
77
+ "columns": {},
78
+ "schemas": {},
79
+ "tables": {}
80
+ }
81
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "postgresql",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "7",
8
+ "when": 1766092790394,
9
+ "tag": "0000_lucky_harpoon",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,4 @@
1
+ export { type StoreBackend } from "./server.js";
2
+ export { type MessageStoreBackendParams } from "./server.js";
3
+ export { AiMessageStoreBackend } from "./server.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export {} from "./server.js";
2
+ export {} from "./server.js";
3
+ export { AiMessageStoreBackend } from "./server.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,aAAa,CAAC;AAChD,OAAO,EAAkC,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA"}
package/dist/s.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { type CorsOptions } from "cors";
2
+ export interface StoreBackend {
3
+ migrate: () => void;
4
+ listen: () => void;
5
+ }
6
+ export type MessageStoreBackendParams = {
7
+ dbUrl: string;
8
+ port: number;
9
+ corsOpts?: CorsOptions;
10
+ };
11
+ export declare class AiMessageStoreBackend implements StoreBackend {
12
+ #private;
13
+ constructor(params: MessageStoreBackendParams);
14
+ migrate(): Promise<void>;
15
+ listen(): void;
16
+ }
17
+ //# sourceMappingURL=s.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,MAAM,CAAC;AAOxC,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,yBAAyB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF,qBAAa,qBAAsB,YAAW,YAAY;;gBAI1C,MAAM,EAAE,yBAAyB;IAavC,OAAO;IAIb,MAAM;CAIT"}
package/dist/s.js ADDED
@@ -0,0 +1,36 @@
1
+ import express, {} from "express";
2
+ import {} from "cors";
3
+ import { drizzle, NodePgDatabase } from "drizzle-orm/node-postgres";
4
+ import { migrate } from 'drizzle-orm/node-postgres/migrator';
5
+ import cors from "cors";
6
+ import helmet from "helmet";
7
+ import morgan from "morgan";
8
+ ;
9
+ export class AiMessageStoreBackend {
10
+ #db;
11
+ #app;
12
+ #port;
13
+ constructor(params) {
14
+ this.#db = drizzle(params.dbUrl);
15
+ this.#app = express();
16
+ if (params.corsOpts) {
17
+ this.#app.use(cors(params.corsOpts));
18
+ }
19
+ else {
20
+ this.#app.use(cors());
21
+ }
22
+ this.#app.use(helmet());
23
+ this.#app.use(morgan("combined"));
24
+ this.#app.use(express.json());
25
+ this.#port = params.port;
26
+ }
27
+ async migrate() {
28
+ await migrate(this.#db, { migrationsFolder: './dist/drizzle' });
29
+ return;
30
+ }
31
+ listen() {
32
+ this.#app.listen(this.#port);
33
+ return;
34
+ }
35
+ }
36
+ //# sourceMappingURL=s.js.map
package/dist/s.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s.js","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAgB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAoB,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAK3B,CAAC;AAQF,MAAM,OAAO,qBAAqB;IAC9B,GAAG,CAAwC;IAC3C,IAAI,CAAU;IACd,KAAK,CAAS;IACd,YAAY,MAAiC;QACzC,IAAI,CAAC,GAAG,GAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAC,OAAO,EAAE,CAAC;QACpB,IAAG,MAAM,CAAC,QAAQ,EAAC,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,KAAK,CAAC,OAAO;QACT,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,CAAC,CAAC;QAC9D,OAAO;IACX,CAAC;IACD,MAAM;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO;IACX,CAAC;CACJ"}
@@ -0,0 +1,112 @@
1
+ export declare const messages: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "messages";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: "id";
7
+ tableName: "messages";
8
+ dataType: "number";
9
+ columnType: "PgBigInt53";
10
+ data: number;
11
+ driverParam: string | number;
12
+ notNull: true;
13
+ hasDefault: true;
14
+ isPrimaryKey: true;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: undefined;
18
+ baseColumn: never;
19
+ identity: "always";
20
+ generated: undefined;
21
+ }, {}, {}>;
22
+ user_id: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "user_id";
24
+ tableName: "messages";
25
+ dataType: "string";
26
+ columnType: "PgVarchar";
27
+ data: string;
28
+ driverParam: string;
29
+ notNull: true;
30
+ hasDefault: false;
31
+ isPrimaryKey: false;
32
+ isAutoincrement: false;
33
+ hasRuntimeDefault: false;
34
+ enumValues: [string, ...string[]];
35
+ baseColumn: never;
36
+ identity: undefined;
37
+ generated: undefined;
38
+ }, {}, {
39
+ length: 255;
40
+ }>;
41
+ message: import("drizzle-orm/pg-core").PgColumn<{
42
+ name: "message";
43
+ tableName: "messages";
44
+ dataType: "string";
45
+ columnType: "PgText";
46
+ data: string;
47
+ driverParam: string;
48
+ notNull: true;
49
+ hasDefault: false;
50
+ isPrimaryKey: false;
51
+ isAutoincrement: false;
52
+ hasRuntimeDefault: false;
53
+ enumValues: [string, ...string[]];
54
+ baseColumn: never;
55
+ identity: undefined;
56
+ generated: undefined;
57
+ }, {}, {}>;
58
+ queued: import("drizzle-orm/pg-core").PgColumn<{
59
+ name: "queued";
60
+ tableName: "messages";
61
+ dataType: "boolean";
62
+ columnType: "PgBoolean";
63
+ data: boolean;
64
+ driverParam: boolean;
65
+ notNull: true;
66
+ hasDefault: false;
67
+ isPrimaryKey: false;
68
+ isAutoincrement: false;
69
+ hasRuntimeDefault: false;
70
+ enumValues: undefined;
71
+ baseColumn: never;
72
+ identity: undefined;
73
+ generated: undefined;
74
+ }, {}, {}>;
75
+ created_at: import("drizzle-orm/pg-core").PgColumn<{
76
+ name: "created_at";
77
+ tableName: "messages";
78
+ dataType: "date";
79
+ columnType: "PgTimestamp";
80
+ data: Date;
81
+ driverParam: string;
82
+ notNull: true;
83
+ hasDefault: true;
84
+ isPrimaryKey: false;
85
+ isAutoincrement: false;
86
+ hasRuntimeDefault: false;
87
+ enumValues: undefined;
88
+ baseColumn: never;
89
+ identity: undefined;
90
+ generated: undefined;
91
+ }, {}, {}>;
92
+ updated_at: import("drizzle-orm/pg-core").PgColumn<{
93
+ name: "updated_at";
94
+ tableName: "messages";
95
+ dataType: "date";
96
+ columnType: "PgTimestamp";
97
+ data: Date;
98
+ driverParam: string;
99
+ notNull: true;
100
+ hasDefault: true;
101
+ isPrimaryKey: false;
102
+ isAutoincrement: false;
103
+ hasRuntimeDefault: false;
104
+ enumValues: undefined;
105
+ baseColumn: never;
106
+ identity: undefined;
107
+ generated: undefined;
108
+ }, {}, {}>;
109
+ };
110
+ dialect: "pg";
111
+ }>;
112
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnB,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,10 @@
1
+ import { boolean, bigint, timestamp, text, pgTable, varchar } from "drizzle-orm/pg-core";
2
+ export const messages = pgTable("messages", {
3
+ id: bigint({ mode: 'number' }).primaryKey().generatedAlwaysAsIdentity(),
4
+ user_id: varchar({ length: 255 }).notNull(),
5
+ message: text().notNull(),
6
+ queued: boolean().notNull(),
7
+ created_at: timestamp('created_at').notNull().defaultNow(),
8
+ updated_at: timestamp('updated_at').notNull().defaultNow()
9
+ });
10
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE;IAC1C,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,yBAAyB,EAAE;IACvE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;IACzB,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE;IAC3B,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IAC1D,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAC3D,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type CorsOptions } from "cors";
2
+ export interface StoreBackend {
3
+ migrate: () => void;
4
+ listen: () => void;
5
+ }
6
+ export type MessageStoreBackendParams = {
7
+ dbUrl: string;
8
+ port: number;
9
+ corsOpts?: CorsOptions;
10
+ };
11
+ export declare class AiMessageStoreBackend implements StoreBackend {
12
+ #private;
13
+ constructor(params: MessageStoreBackendParams);
14
+ migrate(): Promise<void>;
15
+ listen(): void;
16
+ }
17
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,MAAM,CAAC;AASxC,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,yBAAyB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF,qBAAa,qBAAsB,YAAW,YAAY;;gBAI1C,MAAM,EAAE,yBAAyB;IAuFvC,OAAO;IAIb,MAAM;CAIT"}
package/dist/server.js ADDED
@@ -0,0 +1,93 @@
1
+ import express, {} from "express";
2
+ import {} from "cors";
3
+ import { drizzle, NodePgDatabase } from "drizzle-orm/node-postgres";
4
+ import { messages } from './schema.js';
5
+ import { migrate } from 'drizzle-orm/node-postgres/migrator';
6
+ import cors from "cors";
7
+ import helmet from "helmet";
8
+ import morgan from "morgan";
9
+ import { and, asc, eq, sql } from "drizzle-orm";
10
+ ;
11
+ export class AiMessageStoreBackend {
12
+ #db;
13
+ #app;
14
+ #port;
15
+ constructor(params) {
16
+ this.#db = drizzle(params.dbUrl);
17
+ this.#app = express();
18
+ if (params.corsOpts) {
19
+ this.#app.use(cors(params.corsOpts));
20
+ }
21
+ else {
22
+ this.#app.use(cors());
23
+ }
24
+ this.#app.use(helmet());
25
+ this.#app.use(morgan("combined"));
26
+ this.#app.use(express.json());
27
+ this.#port = params.port;
28
+ this.#app.post("/messages", async (req, res) => {
29
+ try {
30
+ const { user_id, queued, msgs } = req.body;
31
+ const response = await this.#db
32
+ .insert(messages)
33
+ .values(msgs.map((msg) => ({
34
+ user_id,
35
+ queued,
36
+ message: msg
37
+ })))
38
+ .returning({ message: messages.message });
39
+ res.json(response.map(item => item.message));
40
+ }
41
+ catch (err) {
42
+ res.status(500).json({ error: String(err) });
43
+ }
44
+ });
45
+ this.#app.get("/messages/:user_id", async (req, res) => {
46
+ try {
47
+ const response = await this.#db
48
+ .select({ message: messages.message })
49
+ .from(messages)
50
+ .where(eq(messages.user_id, req.params.user_id))
51
+ .orderBy(asc(messages.updated_at), asc(messages.id));
52
+ res.json(response.map(item => item.message));
53
+ }
54
+ catch (err) {
55
+ res.status(500).json({ error: String(err) });
56
+ }
57
+ });
58
+ this.#app.get("/messages/:user_id/queued", async (req, res) => {
59
+ try {
60
+ const response = await this.#db
61
+ .select({ message: messages.message })
62
+ .from(messages)
63
+ .where(and(eq(messages.queued, true), eq(messages.user_id, req.params.user_id)));
64
+ res.json(response.map(item => item.message));
65
+ }
66
+ catch (err) {
67
+ res.status(500).json({ error: String(err) });
68
+ }
69
+ });
70
+ this.#app.put("/messages/:user_id/unqueue", async (req, res) => {
71
+ try {
72
+ const response = await this.#db
73
+ .update(messages)
74
+ .set({ queued: false, updated_at: sql `now()` })
75
+ .where(eq(messages.user_id, req.params.user_id))
76
+ .returning({ message: messages.message });
77
+ res.json(response.map(item => item.message));
78
+ }
79
+ catch (err) {
80
+ res.status(500).json({ error: String(err) });
81
+ }
82
+ });
83
+ }
84
+ async migrate() {
85
+ await migrate(this.#db, { migrationsFolder: './dist/drizzle' });
86
+ return;
87
+ }
88
+ listen() {
89
+ this.#app.listen(this.#port);
90
+ return;
91
+ }
92
+ }
93
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import 'dotenv/config';
2
+ import { defineConfig } from 'drizzle-kit';
3
+
4
+ export default defineConfig({
5
+ out: './dist/drizzle',
6
+ schema: './src/schema.ts',
7
+ dialect: 'postgresql',
8
+ dbCredentials: {
9
+ url: process.env.DATABASE_URL!,
10
+ },
11
+ });
package/install.sh ADDED
@@ -0,0 +1,25 @@
1
+ #!/bin/bash
2
+
3
+ ## Install postgresql
4
+
5
+ if grep -e 'DATABASE_URL=' ./.env ; then
6
+ exit
7
+ fi
8
+
9
+ sudo apt install -y postgresql postgresql-contrib
10
+
11
+ read -p "Postgres username: " PGUSER
12
+ read -s -p "Postgres password: " PASS
13
+ echo
14
+ read -p "Database name: " DB
15
+
16
+ sudo -u postgres psql <<EOF
17
+ CREATE DATABASE $DB;
18
+ CREATE USER $PGUSER WITH PASSWORD '$PASS';
19
+ GRANT ALL PRIVILEGES ON DATABASE $DB TO $PGUSER;
20
+ \c $DB
21
+ GRANT ALL ON SCHEMA public TO $PGUSER;
22
+ EOF
23
+
24
+ echo "DATABASE_URL=postgres://$PGUSER:$PASS@localhost/$DB" >> .env
25
+ echo "✅ Database, user, and .env file created. Edit .env if needed."
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@voscarmv/aimessagestore",
3
+ "version": "1.0.3",
4
+ "description": "Message storage and retrieval for aichatbot framework ",
5
+ "keywords": [
6
+ "ai",
7
+ "api",
8
+ "database",
9
+ "drizzle",
10
+ "chatbot",
11
+ "message",
12
+ "storage",
13
+ "store",
14
+ "queue",
15
+ "concurrent",
16
+ "im",
17
+ "telegram",
18
+ "whatsapp",
19
+ "signal"
20
+ ],
21
+ "homepage": "https://github.com/voscarmv/aimessagestore#readme",
22
+ "bugs": {
23
+ "url": "https://github.com/voscarmv/aimessagestore/issues"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/voscarmv/aimessagestore.git"
28
+ },
29
+ "license": "GPL-3.0-or-later",
30
+ "author": "Oscar Mier",
31
+ "type": "module",
32
+ "main": "dist/index.js",
33
+ "scripts": {
34
+ "test": "echo \"Error: no test specified\" && exit 1",
35
+ "dev": "ts-node src/index.ts",
36
+ "build": "npx tsc --build",
37
+ "db:generate": "npx drizzle-kit generate",
38
+ "db:migrate": "npx drizzle-kit migrate"
39
+ },
40
+ "dependencies": {
41
+ "cors": "^2.8.5",
42
+ "dotenv": "^17.2.3",
43
+ "drizzle-orm": "^0.45.1",
44
+ "express": "^5.2.1",
45
+ "gitignore": "^0.7.0",
46
+ "helmet": "^8.1.0",
47
+ "morgan": "^1.10.1",
48
+ "pg": "^8.16.3"
49
+ },
50
+ "devDependencies": {
51
+ "@types/cors": "^2.8.19",
52
+ "@types/express": "^5.0.6",
53
+ "@types/morgan": "^1.9.10",
54
+ "@types/node": "^25.0.3",
55
+ "@types/pg": "^8.16.0",
56
+ "drizzle-kit": "^0.31.8",
57
+ "typescript": "^5.9.3"
58
+ }
59
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { type StoreBackend } from "./server.js";
2
+ export { type MessageStoreBackendParams } from "./server.js";
3
+ export { AiMessageStoreBackend } from "./server.js"