SimpleCloudNotifier/scnserver/TODO.md

7.4 KiB

TODO

DO DO DO

  • app-store link in HTML

  • ios purchase verification

  • use goext.ginWrapper

  • use goext.exerr

UNSURE

  • (?) default-priority for channels

  • (?) "login" on website and list/search/filter messages

  • (?) make channels deleteable (soft-delete) (what do with messages in channel?)

  • (?) desktop client for notifications

  • (?) add querylog (similar to requestlog/errorlog) - only for main-db

  • (?) specify 'type' of message (debug, info, warn, error, fatal) -> distinct from priority

LATER

  • do i need bool2db()? it seems to work for keytokens without them?

  • We no longer have a route to reshuffle all keys (previously in updateUser), add a /user/:uid/keys/reset ? Would delete all existing keys and create 3 new ones?

  • error logging as goroutine, gets all errors via channel, (channel buffered - nonblocking send, second channel that gets a message when sender failed ) (then all errors end up in second sqlite table) due to message channel etc everything is non blocking and cant fail in main

  • => implement proper error logging in goext, kinda combines zerolog and wrapped-errors copy basic code from bringman, but remove all bm specific stuff and make it abstract Register(ErrType) methods, errtypes then as structs log.xxx package with same interface as zerolog

  • jobs to clear error-db to only keep X entries... (requests-db already exists)

  • route to re-check all pro-token (for me)

  • /send endpoint should be compatible with the [ webhook ] notifier of uptime-kuma (or add another /kuma endpoint) -> https://webhook.site/




{"heartbeat":{"monitorID":89,"status":0,"time":"2023-07-31 18:56:15.374","msg":"timeout of 16000ms exceeded","important":true,"duration":36,"timezone":"Europe/Berlin","timezoneOffset":"+02:00","localDateTime":"2023-07-31 20:56:15"},"monitor":{"id":89,"name":"test","description":null,"pathName":"test","parent":null,"childrenIDs":[],"url":"https://exampleXYZ.com","method":"GET","hostname":null,"port":null,"maxretries":1,"weight":2000,"active":true,"forceInactive":false,"type":"http","interval":20,"retryInterval":20,"resendInterval":0,"keyword":null,"expiryNotification":false,"ignoreTls":false,"upsideDown":false,"packetSize":56,"maxredirects":10,"accepted_statuscodes":["200-299"],"dns_resolve_type":"A","dns_resolve_server":"1.1.1.1","dns_last_result":null,"docker_container":"","docker_host":null,"proxyId":null,"notificationIDList":{"2":true},"tags":[],"maintenance":false,"mqttTopic":"","mqttSuccessMessage":"","databaseQuery":null,"authMethod":null,"grpcUrl":null,"grpcProtobuf":null,"grpcMethod":null,"grpcServiceName":null,"grpcEnableTls":false,"radiusCalledStationId":null,"radiusCallingStationId":null,"game":null,"httpBodyEncoding":"json","includeSensitiveData":false},"msg":"[test] [🔴 Down] timeout of 16000ms exceeded"}


=====================================================================================================================================================================================================


{
  "heartbeat": {
    "monitorID": 89,
    "status": 1,
    "time": "2023-07-31 18:56:57.151",
    "msg": "200 - OK",
    "ping": 55,
    "important": true,
    "duration": 41,
    "timezone": "Europe/Berlin",
    "timezoneOffset": "+02:00",
    "localDateTime": "2023-07-31 20:56:57"
  },
  "monitor": {
    "id": 89,
    "name": "test",
    "description": null,
    "pathName": "test",
    "parent": null,
    "childrenIDs": [],
    "url": "https://example.com",
    "method": "GET",
    "hostname": null,
    "port": null,
    "maxretries": 1,
    "weight": 2000,
    "active": true,
    "forceInactive": false,
    "type": "http",
    "interval": 20,
    "retryInterval": 20,
    "resendInterval": 0,
    "keyword": null,
    "expiryNotification": false,
    "ignoreTls": false,
    "upsideDown": false,
    "packetSize": 56,
    "maxredirects": 10,
    "accepted_statuscodes": [
      "200-299"
    ],
    "dns_resolve_type": "A",
    "dns_resolve_server": "1.1.1.1",
    "dns_last_result": null,
    "docker_container": "",
    "docker_host": null,
    "proxyId": null,
    "notificationIDList": {
      "2": true
    },
    "tags": [],
    "maintenance": false,
    "mqttTopic": "",
    "mqttSuccessMessage": "",
    "databaseQuery": null,
    "authMethod": null,
    "grpcUrl": null,
    "grpcProtobuf": null,
    "grpcMethod": null,
    "grpcServiceName": null,
    "grpcEnableTls": false,
    "radiusCalledStationId": null,
    "radiusCallingStationId": null,
    "game": null,
    "httpBodyEncoding": "json",
    "includeSensitiveData": false
  },
  "msg": "[test] [✅ Up] 200 - OK"
}


=====================================================================================================================================================================================================


{
  "heartbeat": {
    "monitorID": 89,
    "status": 0,
    "time": "2023-07-31 18:57:44.037",
    "msg": "getaddrinfo ENOTFOUND exampleasdsda.com",
    "important": true,
    "duration": 20,
    "timezone": "Europe/Berlin",
    "timezoneOffset": "+02:00",
    "localDateTime": "2023-07-31 20:57:44"
  },
  "monitor": {
    "id": 89,
    "name": "test",
    "description": null,
    "pathName": "test",
    "parent": null,
    "childrenIDs": [],
    "url": "https://exampleasdsda.com",
    "method": "GET",
    "hostname": null,
    "port": null,
    "maxretries": 1,
    "weight": 2000,
    "active": true,
    "forceInactive": false,
    "type": "http",
    "interval": 20,
    "retryInterval": 20,
    "resendInterval": 0,
    "keyword": null,
    "expiryNotification": false,
    "ignoreTls": false,
    "upsideDown": false,
    "packetSize": 56,
    "maxredirects": 10,
    "accepted_statuscodes": [
      "200-299"
    ],
    "dns_resolve_type": "A",
    "dns_resolve_server": "1.1.1.1",
    "dns_last_result": null,
    "docker_container": "",
    "docker_host": null,
    "proxyId": null,
    "notificationIDList": {
      "2": true
    },
    "tags": [],
    "maintenance": false,
    "mqttTopic": "",
    "mqttSuccessMessage": "",
    "databaseQuery": null,
    "authMethod": null,
    "grpcUrl": null,
    "grpcProtobuf": null,
    "grpcMethod": null,
    "grpcServiceName": null,
    "grpcEnableTls": false,
    "radiusCalledStationId": null,
    "radiusCallingStationId": null,
    "game": null,
    "httpBodyEncoding": "json",
    "includeSensitiveData": false
  },
  "msg": "[test] [🔴 Down] getaddrinfo ENOTFOUND exampleasdsda.com"
}

  • endpoint to list all servernames of user (distinct select)

  • weblogin, webapp, ...

  • Pagination for ListChannels / ListSubscriptions / ListClients / ListChannelSubscriptions / ListUserSubscriptions

  • Use only single struct for DB|Model|JSON

    • needs sq.Converter implementation
    • needs to handle joined data
    • rfctime.Time...
  • use job superclass (copy from isi/bnet/?), reduce duplicate code

  • admin panel (especially errors and requests)

  • cli app (?)

FUTURE

  • Remove compat, especially do not create compat id for every new message...