fix reference fetching and rename request_note to request_event.

pull/2/head
fiatjaf 2020-12-07 09:34:25 -03:00
rodzic 7f8c28de0f
commit d39c1fc252
5 zmienionych plików z 33 dodań i 12 usunięć

Wyświetl plik

@ -36,8 +36,8 @@ Basic protocol flow description
Upon receiving this, the relay MUST return in the same SSE stream previously opened identified by the given _session id_ recent past events from all the pubkeys it may be watching on behalf of the that SSE stream. Events triggered by this call MUST have their SSE type set to `p`.
- `POST /request_user?session=<session id>` with body `{"pubkey": ..., "limit": 50, "offset": 0}`
Upon receiving this, the relay MUST return in the same SSE stream previously opened identified by the given _session id_ recent past events from the specified user, including a `set_metadata` event if the relay has it. Events triggered by this call MUST have their SSE type set to `r`.
- `POST /request_note?session=<session id>` with body `{"id": ..., "limit": 10}`
Same as above, but instead the relay returns the specified `text_note` and/or related notes it has (notes that reference it or notes that it references). Events triggered by this call MUST have their SSE type set to `r`.
- `POST /request_event?session=<session id>` with body `{"id": ..., "limit": 10}`
Same as above, but instead the relay returns the specified event and/or related events it has (events that reference it or events that it references). Events triggered by this call MUST have their SSE type set to `r`.
The `limit` and `offset` parameters are optional. When they're not specified the relay is free to use any defaults it want. If `limit` is specified the relay MUST use any number equal or smaller than `limit`, never greater. If `offset` is specified the relay must use it too, and if `offset` is too big for the relay it can just do as if no events were found at that range.

Wyświetl plik

@ -219,7 +219,7 @@ func requestUser(w http.ResponseWriter, r *http.Request) {
SELECT * FROM event
WHERE pubkey = $1 AND kind != 0
ORDER BY created_at DESC
LIMIT $1 OFFSET $2
LIMIT $2 OFFSET $3
`, data.PubKey, data.Limit, data.Offset); err == nil {
for _, evt := range lastUpdates {
jevent, _ := json.Marshal(evt)
@ -233,7 +233,7 @@ func requestUser(w http.ResponseWriter, r *http.Request) {
}()
}
func requestNote(w http.ResponseWriter, r *http.Request) {
func requestEvent(w http.ResponseWriter, r *http.Request) {
es := grabNamedSession(r.URL.Query().Get("session"))
if es == nil {
w.WriteHeader(400)
@ -254,37 +254,53 @@ func requestNote(w http.ResponseWriter, r *http.Request) {
}
go func() {
// get requested event
var evt Event
if err := db.Get(&evt, `
SELECT * FROM event WHERE id = $1
`, data.Id); err == nil {
jevent, _ := json.Marshal(evt)
(*es).SendEventMessage(string(jevent), "r", "")
} else if err != sql.ErrNoRows {
log.Warn().Err(err).
Str("key", data.Id).
Msg("error fetching a specific event")
}
if evt.Ref == "" {
return
}
// get referenced event
var ref Event
if err := db.Get(&ref, `
SELECT * FROM event WHERE id = $1
`, evt.Ref); err == nil {
jevent, _ := json.Marshal(ref)
(*es).SendEventMessage(string(jevent), "r", "")
} else if err != sql.ErrNoRows {
log.Warn().Err(err).
Str("key", data.Id).Str("ref", evt.Ref).
Msg("error fetching a referenced event")
}
}()
go func() {
// get events that reference this
var related []Event
if err := db.Select(`
SELECT * FROM event WHERE ref = $1
if err := db.Select(&related, `
SELECT * FROM event
WHERE ref = $1
LIMIT $2
`, data.Id, data.Limit); err == nil {
for _, evt := range related {
jevent, _ := json.Marshal(evt)
(*es).SendEventMessage(string(jevent), "r", "")
}
} else if err != sql.ErrNoRows {
log.Warn().Err(err).
Str("key", data.Id).
Msg("error fetching events that reference requested event")
}
}()
}

Wyświetl plik

@ -44,7 +44,7 @@ func main() {
router.Path("/request_watch").Methods("POST").HandlerFunc(requestWatchKeys)
router.Path("/request_unwatch").Methods("POST").HandlerFunc(requestUnwatchKeys)
router.Path("/request_user").Methods("POST").HandlerFunc(requestUser)
router.Path("/request_note").Methods("POST").HandlerFunc(requestNote)
router.Path("/request_event").Methods("POST").HandlerFunc(requestEvent)
// extra?
router.Path("/query_users").Methods("GET").HandlerFunc(queryUsers)

Wyświetl plik

@ -104,7 +104,7 @@
},
mounted() {
if (!this.note) {
this.$store.dispatch('browseNote', this.$route.params.id)
this.$store.dispatch('browseEvent', this.$route.params.id)
}
}
}

Wyświetl plik

@ -1,7 +1,12 @@
// vuex store actions
import {verifySignature, publishEvent, broadcastEvent} from './helpers'
import {CONTEXT_NOW, KIND_METADATA, KIND_TEXTNOTE, KIND_RECOMMENDSERVER} from './constants'
import {
CONTEXT_NOW,
KIND_METADATA,
KIND_TEXTNOTE,
KIND_RECOMMENDSERVER
} from './constants'
import {db} from './globals'
export default {
@ -90,11 +95,11 @@ export default {
})
}
},
async browseNote(store, id) {
async browseEvent(store, id) {
await store.state.haveEventSource
for (let i = 0; i < store.getters.readServers.length; i++) {
let host = store.getters.readServers[i]
window.fetch(host + '/request_note?session=' + store.state.session, {
window.fetch(host + '/request_event?session=' + store.state.session, {
method: 'POST',
headers: {'content-type': 'application/json'},
body: JSON.stringify({id})
@ -123,7 +128,7 @@ export default {
{
pubkey: store.getters.pubKeyHex,
created_at: Math.round(new Date().getTime() / 1000),
reference,
ref: reference,
kind: KIND_TEXTNOTE,
content: text.trim()
},