From 2c10bf7055502a040ed928c38232336f6d23fdb0 Mon Sep 17 00:00:00 2001 From: recoilme Date: Thu, 1 Dec 2022 16:50:32 +0300 Subject: [PATCH] frontpage and migrate --- main.go | 8 +- migrations/1669001630_sheme.go | 39 +- pb_schema.json | 1010 ++++++++++++++++++----------- web_data/css/frontpage.css | 21 - web_data/js/auth.js | 47 -- web_data/js/frontpage.js | 14 - web_data/js/pocketbase.es.mjs | 2 - web_data/js/pocketbase.es.mjs.map | 1 - web_data/view/frontpage.html | 233 +++++-- web_data/view/top.html | 2 - 10 files changed, 828 insertions(+), 549 deletions(-) delete mode 100644 web_data/css/frontpage.css delete mode 100644 web_data/js/auth.js delete mode 100644 web_data/js/frontpage.js delete mode 100644 web_data/js/pocketbase.es.mjs delete mode 100644 web_data/js/pocketbase.es.mjs.map diff --git a/main.go b/main.go index 1f6a57e..9fdc3d5 100644 --- a/main.go +++ b/main.go @@ -77,11 +77,13 @@ func main() { result, err := vsd.AllPosts(app, userId, c.QueryParam("page")) if err != nil { - c.Set("err", err.Error()) + log.Println("main", err.Error()) + c.Set("err", " ") + c.Set("pagination", pagination.New(0, 0, 0)) + } else { + c.Set("pagination", pagination.New(result.TotalItems, result.PerPage, result.Page)) } - c.Set("pagination", pagination.New(result.TotalItems, result.PerPage, result.Page)) c.Set("posts", toJson(result)["items"]) - //c.Set("err", "In development") return c.Render(http.StatusOK, "main.html", siteData(c)) }, Middlewares: []echo.MiddlewareFunc{ diff --git a/migrations/1669001630_sheme.go b/migrations/1669001630_sheme.go index f92bb7f..e7939d9 100644 --- a/migrations/1669001630_sheme.go +++ b/migrations/1669001630_sheme.go @@ -21,39 +21,36 @@ func init() { ` delete from '_collections'; - CREATE TABLE 'domain' ('created' TEXT DEFAULT '' NOT NULL, 'descr' TEXT DEFAULT '', 'hostname' TEXT DEFAULT '', 'icon' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'lang' TEXT DEFAULT '', 'title' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL, 'url' TEXT DEFAULT '', "params" TEXT DEFAULT ''); + CREATE TABLE IF NOT EXISTS 'domain' ('created' TEXT DEFAULT '' NOT NULL, 'descr' TEXT DEFAULT '', 'hostname' TEXT DEFAULT '', 'icon' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'lang' TEXT DEFAULT '', 'title' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL, 'url' TEXT DEFAULT '', "params" TEXT DEFAULT ''); + CREATE TABLE IF NOT EXISTS 'feed' ('created' TEXT DEFAULT '' NOT NULL, 'descr' TEXT DEFAULT '', 'domain_id' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'last_error' TEXT DEFAULT '', 'last_fetch' TEXT DEFAULT '', 'resp_code' REAL DEFAULT 0, 'title' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL, 'url' TEXT DEFAULT '', "lang" TEXT DEFAULT '', "icon" TEXT DEFAULT '', "pub_date" TEXT DEFAULT '', "params" TEXT DEFAULT ''); + CREATE TABLE IF NOT EXISTS 'post' ('created' TEXT DEFAULT '' NOT NULL, 'descr' TEXT DEFAULT '', 'feed_id' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'img' TEXT DEFAULT '', 'pub_date' TEXT DEFAULT '', 'sum_html' TEXT DEFAULT '', 'sum_txt' TEXT DEFAULT '', 'title' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL, 'url' TEXT DEFAULT '', "author" TEXT DEFAULT '', "category" TEXT DEFAULT '', "guid" TEXT DEFAULT '', "params" TEXT DEFAULT ''); + CREATE TABLE IF NOT EXISTS 'usr_feed' ('created' TEXT DEFAULT '' NOT NULL, 'feed_id' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'updated' TEXT DEFAULT '' NOT NULL, 'user_id' TEXT DEFAULT '', "order" REAL DEFAULT 0, "params" TEXT DEFAULT ''); + CREATE TABLE IF NOT EXISTS 'keyword' ('created' TEXT DEFAULT '' NOT NULL, 'id' TEXT PRIMARY KEY, 'idf' REAL DEFAULT 0, 'type' REAL DEFAULT 0, 'updated' TEXT DEFAULT '' NOT NULL, "keyword" TEXT DEFAULT ''); + CREATE TABLE IF NOT EXISTS 'post_keyword' ('created' TEXT DEFAULT '' NOT NULL, 'id' TEXT PRIMARY KEY, 'keyword_id' TEXT DEFAULT '', 'post_id' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL); + CREATE INDEX '_domain_created_idx' ON 'domain' ('created'); - CREATE TABLE 'feed' ('created' TEXT DEFAULT '' NOT NULL, 'descr' TEXT DEFAULT '', 'domain_id' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'last_error' TEXT DEFAULT '', 'last_fetch' TEXT DEFAULT '', 'resp_code' REAL DEFAULT 0, 'title' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL, 'url' TEXT DEFAULT '', "lang" TEXT DEFAULT '', "icon" TEXT DEFAULT '', "pub_date" TEXT DEFAULT '', "params" TEXT DEFAULT ''); CREATE INDEX '_feed_created_idx' ON 'feed' ('created'); CREATE INDEX 'feed_last_fetch_idx' ON 'feed' ('last_fetch'); - CREATE TABLE 'post' ('created' TEXT DEFAULT '' NOT NULL, 'descr' TEXT DEFAULT '', 'feed_id' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'img' TEXT DEFAULT '', 'pub_date' TEXT DEFAULT '', 'sum_html' TEXT DEFAULT '', 'sum_txt' TEXT DEFAULT '', 'title' TEXT DEFAULT '', 'updated' TEXT DEFAULT '' NOT NULL, 'url' TEXT DEFAULT '', "author" TEXT DEFAULT '', "category" TEXT DEFAULT '', "guid" TEXT DEFAULT '', "params" TEXT DEFAULT ''); CREATE INDEX '_post_created_idx' ON 'post' ('created'); CREATE INDEX '_post_guid_idx' ON 'post' ('guid'); - CREATE TABLE 'usr_feed' ('created' TEXT DEFAULT '' NOT NULL, 'feed_id' TEXT DEFAULT '', 'id' TEXT PRIMARY KEY, 'updated' TEXT DEFAULT '' NOT NULL, 'user_id' TEXT DEFAULT '', "order" REAL DEFAULT 0, "params" TEXT DEFAULT ''); CREATE UNIQUE INDEX _usr_feed_idx on 'usr_feed' ('feed_id', 'user_id'); CREATE INDEX '_usr_feed_created_idx' ON 'usr_feed' ('created'); + CREATE INDEX '_keyword_created_idx' ON 'keyword' ('created'); + CREATE UNIQUE INDEX _post_keyword_idx on 'post_keyword' ('keyword_id', 'post_id'); + CREATE INDEX '_post_keyword_created_idx' ON 'post_keyword' ('created'); - INSERT INTO _collections VALUES('51lodztkxakfboh',0,'base','domain','[{"system":false,"id":"hb9kuxjn","name":"url","type":"url","required":false,"unique":true,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"n4cx64x1","name":"title","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"bbbxair0","name":"descr","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"7uzxmyv7","name":"icon","type":"url","required":false,"unique":false,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"oippqcym","name":"lang","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"e7lz2se0","name":"hostname","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"dk6oftta","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]','','',NULL,NULL,NULL,'{}','2022-11-10 15:02:01.864Z','2022-11-25 10:01:16.958Z'); - INSERT INTO _collections VALUES('to82imph7oc7bqi',0,'base','feed','[{"system":false,"id":"bvk26iyf","name":"domain_id","type":"relation","required":true,"unique":false,"options":{"maxSelect":1,"collectionId":"51lodztkxakfboh","cascadeDelete":true}},{"system":false,"id":"l98bchxu","name":"url","type":"url","required":false,"unique":true,"options":{"exceptDomains":[],"onlyDomains":[]}},{"system":false,"id":"ohf4fngr","name":"title","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"kpbnpjgx","name":"descr","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"iduiheeu","name":"last_fetch","type":"date","required":false,"unique":false,"options":{"min":"","max":""}},{"system":false,"id":"y55wbwgm","name":"last_error","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"lknrpo8c","name":"resp_code","type":"number","required":false,"unique":false,"options":{"min":null,"max":null}},{"system":false,"id":"tadncnp2","name":"lang","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"k6rcrjgz","name":"icon","type":"url","required":false,"unique":false,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"e20t0mjs","name":"pub_date","type":"date","required":false,"unique":false,"options":{"min":"","max":""}},{"system":false,"id":"htyilgou","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]','','',NULL,NULL,NULL,'{}','2022-11-10 15:02:01.864Z','2022-11-25 09:43:02.502Z'); - INSERT INTO _collections VALUES('d6mbq3heomws7j8',0,'base','post','[{"system":false,"id":"kyz9t78c","name":"feed_id","type":"relation","required":true,"unique":false,"options":{"maxSelect":1,"collectionId":"to82imph7oc7bqi","cascadeDelete":true}},{"system":false,"id":"6n8vvbod","name":"url","type":"url","required":false,"unique":true,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"jcdaujko","name":"title","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"6odm08le","name":"descr","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"30qjjfju","name":"img","type":"url","required":false,"unique":false,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"9hpiahga","name":"sum_html","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"ylir5uwu","name":"sum_txt","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"btktqs4t","name":"pub_date","type":"date","required":false,"unique":false,"options":{"min":"","max":""}},{"system":false,"id":"nipxtyc8","name":"author","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"1vlz8zoc","name":"category","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"cryi40a8","name":"guid","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"lom5cvz5","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]',NULL,NULL,NULL,NULL,NULL,'{}','2022-11-10 15:02:01.865Z','2022-11-25 10:01:01.027Z'); - INSERT INTO _collections VALUES('hgdnbtp4stpg8j2',0,'base','usr_feed','[{"system":false,"id":"lqqklaff","name":"user_id","type":"relation","required":false,"unique":false,"options":{"maxSelect":1,"collectionId":"users","cascadeDelete":true}},{"system":false,"id":"rldjtobp","name":"feed_id","type":"relation","required":false,"unique":false,"options":{"maxSelect":1,"collectionId":"to82imph7oc7bqi","cascadeDelete":true}},{"system":false,"id":"yrvn9qbu","name":"order","type":"number","required":false,"unique":false,"options":{"min":null,"max":null}},{"system":false,"id":"5huytven","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]','',NULL,'',NULL,NULL,'{}','2022-11-10 15:02:01.866Z','2022-11-25 10:02:44.423Z'); + INSERT INTO _collections VALUES('51lodztkxakfboh',0,'base','domain','[{"system":false,"id":"hb9kuxjn","name":"url","type":"url","required":false,"unique":true,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"n4cx64x1","name":"title","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"bbbxair0","name":"descr","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"7uzxmyv7","name":"icon","type":"url","required":false,"unique":false,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"oippqcym","name":"lang","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"e7lz2se0","name":"hostname","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"dk6oftta","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]',NULL,'',NULL,NULL,NULL,'{}','2022-11-10 15:02:01.864Z','2022-12-01 13:35:14.471Z'); + INSERT INTO _collections VALUES('to82imph7oc7bqi',0,'base','feed','[{"system":false,"id":"bvk26iyf","name":"domain_id","type":"relation","required":true,"unique":false,"options":{"maxSelect":1,"collectionId":"51lodztkxakfboh","cascadeDelete":true}},{"system":false,"id":"l98bchxu","name":"url","type":"url","required":false,"unique":true,"options":{"exceptDomains":[],"onlyDomains":[]}},{"system":false,"id":"ohf4fngr","name":"title","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"kpbnpjgx","name":"descr","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"iduiheeu","name":"last_fetch","type":"date","required":false,"unique":false,"options":{"min":"","max":""}},{"system":false,"id":"y55wbwgm","name":"last_error","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"lknrpo8c","name":"resp_code","type":"number","required":false,"unique":false,"options":{"min":null,"max":null}},{"system":false,"id":"tadncnp2","name":"lang","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"k6rcrjgz","name":"icon","type":"url","required":false,"unique":false,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"e20t0mjs","name":"pub_date","type":"date","required":false,"unique":false,"options":{"min":"","max":""}},{"system":false,"id":"htyilgou","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]',NULL,'',NULL,NULL,NULL,'{}','2022-11-10 15:02:01.864Z','2022-12-01 13:34:39.077Z'); + INSERT INTO _collections VALUES('d6mbq3heomws7j8',0,'base','post','[{"system":false,"id":"kyz9t78c","name":"feed_id","type":"relation","required":true,"unique":false,"options":{"maxSelect":1,"collectionId":"to82imph7oc7bqi","cascadeDelete":true}},{"system":false,"id":"6n8vvbod","name":"url","type":"url","required":false,"unique":true,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"jcdaujko","name":"title","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"6odm08le","name":"descr","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"30qjjfju","name":"img","type":"url","required":false,"unique":false,"options":{"exceptDomains":null,"onlyDomains":null}},{"system":false,"id":"9hpiahga","name":"sum_html","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"ylir5uwu","name":"sum_txt","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"btktqs4t","name":"pub_date","type":"date","required":false,"unique":false,"options":{"min":"","max":""}},{"system":false,"id":"nipxtyc8","name":"author","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"1vlz8zoc","name":"category","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"cryi40a8","name":"guid","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"lom5cvz5","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]',NULL,'',NULL,NULL,NULL,'{}','2022-11-10 15:02:01.865Z','2022-12-01 13:43:24.227Z'); + INSERT INTO _collections VALUES('hgdnbtp4stpg8j2',0,'base','usr_feed','[{"system":false,"id":"lqqklaff","name":"user_id","type":"relation","required":false,"unique":false,"options":{"maxSelect":1,"collectionId":"users","cascadeDelete":true}},{"system":false,"id":"rldjtobp","name":"feed_id","type":"relation","required":false,"unique":false,"options":{"maxSelect":1,"collectionId":"to82imph7oc7bqi","cascadeDelete":true}},{"system":false,"id":"yrvn9qbu","name":"order","type":"number","required":false,"unique":false,"options":{"min":null,"max":null}},{"system":false,"id":"5huytven","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]',NULL,'','',NULL,NULL,'{}','2022-11-10 15:02:01.866Z','2022-12-01 13:43:36.988Z'); INSERT INTO _collections VALUES('2ykc8bz1hznpsdg',0,'auth','users','[{"system":false,"id":"adcw8cbp","name":"photo_url","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"becpywvb","name":"params","type":"text","required":false,"unique":false,"options":{"min":null,"max":null,"pattern":""}}]',NULL,NULL,NULL,NULL,NULL,'{"allowEmailAuth":true,"allowOAuth2Auth":true,"allowUsernameAuth":true,"exceptEmailDomains":null,"manageRule":null,"minPasswordLength":8,"onlyEmailDomains":null,"requireEmail":false}','2022-11-10 17:41:28.045Z','2022-11-25 10:03:15.803Z'); - + INSERT INTO _collections VALUES('ue9kdud987b9z5z',0,'base','keyword','[{"system":false,"id":"unk2ooie","name":"keyword","type":"text","required":false,"unique":true,"options":{"min":null,"max":null,"pattern":""}},{"system":false,"id":"5nq8v2gx","name":"type","type":"number","required":false,"unique":false,"options":{"min":null,"max":null}},{"system":false,"id":"7lwvnwyn","name":"idf","type":"number","required":false,"unique":false,"options":{"min":null,"max":null}}]',NULL,'',NULL,NULL,NULL,'{}','2022-11-27 09:20:48.277Z','2022-12-01 13:44:05.880Z'); + INSERT INTO _collections VALUES('dz3w892eyxmv9th',0,'base','post_keyword','[{"system":false,"id":"znlhv1g7","name":"post_id","type":"relation","required":false,"unique":false,"options":{"maxSelect":1,"collectionId":"d6mbq3heomws7j8","cascadeDelete":true}},{"system":false,"id":"ad808gc8","name":"keyword_id","type":"relation","required":false,"unique":false,"options":{"maxSelect":1,"collectionId":"ue9kdud987b9z5z","cascadeDelete":true}}]','','','','','','{}','2022-11-29 10:22:46.480Z','2022-12-01 13:44:31.318Z'); + `) res, errMigrate := migrateQuery.Execute() - /* - //, 'lang' TEXT DEFAULT '', 'icon' TEXT DEFAULT '','pub_date' TEXT DEFAULT '', 'params' TEXT DEFAULT ''); - if _, err := db.AddColumn("feed", "icon", `TEXT`).Execute(); err != nil { - return err - } - if _, err := db.AddColumn("feed", "lang", `TEXT`).Execute(); err != nil { - return err - } - if _, err := db.AddColumn("feed", "pub_date", `TEXT`).Execute(); err != nil { - return err - } - */ + fmt.Println("migrate", res, errMigrate) return errMigrate }, func(db dbx.Builder) error { diff --git a/pb_schema.json b/pb_schema.json index bde608c..f3d2063 100644 --- a/pb_schema.json +++ b/pb_schema.json @@ -1,385 +1,629 @@ [ - { - "id": "51lodztkxakfboh", - "name": "domain", - "type": "base", - "system": false, - "schema": [ - { - "id": "hb9kuxjn", - "name": "url", - "type": "url", - "system": false, - "required": false, - "unique": true, - "options": { - "exceptDomains": null, - "onlyDomains": null - } - }, - { - "id": "n4cx64x1", - "name": "title", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "bbbxair0", - "name": "descr", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "7uzxmyv7", - "name": "icon", - "type": "url", - "system": false, - "required": false, - "unique": false, - "options": { - "exceptDomains": null, - "onlyDomains": null - } - }, - { - "id": "oippqcym", - "name": "lang", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "e7lz2se0", - "name": "hostname", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - } - ], - "listRule": "", - "viewRule": "", - "createRule": null, - "updateRule": null, - "deleteRule": null, - "options": {} - }, - { - "id": "to82imph7oc7bqi", - "name": "feed", - "type": "base", - "system": false, - "schema": [ - { - "id": "bvk26iyf", - "name": "domain_id", - "type": "relation", - "system": false, - "required": true, - "unique": false, - "options": { - "maxSelect": 1, - "collectionId": "51lodztkxakfboh", - "cascadeDelete": true - } - }, - { - "id": "l98bchxu", - "name": "url", - "type": "url", - "system": false, - "required": false, - "unique": true, - "options": { - "exceptDomains": [], - "onlyDomains": [] - } - }, - { - "id": "ohf4fngr", - "name": "title", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "kpbnpjgx", - "name": "descr", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "iduiheeu", - "name": "last_fetch", - "type": "date", - "system": false, - "required": false, - "unique": false, - "options": { - "min": "", - "max": "" - } - }, - { - "id": "y55wbwgm", - "name": "last_error", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "lknrpo8c", - "name": "resp_code", - "type": "number", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null - } - } - ], - "listRule": "", - "viewRule": "", - "createRule": null, - "updateRule": null, - "deleteRule": null, - "options": {} - }, - { - "id": "d6mbq3heomws7j8", - "name": "post", - "type": "base", - "system": false, - "schema": [ - { - "id": "kyz9t78c", - "name": "feed_id", - "type": "relation", - "system": false, - "required": true, - "unique": false, - "options": { - "maxSelect": 1, - "collectionId": "to82imph7oc7bqi", - "cascadeDelete": true - } - }, - { - "id": "6n8vvbod", - "name": "url", - "type": "url", - "system": false, - "required": false, - "unique": true, - "options": { - "exceptDomains": null, - "onlyDomains": null - } - }, - { - "id": "jcdaujko", - "name": "title", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "6odm08le", - "name": "descr", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "30qjjfju", - "name": "img", - "type": "url", - "system": false, - "required": false, - "unique": false, - "options": { - "exceptDomains": null, - "onlyDomains": null - } - }, - { - "id": "9hpiahga", - "name": "sum_html", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "ylir5uwu", - "name": "sum_txt", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - }, - { - "id": "btktqs4t", - "name": "pub_date", - "type": "date", - "system": false, - "required": false, - "unique": false, - "options": { - "min": "", - "max": "" - } - } - ], - "listRule": null, - "viewRule": null, - "createRule": null, - "updateRule": null, - "deleteRule": null, - "options": {} - }, - { - "id": "2ykc8bz1hznpsdg", - "name": "users", - "type": "auth", - "system": false, - "schema": [ - { - "id": "adcw8cbp", - "name": "photo_url", - "type": "text", - "system": false, - "required": false, - "unique": false, - "options": { - "min": null, - "max": null, - "pattern": "" - } - } - ], - "listRule": null, - "viewRule": null, - "createRule": null, - "updateRule": null, - "deleteRule": null, - "options": { - "allowEmailAuth": true, - "allowOAuth2Auth": true, - "allowUsernameAuth": true, - "exceptEmailDomains": null, - "manageRule": null, - "minPasswordLength": 8, - "onlyEmailDomains": null, - "requireEmail": false - } - }, - { - "id": "hgdnbtp4stpg8j2", - "name": "usr_feed", - "type": "base", - "system": false, - "schema": [ - { - "id": "lqqklaff", - "name": "user_id", - "type": "relation", - "system": false, - "required": false, - "unique": false, - "options": { - "maxSelect": 1, - "collectionId": "2ykc8bz1hznpsdg", - "cascadeDelete": true - } - }, - { - "id": "rldjtobp", - "name": "feed_id", - "type": "relation", - "system": false, - "required": false, - "unique": false, - "options": { - "maxSelect": 1, - "collectionId": "to82imph7oc7bqi", - "cascadeDelete": true - } - } - ], - "listRule": "", - "viewRule": null, - "createRule": "", - "updateRule": null, - "deleteRule": null, - "options": {} - } + { + "id": "51lodztkxakfboh", + "name": "domain", + "type": "base", + "system": false, + "schema": [ + { + "id": "hb9kuxjn", + "name": "url", + "type": "url", + "system": false, + "required": false, + "unique": true, + "options": { + "exceptDomains": null, + "onlyDomains": null + } + }, + { + "id": "n4cx64x1", + "name": "title", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "bbbxair0", + "name": "descr", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "7uzxmyv7", + "name": "icon", + "type": "url", + "system": false, + "required": false, + "unique": false, + "options": { + "exceptDomains": null, + "onlyDomains": null + } + }, + { + "id": "oippqcym", + "name": "lang", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "e7lz2se0", + "name": "hostname", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "dk6oftta", + "name": "params", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + } + ], + "listRule": null, + "viewRule": "", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": {} + }, + { + "id": "to82imph7oc7bqi", + "name": "feed", + "type": "base", + "system": false, + "schema": [ + { + "id": "bvk26iyf", + "name": "domain_id", + "type": "relation", + "system": false, + "required": true, + "unique": false, + "options": { + "maxSelect": 1, + "collectionId": "51lodztkxakfboh", + "cascadeDelete": true + } + }, + { + "id": "l98bchxu", + "name": "url", + "type": "url", + "system": false, + "required": false, + "unique": true, + "options": { + "exceptDomains": [], + "onlyDomains": [] + } + }, + { + "id": "ohf4fngr", + "name": "title", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "kpbnpjgx", + "name": "descr", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "iduiheeu", + "name": "last_fetch", + "type": "date", + "system": false, + "required": false, + "unique": false, + "options": { + "min": "", + "max": "" + } + }, + { + "id": "y55wbwgm", + "name": "last_error", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "lknrpo8c", + "name": "resp_code", + "type": "number", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "id": "tadncnp2", + "name": "lang", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "k6rcrjgz", + "name": "icon", + "type": "url", + "system": false, + "required": false, + "unique": false, + "options": { + "exceptDomains": null, + "onlyDomains": null + } + }, + { + "id": "e20t0mjs", + "name": "pub_date", + "type": "date", + "system": false, + "required": false, + "unique": false, + "options": { + "min": "", + "max": "" + } + }, + { + "id": "htyilgou", + "name": "params", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + } + ], + "listRule": null, + "viewRule": "", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": {} + }, + { + "id": "d6mbq3heomws7j8", + "name": "post", + "type": "base", + "system": false, + "schema": [ + { + "id": "kyz9t78c", + "name": "feed_id", + "type": "relation", + "system": false, + "required": true, + "unique": false, + "options": { + "maxSelect": 1, + "collectionId": "to82imph7oc7bqi", + "cascadeDelete": true + } + }, + { + "id": "6n8vvbod", + "name": "url", + "type": "url", + "system": false, + "required": false, + "unique": true, + "options": { + "exceptDomains": null, + "onlyDomains": null + } + }, + { + "id": "jcdaujko", + "name": "title", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "6odm08le", + "name": "descr", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "30qjjfju", + "name": "img", + "type": "url", + "system": false, + "required": false, + "unique": false, + "options": { + "exceptDomains": null, + "onlyDomains": null + } + }, + { + "id": "9hpiahga", + "name": "sum_html", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "ylir5uwu", + "name": "sum_txt", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "btktqs4t", + "name": "pub_date", + "type": "date", + "system": false, + "required": false, + "unique": false, + "options": { + "min": "", + "max": "" + } + }, + { + "id": "nipxtyc8", + "name": "author", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "1vlz8zoc", + "name": "category", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "cryi40a8", + "name": "guid", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "lom5cvz5", + "name": "params", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + } + ], + "listRule": null, + "viewRule": "", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": {} + }, + { + "id": "hgdnbtp4stpg8j2", + "name": "usr_feed", + "type": "base", + "system": false, + "schema": [ + { + "id": "lqqklaff", + "name": "user_id", + "type": "relation", + "system": false, + "required": false, + "unique": false, + "options": { + "maxSelect": 1, + "collectionId": "users", + "cascadeDelete": true + } + }, + { + "id": "rldjtobp", + "name": "feed_id", + "type": "relation", + "system": false, + "required": false, + "unique": false, + "options": { + "maxSelect": 1, + "collectionId": "to82imph7oc7bqi", + "cascadeDelete": true + } + }, + { + "id": "yrvn9qbu", + "name": "order", + "type": "number", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "id": "5huytven", + "name": "params", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + } + ], + "listRule": null, + "viewRule": "", + "createRule": "", + "updateRule": null, + "deleteRule": null, + "options": {} + }, + { + "id": "2ykc8bz1hznpsdg", + "name": "users", + "type": "auth", + "system": false, + "schema": [ + { + "id": "adcw8cbp", + "name": "photo_url", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "becpywvb", + "name": "params", + "type": "text", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + } + ], + "listRule": null, + "viewRule": null, + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": { + "allowEmailAuth": true, + "allowOAuth2Auth": true, + "allowUsernameAuth": true, + "exceptEmailDomains": null, + "manageRule": null, + "minPasswordLength": 8, + "onlyEmailDomains": null, + "requireEmail": false + } + }, + { + "id": "ue9kdud987b9z5z", + "name": "keyword", + "type": "base", + "system": false, + "schema": [ + { + "id": "unk2ooie", + "name": "keyword", + "type": "text", + "system": false, + "required": false, + "unique": true, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "id": "5nq8v2gx", + "name": "type", + "type": "number", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "id": "7lwvnwyn", + "name": "idf", + "type": "number", + "system": false, + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + } + ], + "listRule": null, + "viewRule": "", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": {} + }, + { + "id": "dz3w892eyxmv9th", + "name": "post_keyword", + "type": "base", + "system": false, + "schema": [ + { + "id": "znlhv1g7", + "name": "post_id", + "type": "relation", + "system": false, + "required": false, + "unique": false, + "options": { + "maxSelect": 1, + "collectionId": "d6mbq3heomws7j8", + "cascadeDelete": true + } + }, + { + "id": "ad808gc8", + "name": "keyword_id", + "type": "relation", + "system": false, + "required": false, + "unique": false, + "options": { + "maxSelect": 1, + "collectionId": "ue9kdud987b9z5z", + "cascadeDelete": true + } + } + ], + "listRule": "", + "viewRule": "", + "createRule": "", + "updateRule": "", + "deleteRule": "", + "options": {} + } ] \ No newline at end of file diff --git a/web_data/css/frontpage.css b/web_data/css/frontpage.css deleted file mode 100644 index 8871162..0000000 --- a/web_data/css/frontpage.css +++ /dev/null @@ -1,21 +0,0 @@ -html,body { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - } - .hero.is-info { - background: linear-gradient( - rgba(19, 19, 232, 0.5), - rgba(23, 138, 232, 0.5) - ), url('https://tailwindcss.com/_next/static/media/docs@tinypng.61f4d3334a6d245fc2297517c87ae044.png') no-repeat center center fixed; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; - } - .hero .nav, .hero.is-success .nav { - -webkit-box-shadow: none; - box-shadow: none; - } - .hero .subtitle { - padding: 3rem 0; - line-height: 1.5; - } \ No newline at end of file diff --git a/web_data/js/auth.js b/web_data/js/auth.js deleted file mode 100644 index 2e6adc1..0000000 --- a/web_data/js/auth.js +++ /dev/null @@ -1,47 +0,0 @@ -function onTelegramAuth(user) { - console.log('New user:', user) - load(user) -} - -function bake_cookie(name, value) { - var cookie = [name, '=', JSON.stringify(value), '; domain=.', window.location.host.toString(), '; path=/;'].join(''); - document.cookie = cookie; -} - -async function load(tgUser) { - const client = new PocketBase('http://127.0.0.1:80'); - - errAuth = 0; - try { - const user = await client.users.create({ - 'email': tgUser.id +'@t.me', - 'password': '123456'+tgUser.username, - 'passwordConfirm': '123456'+tgUser.username, - }); - } catch (e) { - errAuth = 42; - /* - if (e.data.data.email.code=="validation_user_email_exists") { - errAuth = 42; - } else { - errAuth = 43; - }*/ - } - if (errAuth == 42 || errAuth == 0) { - // user authentication via email/pass - const userAuthData = await client.users.authViaEmail(tgUser.id +'@t.me', '123456'+tgUser.username); - console.log('userAuthData:', userAuthData) - - // set user profile data - const updatedProfile = await client.records.update('profiles', userAuthData.user.profile.id, { - 'name': tgUser.username, - 'photo_url': tgUser.photo_url, - }); - console.log('updatedProfile:', updatedProfile) - - bake_cookie("t",userAuthData.token) - - document.location.href="/" - } - -} \ No newline at end of file diff --git a/web_data/js/frontpage.js b/web_data/js/frontpage.js deleted file mode 100644 index 16de960..0000000 --- a/web_data/js/frontpage.js +++ /dev/null @@ -1,14 +0,0 @@ -// The following code is based off a toggle menu by @Bradcomp -// source: https://gist.github.com/Bradcomp/a9ef2ef322a8e8017443b626208999c1 -( - function() { - var burger = document.querySelector('.burger'); - var menu = document.querySelector('#'+burger.dataset.target); - burger.addEventListener('click', function() { - burger.classList.toggle('is-active'); - menu.classList.toggle('is-active'); - }); - } - - -)(); \ No newline at end of file diff --git a/web_data/js/pocketbase.es.mjs b/web_data/js/pocketbase.es.mjs deleted file mode 100644 index a9a66b1..0000000 --- a/web_data/js/pocketbase.es.mjs +++ /dev/null @@ -1,2 +0,0 @@ -var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};function e(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var n=function(){return n=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&o[o.length-1])||6!==r[0]&&2!==r[0])){s=0;continue}if(3===r[0]&&(!o||r[1]>o[0]&&r[1]0&&(!n.exp||n.exp-e>Date.now()/1e3))}(this.token)},enumerable:!1,configurable:!0}),t.prototype.save=function(t,e){this.baseToken=t||"",this.baseModel=null!==e&&"object"==typeof e?"undefined"!==(null==e?void 0:e.verified)?new f(e):new v(e):null,this.triggerChange()},t.prototype.clear=function(){this.baseToken="",this.baseModel=null,this.triggerChange()},t.prototype.loadFromCookie=function(t,e){void 0===e&&(e="pb_auth");var n=function(t,e){var n={};if("string"!=typeof t)return n;for(var i=Object.assign({},e||{}).decode||l,o=0;o4096&&(a.model={id:null===(i=null==a?void 0:a.model)||void 0===i?void 0:i.id,email:null===(o=null==a?void 0:a.model)||void 0===o?void 0:o.email},this.model instanceof f&&(a.model.verified=this.model.verified),l=u(e,JSON.stringify(a),t)),l},t.prototype.onChange=function(t){var e=this;return this._onChangeCallbacks.push(t),function(){for(var n=e._onChangeCallbacks.length-1;n>=0;n--)if(e._onChangeCallbacks[n]==t)return delete e._onChangeCallbacks[n],void e._onChangeCallbacks.splice(n,1)}},t.prototype.triggerChange=function(){for(var t=0,e=this._onChangeCallbacks;t0?t:1,this.perPage=e>=0?e:0,this.totalItems=n>=0?n:0,this.totalPages=i>=0?i:0,this.items=o||[]},S=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype._getFullList=function(t,e,n){var r=this;void 0===e&&(e=100),void 0===n&&(n={});var s=[],a=function(u){return i(r,void 0,void 0,(function(){return o(this,(function(i){return[2,this._getList(t,u,e,n).then((function(t){var e=t,n=e.items,i=e.totalItems;return s=s.concat(n),n.length&&i>s.length?a(u+1):s}))]}))}))};return a(1)},n.prototype._getList=function(t,e,n,i){var o=this;return void 0===e&&(e=1),void 0===n&&(n=30),void 0===i&&(i={}),i=Object.assign({page:e,perPage:n},i),this.client.send(t,{method:"GET",params:i}).then((function(t){var e=[];if(null==t?void 0:t.items){t.items=t.items||[];for(var n=0,i=t.items;n=400)throw new s({url:t.url,status:t.status,data:e});return[2,e]}}))}))})).catch((function(t){throw new s(t)}))]}))}))},t.prototype.buildUrl=function(t){var e=this.baseUrl+(this.baseUrl.endsWith("/")?"":"/");return t&&(e+=t.startsWith("/")?t.substring(1):t),e},t.prototype.serializeQueryParams=function(t){var e=[];for(var n in t)if(null!==t[n]){var i=t[n],o=encodeURIComponent(n);if(Array.isArray(i))for(var r=0,s=i;r Buffer.from(a, 'base64').toString('binary');\n}\n\n/**\n * Returns JWT token's payload data.\n */\nexport function getTokenPayload(token: string): { [key: string]: any } {\n if (token) {\n try {\n\n let base64 = decodeURIComponent(atobPolyfill(token.split('.')[1]).split('').map(function (c: string) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n\n return JSON.parse(base64) || {};\n } catch (e) {\n }\n }\n\n return {};\n}\n\n/**\n * Checks whether a JWT token is expired or not.\n * Tokens without `exp` payload key are considered valid.\n * Tokens with empty payload (eg. invalid token strings) are considered expired.\n *\n * @param token The token to check.\n * @param [expirationThreshold] Time in seconds that will be subtracted from the token `exp` property.\n */\nexport function isTokenExpired(token: string, expirationThreshold = 0): boolean {\n let payload = getTokenPayload(token);\n\n if (\n Object.keys(payload).length > 0 &&\n (!payload.exp || (payload.exp - expirationThreshold) > (Date.now() / 1000))\n ) {\n return false;\n }\n\n return true;\n}\n","/**\n * -------------------------------------------------------------------\n * Simple cookie parse and serialize utilities mostly based on the\n * node module https://github.com/jshttp/cookie.\n * -------------------------------------------------------------------\n */\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF\n */\nconst fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\nexport interface ParseOptions{\n decode?: (val: string) => string,\n}\n\n/**\n* Parses the given cookie header string into an object\n* The object has the various cookies as keys(names) => values\n*/\nexport function cookieParse(str: string, options?: ParseOptions): { [key: string]: any } {\n const result: { [key: string]: any } = {};\n\n if (typeof str !== 'string') {\n return result;\n }\n\n const opt = Object.assign({}, options || {});\n const decode = opt.decode || defaultDecode;\n\n let index = 0;\n while (index < str.length) {\n const eqIdx = str.indexOf('=', index);\n\n // no more cookie pairs\n if (eqIdx === -1) {\n break;\n }\n\n let endIdx = str.indexOf(';', index);\n\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(';', eqIdx - 1) + 1;\n continue;\n }\n\n const key = str.slice(index, eqIdx).trim();\n\n // only assign once\n if (undefined === result[key]) {\n let val = str.slice(eqIdx + 1, endIdx).trim();\n\n // quoted values\n if (val.charCodeAt(0) === 0x22) {\n val = val.slice(1, -1);\n }\n\n try {\n result[key] = decode(val);\n } catch (_) {\n result[key] = val; // no decoding\n }\n }\n\n index = endIdx + 1;\n }\n\n return result;\n};\n\nexport interface SerializeOptions{\n encode?: (val: string | number | boolean) => string,\n maxAge?: number,\n domain?: string,\n path?: string,\n expires?: Date,\n httpOnly?: boolean,\n secure?: boolean,\n priority?: string,\n sameSite?: boolean|string,\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize the a name value pair into a cookie string suitable for\n * http headers. An optional options object specified cookie parameters.\n *\n * ```js\n * cookieSerialize('foo', 'bar', { httpOnly: true }) // \"foo=bar; httpOnly\"\n * ```\n */\nexport function cookieSerialize(name: string, val: string, options?: SerializeOptions): string {\n const opt = Object.assign({}, options || {});\n const encode = opt.encode || defaultEncode;\n\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n const value = encode(val);\n\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n let result = name + '=' + value;\n\n if (opt.maxAge != null) {\n const maxAge = opt.maxAge - 0;\n\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid');\n }\n\n result += '; Max-Age=' + Math.floor(maxAge);\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n result += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n result += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n if (!isDate(opt.expires) || isNaN(opt.expires.valueOf())) {\n throw new TypeError('option expires is invalid');\n }\n\n result += '; Expires=' + opt.expires.toUTCString();\n }\n\n if (opt.httpOnly) {\n result += '; HttpOnly';\n }\n\n if (opt.secure) {\n result += '; Secure';\n }\n\n if (opt.priority) {\n const priority = typeof opt.priority === 'string' ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case 'low':\n result += '; Priority=Low';\n break;\n case 'medium':\n result += '; Priority=Medium';\n break;\n case 'high':\n result += '; Priority=High';\n break;\n default:\n throw new TypeError('option priority is invalid');\n }\n }\n\n if (opt.sameSite) {\n const sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n result += '; SameSite=Strict';\n break;\n case 'lax':\n result += '; SameSite=Lax';\n break;\n case 'strict':\n result += '; SameSite=Strict';\n break;\n case 'none':\n result += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return result;\n};\n\n/**\n * Default URL-decode string value function.\n * Optimized to skip native call when no `%`.\n */\nfunction defaultDecode(val: string): string {\n return val.indexOf('%') !== -1\n ? decodeURIComponent(val)\n : val;\n}\n\n/**\n * Default URL-encode value function.\n */\nfunction defaultEncode(val: string | number | boolean): string {\n return encodeURIComponent(val);\n}\n\n/**\n * Determines if value is a Date.\n */\nfunction isDate(val: any): boolean {\n return (\n Object.prototype.toString.call(val) === '[object Date]' ||\n val instanceof Date\n );\n}\n","export default abstract class BaseModel {\n id!: string;\n created!: string;\n updated!: string;\n\n constructor(data: { [key: string]: any } = {}) {\n this.load(data || {});\n }\n\n /**\n * Loads `data` into the current model.\n */\n load(data: { [key: string]: any }) {\n this.id = typeof data.id !== 'undefined' ? data.id : '';\n this.created = typeof data.created !== 'undefined' ? data.created : '';\n this.updated = typeof data.updated !== 'undefined' ? data.updated : '';\n }\n\n /**\n * Returns whether the current loaded data represent a stored db record.\n */\n get isNew(): boolean {\n return (\n // id is not set\n !this.id ||\n // zero uuid value\n this.id === '00000000-0000-0000-0000-000000000000'\n );\n }\n\n /**\n * Robust deep clone of a model.\n */\n clone(): BaseModel {\n return new (this.constructor as any)(JSON.parse(JSON.stringify(this)));\n }\n\n /**\n * Exports all model properties as a new plain object.\n */\n export(): { [key: string]: any } {\n return Object.assign({}, this);\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\n\nexport default class Record extends BaseModel {\n [key: string]: any,\n\n '@collectionId'!: string;\n '@collectionName'!: string;\n '@expand'!: {[key: string]: any};\n\n /**\n * @inheritdoc\n */\n load(data: { [key: string]: any }) {\n super.load(data);\n\n for (const [key, value] of Object.entries(data)) {\n this[key] = value;\n }\n\n // normalize common fields\n this['@collectionId'] = typeof data['@collectionId'] !== 'undefined' ? data['@collectionId'] : '';\n this['@collectionName'] = typeof data['@collectionName'] !== 'undefined' ? data['@collectionName'] : '';\n this['@expand'] = typeof data['@expand'] !== 'undefined' ? data['@expand'] : {};\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\nimport Record from '@/models/Record';\n\nexport default class User extends BaseModel {\n email!: string;\n verified!: boolean;\n lastResetSentAt!: string;\n lastVerificationSentAt!: string;\n profile!: null|Record;\n\n /**\n * @inheritdoc\n */\n load(data: { [key: string]: any }) {\n super.load(data);\n\n this.email = typeof data.email === 'string' ? data.email : '';\n this.verified = !!data.verified;\n this.lastResetSentAt = typeof data.lastResetSentAt === 'string' ? data.lastResetSentAt : '';\n this.lastVerificationSentAt = typeof data.lastVerificationSentAt === 'string' ? data.lastVerificationSentAt : '';\n this.profile = data.profile ? new Record(data.profile) : null;\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\n\nexport default class Admin extends BaseModel {\n avatar!: number;\n email!: string;\n lastResetSentAt!: string;\n\n /**\n * @inheritdoc\n */\n load(data: { [key: string]: any }) {\n super.load(data);\n\n this.avatar = typeof data.avatar === 'number' ? data.avatar : 0;\n this.email = typeof data.email === 'string' ? data.email : '';\n this.lastResetSentAt = typeof data.lastResetSentAt === 'string' ? data.lastResetSentAt : '';\n }\n}\n","import { cookieParse, cookieSerialize, SerializeOptions } from '@/stores/utils/cookie';\nimport { isTokenExpired, getTokenPayload } from '@/stores/utils/jwt';\nimport User from '@/models/User';\nimport Admin from '@/models/Admin';\n\ntype onChangeFunc = (token: string, model: User|Admin|null) => void;\n\nconst defaultCookieKey = 'pb_auth';\n\n/**\n * Base AuthStore class that is intended to be extended by all other\n * PocketBase AuthStore implementations.\n */\nexport default abstract class BaseAuthStore {\n protected baseToken: string = '';\n protected baseModel: User|Admin|null = null;\n\n private _onChangeCallbacks: Array = [];\n\n /**\n * Retrieves the stored token (if any).\n */\n get token(): string {\n return this.baseToken;\n }\n\n /**\n * Retrieves the stored model data (if any).\n */\n get model(): User|Admin|null {\n return this.baseModel;\n }\n\n /**\n * Checks if the store has valid (aka. existing and unexpired) token.\n */\n get isValid(): boolean {\n return !isTokenExpired(this.token);\n }\n\n /**\n * Saves the provided new token and model data in the auth store.\n */\n save(token: string, model: User|Admin|null): void {\n this.baseToken = token || '';\n\n // normalize the model instance\n if (model !== null && typeof model === 'object') {\n this.baseModel = (model as any)?.verified !== 'undefined' ?\n new User(model) : new Admin(model);\n } else {\n this.baseModel = null;\n }\n\n this.triggerChange();\n }\n\n /**\n * Removes the stored token and model data form the auth store.\n */\n clear(): void {\n this.baseToken = '';\n this.baseModel = null;\n this.triggerChange();\n }\n\n /**\n * Parses the provided cookie string and updates the store state\n * with the cookie's token and model data.\n */\n loadFromCookie(cookie: string, key = defaultCookieKey): void {\n const rawData = cookieParse(cookie || '')[key] || '';\n\n let data: { [key: string]: any } = {};\n try {\n data = JSON.parse(rawData);\n // normalize\n if (typeof data === null || typeof data !== 'object' || Array.isArray(data)) {\n data = {};\n }\n } catch (_) {}\n\n this.save(data.token || '', data.model || {});\n }\n\n /**\n * Exports the current store state as cookie string.\n *\n * By default the following optional attributes are added:\n * - Secure\n * - HttpOnly\n * - SameSite=Strict\n * - Path=/\n * - Expires={the token expiration date}\n *\n * NB! If the generated cookie exceeds 4096 bytes, this method will\n * strip the model data to the bare minimum to try to fit within the\n * recommended size in https://www.rfc-editor.org/rfc/rfc6265#section-6.1.\n */\n exportToCookie(options?: SerializeOptions, key = defaultCookieKey): string {\n const defaultOptions: SerializeOptions = {\n secure: true,\n sameSite: true,\n httpOnly: true,\n path: \"/\",\n };\n\n // extract the token expiration date\n const payload = getTokenPayload(this.token);\n if (payload?.exp) {\n defaultOptions.expires = new Date(payload.exp * 1000);\n } else {\n defaultOptions.expires = new Date('1970-01-01');\n }\n\n // merge with the user defined options\n options = Object.assign({}, defaultOptions, options);\n\n const rawData = {\n token: this.token,\n model: this.model?.export() || null,\n };\n\n let result = cookieSerialize(key, JSON.stringify(rawData), options);\n\n const resultLength = typeof Blob !== 'undefined' ?\n (new Blob([result])).size : result.length;\n\n // strip down the model data to the bare minimum\n if (rawData.model && resultLength > 4096) {\n rawData.model = {id: rawData?.model?.id, email: rawData?.model?.email};\n if (this.model instanceof User) {\n rawData.model.verified = this.model.verified;\n }\n result = cookieSerialize(key, JSON.stringify(rawData), options)\n }\n\n return result;\n }\n\n /**\n * Register a callback function that will be called on store change.\n *\n * Returns a removal function that you could call to \"unsubscribe\" from the changes.\n */\n onChange(callback: () => void): () => void {\n this._onChangeCallbacks.push(callback);\n\n return () => {\n for (let i = this._onChangeCallbacks.length - 1; i >= 0; i--) {\n if (this._onChangeCallbacks[i] == callback) {\n delete this._onChangeCallbacks[i]; // removes the function reference\n this._onChangeCallbacks.splice(i, 1); // reindex the array\n return;\n }\n }\n }\n }\n\n protected triggerChange(): void {\n for (const callback of this._onChangeCallbacks) {\n callback && callback(this.token, this.model);\n }\n }\n}\n","import BaseAuthStore from '@/stores/BaseAuthStore';\nimport User from '@/models/User';\nimport Admin from '@/models/Admin';\n\n/**\n * The default token store for browsers with auto fallback\n * to runtime/memory if local storage is undefined (eg. in node env).\n */\nexport default class LocalAuthStore extends BaseAuthStore {\n private storageFallback: { [key: string]: any } = {};\n private storageKey: string\n\n constructor(storageKey = \"pocketbase_auth\") {\n super();\n\n this.storageKey = storageKey;\n }\n\n /**\n * @inheritdoc\n */\n get token(): string {\n const data = this._storageGet(this.storageKey) || {};\n\n return data.token || '';\n }\n\n /**\n * @inheritdoc\n */\n get model(): User|Admin|null {\n const data = this._storageGet(this.storageKey) || {};\n\n if (\n data === null ||\n typeof data !== 'object' ||\n data.model === null ||\n typeof data.model !== 'object'\n ) {\n return null;\n }\n\n // admins don't have `verified` prop\n if (typeof data.model?.verified !== 'undefined') {\n return new User(data.model);\n }\n\n return new Admin(data.model);\n }\n\n /**\n * @inheritdoc\n */\n save(token: string, model: User|Admin|null) {\n this._storageSet(this.storageKey, {\n 'token': token,\n 'model': model,\n });\n\n super.save(token, model);\n }\n\n /**\n * @inheritdoc\n */\n clear() {\n this._storageRemove(this.storageKey);\n\n super.clear();\n }\n\n // ---------------------------------------------------------------\n // Internal helpers:\n // ---------------------------------------------------------------\n\n /**\n * Retrieves `key` from the browser's local storage\n * (or runtime/memory if local storage is undefined).\n */\n private _storageGet(key: string): any {\n if (typeof window !== 'undefined' && window?.localStorage) {\n const rawValue = window?.localStorage?.getItem(key) || '';\n try {\n return JSON.parse(rawValue);\n } catch (e) { // not a json\n return rawValue;\n }\n }\n\n // fallback\n return this.storageFallback[key];\n }\n\n /**\n * Stores a new data in the browser's local storage\n * (or runtime/memory if local storage is undefined).\n */\n private _storageSet(key: string, value: any) {\n if (typeof window !== 'undefined' && window?.localStorage) {\n // store in local storage\n let normalizedVal = value;\n if (typeof value !== 'string') {\n normalizedVal = JSON.stringify(value);\n }\n window?.localStorage?.setItem(key, normalizedVal);\n } else {\n // store in fallback\n this.storageFallback[key] = value;\n }\n }\n\n /**\n * Removes `key` from the browser's local storage and the runtime/memory.\n */\n private _storageRemove(key: string) {\n // delete from local storage\n if (typeof window !== 'undefined') {\n window?.localStorage?.removeItem(key);\n }\n\n // delete from fallback\n delete this.storageFallback[key];\n }\n}\n","import Client from '@/Client';\n\n/**\n * BaseService class that should be inherited from all API services.\n */\nexport default abstract class BaseService {\n readonly client: Client\n\n constructor(client: Client) {\n this.client = client;\n }\n}\n","import BaseService from '@/services/utils/BaseService';\n\nexport default class Settings extends BaseService {\n /**\n * Fetch all available app settings.\n */\n getAll(queryParams = {}): Promise<{ [key: string]: any }> {\n return this.client.send('/api/settings', {\n 'method': 'GET',\n 'params': queryParams,\n }).then((responseData) => responseData || {});\n }\n\n /**\n * Bulk updates app settings.\n */\n update(bodyParams = {}, queryParams = {}): Promise<{ [key: string]: any }> {\n return this.client.send('/api/settings', {\n 'method': 'PATCH',\n 'params': queryParams,\n 'body': bodyParams,\n }).then((responseData) => responseData || {});\n }\n\n /**\n * Performs a S3 storage connection test.\n */\n testS3(queryParams = {}): Promise {\n return this.client.send('/api/settings/test/s3', {\n 'method': 'POST',\n 'params': queryParams,\n }).then(() => true);\n }\n\n /**\n * Sends a test email.\n *\n * The possible `emailTemplate` values are:\n * - verification\n * - password-reset\n * - email-change\n */\n testEmail(toEmail: string, emailTemplate: string, queryParams = {}): Promise {\n const bodyParams = {\n 'email': toEmail,\n 'template': emailTemplate,\n };\n\n return this.client.send('/api/settings/test/email', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(() => true);\n }\n}\n","import BaseModel from './BaseModel';\n\nexport default class ListResult {\n page!: number;\n perPage!: number;\n totalItems!: number;\n totalPages!: number;\n items!: Array;\n\n constructor(\n page: number,\n perPage: number,\n totalItems: number,\n totalPages: number,\n items: Array,\n ) {\n this.page = page > 0 ? page : 1;\n this.perPage = perPage >= 0 ? perPage : 0;\n this.totalItems = totalItems >= 0 ? totalItems : 0;\n this.totalPages = totalPages >= 0 ? totalPages : 0;\n this.items = items || [];\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\nimport ListResult from '@/models/utils/ListResult';\nimport BaseService from '@/services/utils/BaseService';\n\nexport default abstract class BaseCrudService extends BaseService {\n /**\n * Response data decoder.\n */\n abstract decode(data: { [key: string]: any }): M\n\n /**\n * Returns a promise with all list items batch fetched at once.\n */\n protected _getFullList(basePath: string, batchSize = 100, queryParams = {}): Promise> {\n var result: Array = [];\n\n let request = async (page: number): Promise> => {\n return this._getList(basePath, page, batchSize, queryParams).then((list) => {\n const castedList = (list as ListResult);\n const items = castedList.items;\n const totalItems = castedList.totalItems;\n\n result = result.concat(items);\n\n if (items.length && totalItems > result.length) {\n return request(page + 1);\n }\n\n return result;\n });\n }\n\n return request(1);\n }\n\n /**\n * Returns paginated items list.\n */\n protected _getList(basePath: string, page = 1, perPage = 30, queryParams = {}): Promise> {\n queryParams = Object.assign({\n 'page': page,\n 'perPage': perPage,\n }, queryParams);\n\n return this.client.send(basePath, {\n 'method': 'GET',\n 'params': queryParams,\n }).then((responseData: any) => {\n const items: Array = [];\n if (responseData?.items) {\n responseData.items = responseData.items || [];\n for (const item of responseData.items) {\n items.push(this.decode(item));\n }\n }\n\n return new ListResult(\n responseData?.page || 1,\n responseData?.perPage || 0,\n responseData?.totalItems || 0,\n responseData?.totalPages || 0,\n items,\n );\n });\n }\n\n /**\n * Returns single item by its id.\n */\n protected _getOne(basePath: string, id: string, queryParams = {}): Promise {\n return this.client.send(basePath + '/' + encodeURIComponent(id), {\n 'method': 'GET',\n 'params': queryParams\n }).then((responseData: any) => this.decode(responseData));\n }\n\n /**\n * Creates a new item.\n */\n protected _create(basePath: string, bodyParams = {}, queryParams = {}): Promise {\n return this.client.send(basePath, {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then((responseData: any) => this.decode(responseData));\n }\n\n /**\n * Updates an existing item by its id.\n */\n protected _update(basePath: string, id: string, bodyParams = {}, queryParams = {}): Promise {\n return this.client.send(basePath + '/' + encodeURIComponent(id), {\n 'method': 'PATCH',\n 'params': queryParams,\n 'body': bodyParams,\n }).then((responseData: any) => this.decode(responseData));\n }\n\n /**\n * Deletes an existing item by its id.\n */\n protected _delete(basePath: string, id: string, queryParams = {}): Promise {\n return this.client.send(basePath + '/' + encodeURIComponent(id), {\n 'method': 'DELETE',\n 'params': queryParams,\n }).then(() => true);\n }\n}\n","import ListResult from '@/models/utils/ListResult';\nimport BaseModel from '@/models/utils/BaseModel';\nimport BaseCrudService from '@/services/utils/BaseCrudService';\n\nexport default abstract class CrudService extends BaseCrudService {\n /**\n * Base path for the crud actions (without trailing slash, eg. '/admins').\n */\n abstract baseCrudPath(): string\n\n /**\n * Returns a promise with all list items batch fetched at once.\n */\n getFullList(batchSize = 100, queryParams = {}): Promise> {\n return this._getFullList(this.baseCrudPath(), batchSize, queryParams);\n }\n\n /**\n * Returns paginated items list.\n */\n getList(page = 1, perPage = 30, queryParams = {}): Promise> {\n return this._getList(this.baseCrudPath(), page, perPage, queryParams);\n }\n\n /**\n * Returns single item by its id.\n */\n getOne(id: string, queryParams = {}): Promise {\n return this._getOne(this.baseCrudPath(), id, queryParams);\n }\n\n /**\n * Creates a new item.\n */\n create(bodyParams = {}, queryParams = {}): Promise {\n return this._create(this.baseCrudPath(), bodyParams, queryParams);\n }\n\n /**\n * Updates an existing item by its id.\n */\n update(id: string, bodyParams = {}, queryParams = {}): Promise {\n return this._update(this.baseCrudPath(), id, bodyParams, queryParams);\n }\n\n /**\n * Deletes an existing item by its id.\n */\n delete(id: string, queryParams = {}): Promise {\n return this._delete(this.baseCrudPath(), id, queryParams);\n }\n}\n","import CrudService from '@/services/utils/CrudService';\nimport Admin from '@/models/Admin';\n\nexport type AdminAuthResponse = {\n [key: string]: any,\n token: string,\n admin: Admin,\n}\n\nexport default class Admins extends CrudService {\n /**\n * @inheritdoc\n */\n decode(data: { [key: string]: any }): Admin {\n return new Admin(data);\n }\n\n /**\n * @inheritdoc\n */\n baseCrudPath(): string {\n return '/api/admins';\n }\n\n /**\n * Prepare successful authorize response.\n */\n protected authResponse(responseData: any): AdminAuthResponse {\n const admin = this.decode(responseData?.admin || {});\n\n if (responseData?.token && responseData?.admin) {\n this.client.authStore.save(responseData.token, admin);\n }\n\n return Object.assign({}, responseData, {\n // normalize common fields\n 'token': responseData?.token || '',\n 'admin': admin,\n });\n }\n\n /**\n * Authenticate an admin account by its email and password\n * and returns a new admin token and data.\n *\n * On success this method automatically updates the client's AuthStore data.\n */\n authViaEmail(\n email: string,\n password: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'email': email,\n 'password': password,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/auth-via-email', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n 'headers': {\n 'Authorization': '',\n },\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Refreshes the current admin authenticated instance and\n * returns a new token and admin data.\n *\n * On success this method automatically updates the client's AuthStore data.\n */\n refresh(bodyParams = {}, queryParams = {}): Promise {\n return this.client.send(this.baseCrudPath() + '/refresh', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Sends admin password reset request.\n */\n requestPasswordReset(\n email: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'email': email,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/request-password-reset', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(() => true);\n }\n\n /**\n * Confirms admin password reset request.\n */\n confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'token': passwordResetToken,\n 'password': password,\n 'passwordConfirm': passwordConfirm,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/confirm-password-reset', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(this.authResponse.bind(this));\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\n\nexport default class ExternalAuth extends BaseModel {\n userId!: string;\n provider!: string;\n providerId!: string;\n\n /**\n * @inheritdoc\n */\n load(data: { [key: string]: any }) {\n super.load(data);\n\n this.userId = typeof data.userId === 'string' ? data.userId : '';\n this.provider = typeof data.provider === 'string' ? data.provider : '';\n this.providerId = typeof data.providerId === 'string' ? data.providerId : '';\n }\n}\n","import CrudService from '@/services/utils/CrudService';\nimport User from '@/models/User';\nimport ExternalAuth from '@/models/ExternalAuth';\n\nexport type UserAuthResponse = {\n [key: string]: any,\n token: string,\n user: User,\n}\n\nexport type AuthProviderInfo = {\n name: string,\n state: string,\n codeVerifier: string,\n codeChallenge: string,\n codeChallengeMethod: string,\n authUrl: string,\n}\n\nexport type AuthMethodsList = {\n [key: string]: any,\n emailPassword: boolean,\n authProviders: Array,\n}\n\nexport default class Users extends CrudService {\n /**\n * @inheritdoc\n */\n decode(data: { [key: string]: any }): User {\n return new User(data);\n }\n\n /**\n * @inheritdoc\n */\n baseCrudPath(): string {\n return '/api/users';\n }\n\n /**\n * Prepare successful authorization response.\n */\n protected authResponse(responseData: any): UserAuthResponse {\n const user = this.decode(responseData?.user || {});\n\n if (responseData?.token && responseData?.user) {\n this.client.authStore.save(responseData.token, user);\n }\n\n return Object.assign({}, responseData, {\n // normalize common fields\n 'token': responseData?.token || '',\n 'user': user,\n });\n }\n\n /**\n * Returns all available application auth methods.\n */\n listAuthMethods(queryParams = {}): Promise {\n return this.client.send(this.baseCrudPath() + '/auth-methods', {\n 'method': 'GET',\n 'params': queryParams,\n }).then((responseData: any) => {\n return Object.assign({}, responseData, {\n // normalize common fields\n 'emailPassword': !!responseData?.emailPassword,\n 'authProviders': Array.isArray(responseData?.authProviders) ? responseData?.authProviders : [],\n });\n });\n }\n\n /**\n * Authenticate a user via its email and password.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - new user authentication token\n * - the authenticated user model record\n */\n authViaEmail(\n email: string,\n password: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'email': email,\n 'password': password,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/auth-via-email', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n 'headers': {\n 'Authorization': '',\n },\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Authenticate a user via OAuth2 client provider.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - new user authentication token\n * - the authenticated user model record\n * - the OAuth2 user profile data (eg. name, email, avatar, etc.)\n */\n authViaOAuth2(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectUrl: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'provider': provider,\n 'code': code,\n 'codeVerifier': codeVerifier,\n 'redirectUrl': redirectUrl,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/auth-via-oauth2', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n 'headers': {\n 'Authorization': '',\n },\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Refreshes the current user authenticated instance and\n * returns a new token and user data.\n *\n * On success this method also automatically updates the client's AuthStore data.\n */\n refresh(bodyParams = {}, queryParams = {}): Promise {\n return this.client.send(this.baseCrudPath() + '/refresh', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Sends user password reset request.\n */\n requestPasswordReset(\n email: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'email': email,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/request-password-reset', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(() => true);\n }\n\n /**\n * Confirms user password reset request.\n */\n confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'token': passwordResetToken,\n 'password': password,\n 'passwordConfirm': passwordConfirm,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/confirm-password-reset', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Sends user verification email request.\n */\n requestVerification(\n email: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'email': email,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/request-verification', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(() => true);\n }\n\n /**\n * Confirms user email verification request.\n */\n confirmVerification(\n verificationToken: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'token': verificationToken,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/confirm-verification', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Sends an email change request to the authenticated user.\n */\n requestEmailChange(\n newEmail: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'newEmail': newEmail,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/request-email-change', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(() => true);\n }\n\n /**\n * Confirms user new email address.\n */\n confirmEmailChange(\n emailChangeToken: string,\n password: string,\n bodyParams = {},\n queryParams = {},\n ): Promise {\n bodyParams = Object.assign({\n 'token': emailChangeToken,\n 'password': password,\n }, bodyParams);\n\n return this.client.send(this.baseCrudPath() + '/confirm-email-change', {\n 'method': 'POST',\n 'params': queryParams,\n 'body': bodyParams,\n }).then(this.authResponse.bind(this));\n }\n\n /**\n * Lists all linked external auth providers for the specified user.\n */\n listExternalAuths(\n userId: string,\n queryParams = {}\n ): Promise> {\n return this.client.send(this.baseCrudPath() + '/' + encodeURIComponent(userId) + '/external-auths', {\n 'method': 'GET',\n 'params': queryParams,\n }).then((responseData) => {\n const items: Array = [];\n\n if (Array.isArray(responseData)) {\n for (const item of responseData) {\n items.push(new ExternalAuth(item));\n }\n }\n\n return items;\n });\n }\n\n /**\n * Unlink a single external auth provider from the specified user.\n */\n unlinkExternalAuth(\n userId: string,\n provider: string,\n queryParams = {}\n ): Promise {\n return this.client.send(this.baseCrudPath() + '/' + encodeURIComponent(userId) + '/external-auths/' + encodeURIComponent(provider), {\n 'method': 'DELETE',\n 'params': queryParams,\n }).then(() => true);\n }\n}\n","export default class SchemaField {\n id!: string;\n name!: string;\n type!: string;\n system!: boolean;\n required!: boolean;\n unique!: boolean;\n options!: { [key: string]: any };\n\n constructor(data: { [key: string]: any } = {}) {\n this.load(data || {});\n }\n\n /**\n * Loads `data` into the field.\n */\n load(data: { [key: string]: any }) {\n this.id = typeof data.id !== 'undefined' ? data.id : '';\n this.name = typeof data.name !== 'undefined' ? data.name : '';\n this.type = typeof data.type !== 'undefined' ? data.type : 'text';\n this.system = !!data.system;\n this.required = !!data.required;\n this.unique = !!data.unique;\n this.options = typeof data.options === 'object' && data.options !== null ? data.options : {};\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\nimport SchemaField from '@/models/utils/SchemaField';\n\nexport default class Collection extends BaseModel {\n name!: string;\n schema!: Array;\n system!: boolean;\n listRule!: null|string;\n viewRule!: null|string;\n createRule!: null|string;\n updateRule!: null|string;\n deleteRule!: null|string;\n\n /**\n * @inheritdoc\n */\n load(data: { [key: string]: any }) {\n super.load(data);\n\n this.name = typeof data.name === 'string' ? data.name : '';\n this.system = !!data.system;\n\n // rules\n this.listRule = typeof data.listRule === 'string' ? data.listRule : null;\n this.viewRule = typeof data.viewRule === 'string' ? data.viewRule : null;\n this.createRule = typeof data.createRule === 'string' ? data.createRule : null;\n this.updateRule = typeof data.updateRule === 'string' ? data.updateRule : null;\n this.deleteRule = typeof data.deleteRule === 'string' ? data.deleteRule : null;\n\n // schema\n data.schema = Array.isArray(data.schema) ? data.schema : [];\n this.schema = [];\n for (let field of data.schema) {\n this.schema.push(new SchemaField(field));\n }\n }\n}\n","import CrudService from '@/services/utils/CrudService';\nimport Collection from '@/models/Collection';\n\nexport default class Collections extends CrudService {\n /**\n * @inheritdoc\n */\n decode(data: { [key: string]: any }): Collection {\n return new Collection(data);\n }\n\n /**\n * @inheritdoc\n */\n baseCrudPath(): string {\n return '/api/collections';\n }\n\n /**\n * Imports the provided collections.\n *\n * If `deleteMissing` is `true`, all local collections and schema fields,\n * that are not present in the imported configuration, WILL BE DELETED\n * (including their related records data)!\n */\n async import(collections: Array, deleteMissing: boolean = false, queryParams = {}): Promise {\n return this.client.send(this.baseCrudPath() + '/import', {\n 'method': 'PUT',\n 'params': queryParams,\n 'body': {\n 'collections': collections,\n 'deleteMissing': deleteMissing,\n }\n }).then(() => true);\n }\n}\n","import SubCrudService from '@/services/utils/SubCrudService';\nimport Record from '@/models/Record';\n\nexport default class Records extends SubCrudService {\n /**\n * @inheritdoc\n */\n decode(data: { [key: string]: any }): Record {\n return new Record(data);\n }\n\n /**\n * @inheritdoc\n */\n baseCrudPath(collectionIdOrName: string): string {\n return '/api/collections/' + encodeURIComponent(collectionIdOrName) + '/records';\n }\n\n /**\n * Builds and returns an absolute record file url.\n */\n getFileUrl(record: Record, filename: string, queryParams = {}): string {\n const parts = [];\n parts.push(this.client.baseUrl.replace(/\\/+$/gm, \"\"))\n parts.push(\"api\")\n parts.push(\"files\")\n parts.push(record[\"@collectionId\"])\n parts.push(record.id)\n parts.push(filename)\n let result = parts.join('/');\n\n if (Object.keys(queryParams).length) {\n const params = new URLSearchParams(queryParams);\n result += (result.includes(\"?\") ? \"&\" : \"?\") + params;\n }\n\n return result\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\nimport ListResult from '@/models/utils/ListResult';\nimport BaseCrudService from '@/services/utils/BaseCrudService';\n\nexport default abstract class SubCrudService extends BaseCrudService {\n /**\n * Base path for the crud actions (without trailing slash, eg. '/collections/{:sub}/records').\n */\n abstract baseCrudPath(sub: string): string\n\n /**\n * Returns a promise with all list items batch fetched at once.\n */\n getFullList(sub: string, batchSize = 100, queryParams = {}): Promise> {\n return this._getFullList(this.baseCrudPath(sub), batchSize, queryParams);\n }\n\n /**\n * Returns paginated items list.\n */\n getList(sub: string, page = 1, perPage = 30, queryParams = {}): Promise> {\n return this._getList(this.baseCrudPath(sub), page, perPage, queryParams);\n }\n\n /**\n * Returns single item by its id.\n */\n getOne(sub: string, id: string, queryParams = {}): Promise {\n return this._getOne(this.baseCrudPath(sub), id, queryParams);\n }\n\n /**\n * Creates a new item.\n */\n create(sub: string, bodyParams = {}, queryParams = {}): Promise {\n return this._create(this.baseCrudPath(sub), bodyParams, queryParams);\n }\n\n /**\n * Updates an existing item by its id.\n */\n update(sub: string, id: string, bodyParams = {}, queryParams = {}): Promise {\n return this._update(this.baseCrudPath(sub), id, bodyParams, queryParams);\n }\n\n /**\n * Deletes an existing item by its id.\n */\n delete(sub: string, id: string, queryParams = {}): Promise {\n return this._delete(this.baseCrudPath(sub), id, queryParams);\n }\n}\n","import BaseModel from '@/models/utils/BaseModel';\n\nexport default class LogRequest extends BaseModel {\n url!: string;\n method!: string;\n status!: number;\n auth!: string;\n remoteIp!: string;\n userIp!: string;\n referer!: string;\n userAgent!: string;\n meta!: null|{ [key: string]: any };\n\n /**\n * @inheritdoc\n */\n load(data: { [key: string]: any }) {\n super.load(data);\n\n // fallback to the ip field for backward compatability\n data.remoteIp = data.remoteIp || data.ip;\n\n this.url = typeof data.url === 'string' ? data.url : '';\n this.method = typeof data.method === 'string' ? data.method : 'GET';\n this.status = typeof data.status === 'number' ? data.status : 200;\n this.auth = typeof data.auth === 'string' ? data.auth : 'guest';\n this.remoteIp = typeof data.remoteIp === 'string' ? data.remoteIp : '';\n this.userIp = typeof data.userIp === 'string' ? data.userIp : '';\n this.referer = typeof data.referer === 'string' ? data.referer : '';\n this.userAgent = typeof data.userAgent === 'string' ? data.userAgent : '';\n this.meta = typeof data.meta === 'object' && data.meta !== null ? data.meta : {};\n }\n}\n","import LogRequest from '@/models/LogRequest';\nimport ListResult from '@/models/utils/ListResult';\nimport BaseService from '@/services/utils/BaseService';\n\nexport type HourlyStats = {\n total: number,\n date: string,\n}\n\nexport default class Logs extends BaseService {\n /**\n * Returns paginated logged requests list.\n */\n getRequestsList(page = 1, perPage = 30, queryParams = {}): Promise> {\n queryParams = Object.assign({\n 'page': page,\n 'perPage': perPage,\n }, queryParams);\n\n return this.client.send('/api/logs/requests', {\n 'method': 'GET',\n 'params': queryParams,\n }).then((responseData: any) => {\n const items: Array = [];\n if (responseData?.items) {\n responseData.items = responseData?.items || [];\n for (const item of responseData.items) {\n items.push(new LogRequest(item));\n }\n }\n\n return new ListResult(\n responseData?.page || 1,\n responseData?.perPage || 0,\n responseData?.totalItems || 0,\n responseData?.totalPages || 0,\n items,\n );\n });\n }\n\n /**\n * Returns a single logged request by its id.\n */\n getRequest(id: string, queryParams = {}): Promise {\n return this.client.send('/api/logs/requests/' + encodeURIComponent(id), {\n 'method': 'GET',\n 'params': queryParams\n }).then((responseData: any) => new LogRequest(responseData));\n }\n\n /**\n * Returns request logs statistics.\n */\n getRequestsStats(queryParams = {}): Promise> {\n return this.client.send('/api/logs/requests/stats', {\n 'method': 'GET',\n 'params': queryParams\n }).then((responseData: any) => responseData);\n }\n}\n","import BaseService from '@/services/utils/BaseService';\nimport Record from '@/models/Record';\n\nexport interface MessageData {\n [key: string]: any;\n action: string;\n record: Record;\n}\n\nexport interface SubscriptionFunc{\n (data: MessageData):void;\n}\n\nexport default class Realtime extends BaseService {\n private clientId: string = \"\";\n private eventSource: EventSource | null = null;\n private subscriptions: { [key: string]: EventListener } = {};\n\n /**\n * Inits the sse connection (if not already) and register the subscription.\n */\n async subscribe(subscription: string, callback: SubscriptionFunc): Promise {\n if (!subscription) {\n throw new Error('subscription must be set.')\n }\n\n // unsubscribe existing\n if (this.subscriptions[subscription]) {\n this.eventSource?.removeEventListener(subscription, this.subscriptions[subscription]);\n }\n\n // register subscription\n this.subscriptions[subscription] = function (e: Event) {\n const msgEvent = (e as MessageEvent);\n\n let data;\n try {\n data = JSON.parse(msgEvent?.data);\n } catch {}\n\n callback(data || {});\n }\n\n if (!this.eventSource) {\n // start a new sse connection\n this.connect();\n } else if (this.clientId) {\n // otherwise - just persist the updated subscriptions\n await this.submitSubscriptions();\n }\n }\n\n /**\n * Unsubscribe from a subscription.\n *\n * If the `subscription` argument is not set,\n * then the client will unsubscribe from all registered subscriptions.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operations there are no active subscriptions left.\n */\n async unsubscribe(subscription?: string): Promise {\n if (!subscription) {\n // remove all subscriptions\n this.removeSubscriptionListeners();\n this.subscriptions = {};\n } else if (this.subscriptions[subscription]) {\n // remove a single subscription\n this.eventSource?.removeEventListener(subscription, this.subscriptions[subscription]);\n delete this.subscriptions[subscription];\n } else {\n // not subscribed to the specified subscription\n return\n }\n\n if (this.clientId) {\n await this.submitSubscriptions();\n }\n\n // no more subscriptions -> close the sse connection\n if (!Object.keys(this.subscriptions).length) {\n this.disconnect();\n }\n }\n\n private async submitSubscriptions(): Promise {\n // optimistic update\n this.addSubscriptionListeners();\n\n return this.client.send('/api/realtime', {\n 'method': 'POST',\n 'body': {\n 'clientId': this.clientId,\n 'subscriptions': Object.keys(this.subscriptions),\n },\n 'params': {\n '$autoCancel': false,\n },\n }).then(() => true);\n }\n\n private addSubscriptionListeners(): void {\n if (!this.eventSource) {\n return;\n }\n\n this.removeSubscriptionListeners();\n\n for (let sub in this.subscriptions) {\n this.eventSource.addEventListener(sub, this.subscriptions[sub]);\n }\n }\n\n private removeSubscriptionListeners(): void {\n if (!this.eventSource) {\n return;\n }\n\n for (let sub in this.subscriptions) {\n this.eventSource.removeEventListener(sub, this.subscriptions[sub]);\n }\n }\n\n private connectHandler(e: Event): void {\n const msgEvent = (e as MessageEvent);\n this.clientId = msgEvent?.lastEventId;\n this.submitSubscriptions();\n }\n\n private connect(): void {\n this.disconnect();\n this.eventSource = new EventSource(this.client.buildUrl('/api/realtime'))\n this.eventSource.addEventListener('PB_CONNECT', (e) => this.connectHandler(e));\n }\n\n private disconnect(): void {\n this.removeSubscriptionListeners();\n this.eventSource?.removeEventListener('PB_CONNECT', (e) => this.connectHandler(e));\n this.eventSource?.close();\n this.eventSource = null;\n this.clientId = \"\";\n }\n}\n","import ClientResponseError from '@/ClientResponseError';\nimport BaseAuthStore from '@/stores/BaseAuthStore';\nimport LocalAuthStore from '@/stores/LocalAuthStore';\nimport Settings from '@/services/Settings';\nimport Admins from '@/services/Admins';\nimport Users from '@/services/Users';\nimport Collections from '@/services/Collections';\nimport Records from '@/services/Records';\nimport Logs from '@/services/Logs';\nimport Realtime from '@/services/Realtime';\n\n/**\n * PocketBase JS Client.\n */\nexport default class Client {\n /**\n * The base PocketBase backend url address (eg. 'http://127.0.0.1.8090').\n */\n baseUrl: string;\n\n /**\n * Hook that get triggered right before sending the fetch request,\n * allowing you to inspect/modify the request config.\n *\n * Returns the new modified config that will be used to send the request.\n *\n * For list of the possible options check https://developer.mozilla.org/en-US/docs/Web/API/fetch#options\n *\n * Example:\n * ```js\n * client.beforeSend = function (url, reqConfig) {\n * reqConfig.headers = Object.assign({}, reqConfig.headers, {\n * 'X-Custom-Header': 'example',\n * });\n *\n * return reqConfig;\n * };\n * ```\n */\n beforeSend?: (url: string, reqConfig: { [key: string]: any }) => { [key: string]: any };\n\n /**\n * Hook that get triggered after successfully sending the fetch request,\n * allowing you to inspect/modify the response object and its parsed data.\n *\n * Returns the new Promise resolved `data` that will be returned to the client.\n *\n * Example:\n * ```js\n * client.afterSend = function (response, data) {\n * if (response.status != 200) {\n * throw new ClientResponseError({\n * url: response.url,\n * status: response.status,\n * data: data,\n * });\n * }\n *\n * return data;\n * };\n * ```\n */\n afterSend?: (response: Response, data: any) => any;\n\n /**\n * Optional language code (default to `en-US`) that will be sent\n * with the requests to the server as `Accept-Language` header.\n */\n lang: string;\n\n /**\n * A replaceable instance of the local auth store service.\n */\n authStore: BaseAuthStore;\n\n /**\n * An instance of the service that handles the **Settings APIs**.\n */\n readonly settings: Settings;\n\n /**\n * An instance of the service that handles the **Admin APIs**.\n */\n readonly admins: Admins;\n\n /**\n * An instance of the service that handles the **User APIs**.\n */\n readonly users: Users;\n\n /**\n * An instance of the service that handles the **Collection APIs**.\n */\n readonly collections: Collections;\n\n /**\n * An instance of the service that handles the **Record APIs**.\n */\n readonly records: Records;\n\n /**\n * An instance of the service that handles the **Log APIs**.\n */\n readonly logs: Logs;\n\n /**\n * An instance of the service that handles the **Realtime APIs**.\n */\n readonly realtime: Realtime;\n\n private cancelControllers: { [key: string]: AbortController } = {}\n\n constructor(\n baseUrl = '/',\n lang = 'en-US',\n authStore?: BaseAuthStore | null,\n ) {\n this.baseUrl = baseUrl;\n this.lang = lang;\n this.authStore = authStore || new LocalAuthStore();\n\n // services\n this.admins = new Admins(this);\n this.users = new Users(this);\n this.records = new Records(this);\n this.collections = new Collections(this);\n this.logs = new Logs(this);\n this.settings = new Settings(this);\n this.realtime = new Realtime(this);\n }\n\n /**\n * @deprecated Legacy alias for `this.authStore`.\n */\n get AuthStore(): BaseAuthStore {\n return this.authStore;\n };\n\n /**\n * @deprecated Legacy alias for `this.settings`.\n */\n get Settings(): Settings {\n return this.settings;\n };\n\n /**\n * @deprecated Legacy alias for `this.admins`.\n */\n get Admins(): Admins {\n return this.admins;\n };\n\n /**\n * @deprecated Legacy alias for `this.users`.\n */\n get Users(): Users {\n return this.users;\n };\n\n /**\n * @deprecated Legacy alias for `this.collections`.\n */\n get Collections(): Collections {\n return this.collections;\n };\n\n /**\n * @deprecated Legacy alias for `this.records`.\n */\n get Records(): Records {\n return this.records;\n };\n\n /**\n * @deprecated Legacy alias for `this.logs`.\n */\n get Logs(): Logs {\n return this.logs;\n };\n\n /**\n * @deprecated Legacy alias for `this.realtime`.\n */\n get Realtime(): Realtime {\n return this.realtime;\n };\n\n /**\n * Cancels single request by its cancellation key.\n */\n cancelRequest(cancelKey: string): Client {\n if (this.cancelControllers[cancelKey]) {\n this.cancelControllers[cancelKey].abort();\n delete this.cancelControllers[cancelKey];\n }\n\n return this;\n }\n\n /**\n * Cancels all pending requests.\n */\n cancelAllRequests(): Client {\n for (let k in this.cancelControllers) {\n this.cancelControllers[k].abort();\n }\n\n this.cancelControllers = {};\n\n return this;\n }\n\n /**\n * Sends an api http request.\n */\n async send(path: string, reqConfig: { [key: string]: any }): Promise {\n let config = Object.assign({ method: 'GET' } as { [key: string]: any }, reqConfig);\n\n // serialize the body if needed and set the correct content type\n // note1: for FormData body the Content-Type header should be skipped\n // note2: we are checking the constructor name because FormData is not available natively in node\n if (config.body && config.body.constructor.name !== 'FormData') {\n if (typeof config.body !== 'string') {\n config.body = JSON.stringify(config.body);\n }\n\n // add the json header (if not already)\n if (typeof config?.headers?.['Content-Type'] === 'undefined') {\n config.headers = Object.assign({}, config.headers, {\n 'Content-Type': 'application/json',\n });\n }\n }\n\n // add Accept-Language header (if not already)\n if (typeof config?.headers?.['Accept-Language'] === 'undefined') {\n config.headers = Object.assign({}, config.headers, {\n 'Accept-Language': this.lang,\n });\n }\n\n // check if Authorization header can be added\n if (\n // has stored token\n this.authStore?.token &&\n // auth header is not explicitly set\n (typeof config?.headers?.Authorization === 'undefined')\n ) {\n let authType = 'Admin';\n if (typeof (this.authStore.model as any)?.verified !== 'undefined') {\n authType = 'User'; // admins don't have verified\n }\n\n config.headers = Object.assign({}, config.headers, {\n 'Authorization': (authType + ' ' + this.authStore.token),\n });\n }\n\n // handle auto cancelation for duplicated pending request\n if (config.params?.$autoCancel !== false) {\n const cancelKey = config.params?.$cancelKey || ((config.method || 'GET') + path);\n\n // cancel previous pending requests\n this.cancelRequest(cancelKey);\n\n const controller = new AbortController();\n this.cancelControllers[cancelKey] = controller;\n config.signal = controller.signal;\n }\n // remove the special cancellation params from the other valid query params\n delete config.params?.$autoCancel;\n delete config.params?.$cancelKey;\n\n // build url + path\n let url = this.buildUrl(path);\n\n // serialize the query parameters\n if (typeof config.params !== 'undefined') {\n const query = this.serializeQueryParams(config.params)\n if (query) {\n url += (url.includes('?') ? '&' : '?') + query;\n }\n delete config.params;\n }\n\n if (this.beforeSend) {\n config = Object.assign({}, this.beforeSend(url, config));\n }\n\n // send the request\n return fetch(url, config)\n .then(async (response) => {\n let data : any = {};\n\n try {\n data = await response.json();\n } catch (_) {\n // all api responses are expected to return json\n // with the exception of the realtime event and 204\n }\n\n if (this.afterSend) {\n data = this.afterSend(response, data);\n }\n\n if (response.status >= 400) {\n throw new ClientResponseError({\n url: response.url,\n status: response.status,\n data: data,\n });\n }\n\n return data;\n }).catch((err) => {\n // wrap to normalize all errors\n throw new ClientResponseError(err);\n });\n }\n\n /**\n * Builds a full client url by safely concatenating the provided path.\n */\n buildUrl(path: string): string {\n let url = this.baseUrl + (this.baseUrl.endsWith('/') ? '' : '/');\n if (path) {\n url += (path.startsWith('/') ? path.substring(1) : path);\n }\n return url;\n }\n\n /**\n * Serializes the provided query parameters into a query string.\n */\n private serializeQueryParams(params: {[key: string]: any}): string {\n const result: Array = [];\n for (const key in params) {\n if (params[key] === null) {\n // skip null query params\n continue;\n }\n\n const value = params[key];\n const encodedKey = encodeURIComponent(key);\n\n if (Array.isArray(value)) {\n // \"repeat\" array params\n for (const v of value) {\n result.push(encodedKey + \"=\" + encodeURIComponent(v));\n }\n } else if (value instanceof Date) {\n result.push(encodedKey + \"=\" + encodeURIComponent(value.toISOString()));\n } else if (typeof value !== null && typeof value === 'object') {\n result.push(encodedKey + \"=\" + encodeURIComponent(JSON.stringify(value)));\n } else {\n result.push(encodedKey + \"=\" + encodeURIComponent(value));\n }\n }\n\n return result.join('&');\n }\n}\n"],"names":["atobPolyfill","ClientResponseError","_super","errData","_this","this","call","url","status","data","isAbort","originalError","Object","setPrototypeOf","prototype","DOMException","name","message","_a","__extends","toJSON","__assign","Error","fieldContentRegExp","cookieSerialize","val","options","opt","assign","encode","defaultEncode","test","TypeError","value","result","maxAge","isNaN","isFinite","Math","floor","domain","path","expires","toString","Date","isDate","valueOf","toUTCString","httpOnly","secure","priority","toLowerCase","sameSite","defaultDecode","indexOf","decodeURIComponent","encodeURIComponent","getTokenPayload","token","base64","split","map","c","charCodeAt","slice","join","JSON","parse","e","atob","a","Buffer","from","BaseModel","load","id","created","updated","defineProperty","get","clone","constructor","stringify","export","Record","_i","entries","length","_b","key","User","email","verified","lastResetSentAt","lastVerificationSentAt","profile","Admin","avatar","BaseAuthStore","baseToken","baseModel","_onChangeCallbacks","expirationThreshold","payload","keys","exp","now","isTokenExpired","save","model","triggerChange","clear","loadFromCookie","cookie","rawData","str","decode","index","eqIdx","endIdx","lastIndexOf","trim","undefined","_","cookieParse","Array","isArray","exportToCookie","defaultOptions","resultLength","Blob","size","_c","onChange","callback","push","i","splice","LocalAuthStore","storageKey","storageFallback","_storageGet","_storageSet","_storageRemove","window","localStorage","rawValue","getItem","normalizedVal","setItem","removeItem","BaseService","client","Settings","getAll","queryParams","send","method","params","then","responseData","update","bodyParams","body","testS3","testEmail","toEmail","emailTemplate","template","ListResult","page","perPage","totalItems","totalPages","items","BaseCrudService","_getFullList","basePath","batchSize","request","__awaiter","_getList","list","castedList","concat","item","_getOne","_create","_update","_delete","CrudService","getFullList","baseCrudPath","getList","getOne","create","delete","Admins","authResponse","admin","authStore","authViaEmail","password","headers","Authorization","bind","refresh","requestPasswordReset","confirmPasswordReset","passwordResetToken","passwordConfirm","ExternalAuth","userId","provider","providerId","Users","user","listAuthMethods","emailPassword","authProviders","authViaOAuth2","code","codeVerifier","redirectUrl","requestVerification","confirmVerification","verificationToken","requestEmailChange","newEmail","confirmEmailChange","emailChangeToken","listExternalAuths","responseData_1","unlinkExternalAuth","SchemaField","type","system","required","unique","Collection","listRule","viewRule","createRule","updateRule","deleteRule","schema","field","Collections","import","collections","deleteMissing","Records","collectionIdOrName","getFileUrl","record","filename","parts","baseUrl","replace","URLSearchParams","includes","SubCrudService","sub","LogRequest","remoteIp","ip","auth","userIp","referer","userAgent","meta","Logs","getRequestsList","getRequest","getRequestsStats","Realtime","apply","arguments","clientId","eventSource","subscriptions","subscribe","subscription","removeEventListener","msgEvent","connect","submitSubscriptions","sent","unsubscribe","removeSubscriptionListeners","disconnect","addSubscriptionListeners","$autoCancel","addEventListener","connectHandler","lastEventId","EventSource","buildUrl","close","Client","lang","cancelControllers","admins","users","records","logs","settings","realtime","cancelRequest","cancelKey","abort","cancelAllRequests","k","reqConfig","config","_d","authType","_e","_f","_g","$cancelKey","controller","AbortController","signal","_h","_j","query","serializeQueryParams","beforeSend","fetch","response","json","afterSend","catch","err","endsWith","startsWith","substring","encodedKey","value_1","v","toISOString"],"mappings":"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"} \ No newline at end of file diff --git a/web_data/view/frontpage.html b/web_data/view/frontpage.html index 71f4b83..96163c4 100644 --- a/web_data/view/frontpage.html +++ b/web_data/view/frontpage.html @@ -1,72 +1,195 @@ {{define "frontpage.html"}} - - + - - - - VerySmart • Dog - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + very • smart + + + + + + + + + + - - -
-
- + + -
-
-
- - -

- Simple service for monitoring rss feeds by keywords with reposting in telegram -

- - + +
+
+ +
+
+ +
+
+

+ Our vision +

+

+ Feed readers are a bit noisy. Everyday we spend a lot of time looking for interesting article among a huge numbers of them. Our mission is to make a smart feed reader. Very smart.

+
+ +
+ + +
+ + + +
+

+ Designed for people +

+

+ We stay lean and help our product do one thing well. We actively pursue the right balance between functionality and aesthetics, creating delightful experiences. No ads, no third party trackers. +

+ + + +
+ + + + +
+

+ Mashine learning +

+

+ Highlights relevant articles among those sources to which you are subscribed. +

+
+
+ + + +
+ + + +
+

+ Telegram integration +

+

+ Tight integration with telegram for monitoring by tags and delayed reading. +

+
+
+ + + +
+ + + +
+

+ Free trial +

+

+ One month full featured access. No credit card required. Limited only by number of feeds (10). +

+
+
+ +
+ + +
+ -
- +
+

Pricelist

+ +

The project is currently in the active development. Price will be available later.

+
+ $36 per year, probably. +
+
+ + + + + + + + + {{end}} \ No newline at end of file diff --git a/web_data/view/top.html b/web_data/view/top.html index 884b8ce..31fe702 100644 --- a/web_data/view/top.html +++ b/web_data/view/top.html @@ -36,8 +36,6 @@ - - {{end}} \ No newline at end of file