Fix: fix anonymous reviews; fix #1868
This commit is contained in:
parent
6950bda35e
commit
073cd692e4
3 changed files with 41 additions and 34 deletions
|
@ -6,32 +6,30 @@ import { GeoOperations } from "../GeoOperations"
|
||||||
import ScriptUtils from "../../../scripts/ScriptUtils"
|
import ScriptUtils from "../../../scripts/ScriptUtils"
|
||||||
|
|
||||||
export class MangroveIdentity {
|
export class MangroveIdentity {
|
||||||
private readonly keypair: Store<CryptoKeyPair>
|
private readonly keypair: UIEventSource<CryptoKeyPair> = new UIEventSource<CryptoKeyPair>(undefined)
|
||||||
/**
|
/**
|
||||||
* Same as the one in the user settings
|
* Same as the one in the user settings
|
||||||
*/
|
*/
|
||||||
public readonly mangroveIdentity: UIEventSource<string>
|
public readonly mangroveIdentity: UIEventSource<string>
|
||||||
private readonly key_id: Store<string>
|
private readonly key_id: UIEventSource<string> = new UIEventSource<string>(undefined)
|
||||||
private readonly _mangroveIdentityCreationDate: UIEventSource<string>
|
private readonly _mangroveIdentityCreationDate: UIEventSource<string>
|
||||||
|
|
||||||
constructor(mangroveIdentity: UIEventSource<string>, mangroveIdentityCreationDate: UIEventSource<string>) {
|
constructor(mangroveIdentity: UIEventSource<string>, mangroveIdentityCreationDate: UIEventSource<string>) {
|
||||||
this.mangroveIdentity = mangroveIdentity
|
this.mangroveIdentity = mangroveIdentity
|
||||||
this._mangroveIdentityCreationDate = mangroveIdentityCreationDate
|
this._mangroveIdentityCreationDate = mangroveIdentityCreationDate
|
||||||
const key_id = new UIEventSource<string>(undefined)
|
|
||||||
this.key_id = key_id
|
|
||||||
const keypairEventSource = new UIEventSource<CryptoKeyPair>(undefined)
|
|
||||||
this.keypair = keypairEventSource
|
|
||||||
mangroveIdentity.addCallbackAndRunD(async (data) => {
|
mangroveIdentity.addCallbackAndRunD(async (data) => {
|
||||||
if (!data) {
|
await this.setKeypair(data)
|
||||||
return
|
|
||||||
}
|
|
||||||
const keypair = await MangroveReviews.jwkToKeypair(JSON.parse(data))
|
|
||||||
keypairEventSource.setData(keypair)
|
|
||||||
const pem = await MangroveReviews.publicToPem(keypair.publicKey)
|
|
||||||
key_id.setData(pem)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async setKeypair(data: string){
|
||||||
|
console.log("Setting keypair from",data)
|
||||||
|
const keypair = await MangroveReviews.jwkToKeypair(JSON.parse(data))
|
||||||
|
this.keypair.setData(keypair)
|
||||||
|
const pem = await MangroveReviews.publicToPem(keypair.publicKey)
|
||||||
|
this.key_id.setData(pem)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an identity if none exists already.
|
* Creates an identity if none exists already.
|
||||||
* Is written into the UIEventsource, which was passed into the constructor
|
* Is written into the UIEventsource, which was passed into the constructor
|
||||||
|
@ -44,7 +42,9 @@ export class MangroveIdentity {
|
||||||
// Identity has been loaded via osmPreferences by now - we don't overwrite
|
// Identity has been loaded via osmPreferences by now - we don't overwrite
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
console.log("Creating a new Mangrove identity!")
|
this.keypair.setData(keypair)
|
||||||
|
const pem = await MangroveReviews.publicToPem(keypair.publicKey)
|
||||||
|
this.key_id.setData(pem)
|
||||||
this.mangroveIdentity.setData(JSON.stringify(jwk))
|
this.mangroveIdentity.setData(JSON.stringify(jwk))
|
||||||
this._mangroveIdentityCreationDate.setData(new Date().toISOString())
|
this._mangroveIdentityCreationDate.setData(new Date().toISOString())
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ export class MangroveIdentity {
|
||||||
* Only called to create a review.
|
* Only called to create a review.
|
||||||
*/
|
*/
|
||||||
async getKeypair(): Promise<CryptoKeyPair> {
|
async getKeypair(): Promise<CryptoKeyPair> {
|
||||||
if (this.keypair.data ?? "" === "") {
|
if (this.keypair.data === undefined) {
|
||||||
// We want to create a review, but it seems like no key has been setup at this moment
|
// We want to create a review, but it seems like no key has been setup at this moment
|
||||||
// We create the key
|
// We create the key
|
||||||
try {
|
try {
|
||||||
|
@ -79,10 +79,10 @@ export class MangroveIdentity {
|
||||||
const all = this.getAllReviews()
|
const all = this.getAllReviews()
|
||||||
this.geoReviewsById = this.getAllReviews().mapD(reviews => reviews.filter(
|
this.geoReviewsById = this.getAllReviews().mapD(reviews => reviews.filter(
|
||||||
review => {
|
review => {
|
||||||
try{
|
try {
|
||||||
const subjectUrl = new URL(review.sub)
|
const subjectUrl = new URL(review.sub)
|
||||||
return subjectUrl.protocol === "geo:"
|
return subjectUrl.protocol === "geo:"
|
||||||
}catch (e) {
|
} catch (e) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,6 +146,7 @@ export default class FeatureReviews {
|
||||||
private readonly _uncertainty: number
|
private readonly _uncertainty: number
|
||||||
private readonly _name: Store<string>
|
private readonly _name: Store<string>
|
||||||
private readonly _identity: MangroveIdentity
|
private readonly _identity: MangroveIdentity
|
||||||
|
private readonly _testmode: Store<boolean>
|
||||||
|
|
||||||
private constructor(
|
private constructor(
|
||||||
feature: Feature,
|
feature: Feature,
|
||||||
|
@ -155,11 +156,13 @@ export default class FeatureReviews {
|
||||||
nameKey?: "name" | string
|
nameKey?: "name" | string
|
||||||
fallbackName?: string
|
fallbackName?: string
|
||||||
uncertaintyRadius?: number
|
uncertaintyRadius?: number
|
||||||
}
|
},
|
||||||
|
testmode?: Store<boolean>
|
||||||
) {
|
) {
|
||||||
const centerLonLat = GeoOperations.centerpointCoordinates(feature)
|
const centerLonLat = GeoOperations.centerpointCoordinates(feature)
|
||||||
;[this._lon, this._lat] = centerLonLat
|
;[this._lon, this._lat] = centerLonLat
|
||||||
this._identity = mangroveIdentity
|
this._identity = mangroveIdentity
|
||||||
|
this._testmode = testmode ?? new ImmutableStore(false)
|
||||||
const nameKey = options?.nameKey ?? "name"
|
const nameKey = options?.nameKey ?? "name"
|
||||||
|
|
||||||
if (feature.geometry.type === "Point") {
|
if (feature.geometry.type === "Point") {
|
||||||
|
@ -231,19 +234,20 @@ export default class FeatureReviews {
|
||||||
public static construct(
|
public static construct(
|
||||||
feature: Feature,
|
feature: Feature,
|
||||||
tagsSource: UIEventSource<Record<string, string>>,
|
tagsSource: UIEventSource<Record<string, string>>,
|
||||||
mangroveIdentity?: MangroveIdentity,
|
mangroveIdentity: MangroveIdentity,
|
||||||
options?: {
|
options: {
|
||||||
nameKey?: "name" | string
|
nameKey?: "name" | string
|
||||||
fallbackName?: string
|
fallbackName?: string
|
||||||
uncertaintyRadius?: number
|
uncertaintyRadius?: number
|
||||||
}
|
},
|
||||||
) {
|
testmode: Store<boolean>
|
||||||
|
): FeatureReviews {
|
||||||
const key = feature.properties.id
|
const key = feature.properties.id
|
||||||
const cached = FeatureReviews._featureReviewsCache[key]
|
const cached = FeatureReviews._featureReviewsCache[key]
|
||||||
if (cached !== undefined) {
|
if (cached !== undefined) {
|
||||||
return cached
|
return cached
|
||||||
}
|
}
|
||||||
const featureReviews = new FeatureReviews(feature, tagsSource, mangroveIdentity, options)
|
const featureReviews = new FeatureReviews(feature, tagsSource, mangroveIdentity, options,testmode )
|
||||||
FeatureReviews._featureReviewsCache[key] = featureReviews
|
FeatureReviews._featureReviewsCache[key] = featureReviews
|
||||||
return featureReviews
|
return featureReviews
|
||||||
}
|
}
|
||||||
|
@ -269,7 +273,12 @@ export default class FeatureReviews {
|
||||||
const keypair: CryptoKeyPair = await this._identity.getKeypair()
|
const keypair: CryptoKeyPair = await this._identity.getKeypair()
|
||||||
const jwt = await MangroveReviews.signReview(keypair, r)
|
const jwt = await MangroveReviews.signReview(keypair, r)
|
||||||
const kid = await MangroveReviews.publicToPem(keypair.publicKey)
|
const kid = await MangroveReviews.publicToPem(keypair.publicKey)
|
||||||
|
if (!this._testmode.data) {
|
||||||
await MangroveReviews.submitReview(jwt)
|
await MangroveReviews.submitReview(jwt)
|
||||||
|
} else {
|
||||||
|
console.log("Testmode enabled - not uploading review")
|
||||||
|
await Utils.waitFor(1000)
|
||||||
|
}
|
||||||
const reviewWithKid = {
|
const reviewWithKid = {
|
||||||
...r,
|
...r,
|
||||||
kid,
|
kid,
|
||||||
|
|
|
@ -61,17 +61,12 @@
|
||||||
opinion: opinion.data,
|
opinion: opinion.data,
|
||||||
metadata: { nickname, is_affiliated: isAffiliated.data },
|
metadata: { nickname, is_affiliated: isAffiliated.data },
|
||||||
}
|
}
|
||||||
if (state.featureSwitchIsTesting?.data ?? true) {
|
|
||||||
console.log("Testing - not actually saving review", review)
|
|
||||||
await Utils.waitFor(1000)
|
|
||||||
} else {
|
|
||||||
try {
|
try {
|
||||||
await reviews.createReview(review)
|
await reviews.createReview(review)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Could not create review due to", e)
|
console.error("Could not create review due to", e)
|
||||||
uploadFailed = "" + e
|
uploadFailed = "" + e
|
||||||
}
|
}
|
||||||
}
|
|
||||||
_state = "done"
|
_state = "done"
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -667,7 +667,8 @@ export default class SpecialVisualizations {
|
||||||
{
|
{
|
||||||
nameKey: nameKey,
|
nameKey: nameKey,
|
||||||
fallbackName,
|
fallbackName,
|
||||||
}
|
},
|
||||||
|
state.featureSwitchIsTesting
|
||||||
)
|
)
|
||||||
return new SvelteUIElement(StarsBarIcon, {
|
return new SvelteUIElement(StarsBarIcon, {
|
||||||
score: reviews.average,
|
score: reviews.average,
|
||||||
|
@ -700,7 +701,8 @@ export default class SpecialVisualizations {
|
||||||
{
|
{
|
||||||
nameKey: nameKey,
|
nameKey: nameKey,
|
||||||
fallbackName,
|
fallbackName,
|
||||||
}
|
},
|
||||||
|
state.featureSwitchIsTesting
|
||||||
)
|
)
|
||||||
return new SvelteUIElement(ReviewForm, { reviews, state, tags, feature, layer })
|
return new SvelteUIElement(ReviewForm, { reviews, state, tags, feature, layer })
|
||||||
},
|
},
|
||||||
|
@ -732,7 +734,8 @@ export default class SpecialVisualizations {
|
||||||
{
|
{
|
||||||
nameKey: nameKey,
|
nameKey: nameKey,
|
||||||
fallbackName,
|
fallbackName,
|
||||||
}
|
},
|
||||||
|
state.featureSwitchIsTesting
|
||||||
)
|
)
|
||||||
return new SvelteUIElement(AllReviews, { reviews, state, tags, feature, layer })
|
return new SvelteUIElement(AllReviews, { reviews, state, tags, feature, layer })
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue