Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

features around space members #19

Merged
merged 15 commits into from
Jun 17, 2024
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ coverage
test.sqlite
*.db
node_modules
.idea
2 changes: 1 addition & 1 deletion channel.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ChannelCreation, ChannelEdition, Kind_V2 } from "./events.ts";
import { ChannelCreation, ChannelEdition, Kind_V2 } from "./nostr.ts/nostr.ts";
import { DB, SqliteError } from "https://deno.land/x/[email protected]/mod.ts";

export type func_GetChannelByName = (
Expand Down
16 changes: 16 additions & 0 deletions deno.test.lock
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,24 @@
"https://deno.land/[email protected]/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536",
"https://deno.land/[email protected]/encoding/hex.ts": "b4e346619c0535a5db48d6bdb6e057c8d1179c64a2b0ba8d3b0b8a79ae361a90",
"https://deno.land/[email protected]/fmt/colors.ts": "c51c4642678eb690dcf5ffee5918b675bf01a33fba82acf303701ae1a4f8c8d9",
"https://deno.land/[email protected]/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975",
"https://deno.land/[email protected]/assert/_diff.ts": "4bf42969aa8b1a33aaf23eb8e478b011bfaa31b82d85d2ff4b5c4662d8780d2b",
"https://deno.land/[email protected]/assert/_format.ts": "0ba808961bf678437fb486b56405b6fefad2cf87b5809667c781ddee8c32aff4",
"https://deno.land/[email protected]/assert/assert_equals.ts": "4497c56fe7d2993b0d447926702802fc0becb44e319079e8eca39b482ee01b4e",
"https://deno.land/[email protected]/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8",
"https://deno.land/[email protected]/assert/equal.ts": "fae5e8a52a11d3ac694bbe1a53e13a7969e3f60791262312e91a3e741ae519e2",
"https://deno.land/[email protected]/fmt/colors.ts": "d239d84620b921ea520125d778947881f62c50e78deef2657073840b8af9559a",
"https://deno.land/[email protected]/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834",
"https://deno.land/[email protected]/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917",
"https://deno.land/[email protected]/datetime/_date_time_formatter.ts": "b810c4c0d8f7aafe765fb963efdbf704acceb0730f5b242a7ec46df37834307c",
"https://deno.land/[email protected]/datetime/constants.ts": "5df80a84e301da6db5793804122c034d2d090da31f1e1c5fdaa831fc70a45da7",
"https://deno.land/[email protected]/datetime/day_of_year.ts": "5e513e239bd473e86d6a869d154720e9b6b8c86e1f14330ed5bb97575d9fa07b",
"https://deno.land/[email protected]/datetime/difference.ts": "8da08374910cae7d316cd7669912b70465f36d4e159e2c9f525a441f91fa9c7a",
"https://deno.land/[email protected]/datetime/format.ts": "8a550406530533c4aba101d471695f7f96c0eae61c1346748708eb333290d5f8",
"https://deno.land/[email protected]/datetime/is_leap.ts": "77f6eb9a4b7ea2a2dedbfecf75fd0a3f8f0e1610f708480e692f401f29e72650",
"https://deno.land/[email protected]/datetime/mod.ts": "6a49163dd0c7986658ed425b3555da5312252e5f5156bced6ae7199e651aa83b",
"https://deno.land/[email protected]/datetime/parse.ts": "d6dea8b3e394908dfd016bbe4545f260da4032493294aee1d10a3cf194c191cb",
"https://deno.land/[email protected]/datetime/week_of_year.ts": "ecaff056953753db3dabc9a769f80ff7ea7be79ae1e34edb5e2bda336f685757",
"https://deno.land/[email protected]/http/cookie.ts": "a377fa60175ba5f61dd4b8a70b34f2bbfbc70782dfd5faf36d314c42e4306006",
"https://deno.land/x/[email protected]/deps.ts": "5696461c8bb42db7c83486db452e125f7cfdc62a2c628bb470a4447d934b90b3",
"https://deno.land/x/[email protected]/mod.ts": "57fd56de5f7cbc66e23ce896cc8e99521d286e89969d83e09d960642b0a9d652",
Expand Down
33 changes: 0 additions & 33 deletions events.ts

This file was deleted.

10 changes: 9 additions & 1 deletion graphql-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const typeDefs = gql`
relayInformation: RelayInformation
channel(name: String!): Channel
deleted_events: [String!]!
members: [String!]!
members: [SpaceMember!]!
bob2402 marked this conversation as resolved.
Show resolved Hide resolved
}

type Mutation {
Expand Down Expand Up @@ -73,4 +73,12 @@ export const typeDefs = gql`
version: String
icon: String
}
type SpaceMember {
id: String!
pubkey: String!
kind: String!
created_at: String!
member: String!
sig: String!
}
`;
72 changes: 51 additions & 21 deletions main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,45 +3,51 @@ import { func_IsMember, SubscriptionMap, ws_handler } from "./ws.ts";
import { render } from "https://esm.sh/[email protected]";
import { RootResolver } from "./resolvers/root.ts";
import * as gql from "https://esm.sh/[email protected]";
import { func_GetRelayMembers, Policy } from "./resolvers/policy.ts";
import { func_ResolvePolicyByKind } from "./resolvers/policy.ts";
import { PolicyStore } from "./resolvers/policy.ts";
import { Policies } from "./resolvers/policy.ts";
import {
add_space_member,
func_AddSpaceMember,
func_GetSpaceMembers,
func_IsSpaceMember,
func_ResolvePolicyByKind,
get_space_members,
is_space_member,
Policies,
Policy,
PolicyStore,
} from "./resolvers/policy.ts";
import {
event_schema_sqlite,
func_GetEventCount,
func_GetEventsByFilter,
func_WriteRegularEvent,
func_WriteReplaceableEvent,
get_event_count_sqlite,
get_events_by_filter_sqlite,
write_regular_event_sqlite,
write_replaceable_event_sqlite,
} from "./resolvers/event.ts";
import Landing from "./routes/landing.tsx";
import Error404 from "./routes/_404.tsx";
import { RelayInfomationBase, RelayInformation, RelayInformationStore } from "./resolvers/nip11.ts";
import { func_GetEventsByFilter, func_WriteRegularEvent } from "./resolvers/event.ts";
import { Cookie, getCookies, setCookie } from "https://deno.land/[email protected]/http/cookie.ts";
import { Event_V2, Kind_V2 } from "./events.ts";
import { Event_V2, Kind_V2, NostrEvent, NostrKind, verify_event_v2, verifyEvent } from "./nostr.ts/nostr.ts";
import {
create_channel_sqlite,
edit_channel_sqlite,
func_CreateChannel,
func_EditChannel,
func_GetChannelByID,
get_channel_by_id_sqlite,
sqlite_schema,
} from "./channel.ts";
import { func_GetChannelByID } from "./channel.ts";
import { DB } from "https://deno.land/x/[email protected]/mod.ts";
import { get_relay_members } from "./resolvers/policy.ts";
import { get_events_by_filter_sqlite } from "./resolvers/event.ts";
import { get_event_count_sqlite } from "./resolvers/event.ts";
import {
delete_event_sqlite,
func_DeleteEvent,
func_DeleteEventsFromPubkey,
func_GetDeletedEventIDs,
} from "./resolvers/event_deletion.ts";
import { delete_event_sqlite } from "./resolvers/event_deletion.ts";

import { NostrEvent, NostrKind, verify_event_v2, verifyEvent } from "./nostr.ts/nostr.ts";
import { PublicKey } from "./nostr.ts/key.ts";
import { InvalidKey, PublicKey } from "./nostr.ts/key.ts";
import { parseJSON } from "./nostr.ts/_helper.ts";

const schema = gql.buildSchema(gql.print(typeDefs));
Expand All @@ -55,7 +61,6 @@ export type Relay = {
ws_url: string;
http_url: string;
shutdown: () => Promise<void>;

get_event: (id: string) => Promise<NostrEvent | null>;
set_relay_information: (args: {
name?: string;
Expand All @@ -76,14 +81,17 @@ export type Relay = {
}) => Promise<Policy | Error>;
// channel
get_channel_by_id: func_GetChannelByID;
// space member
get_space_members: func_GetSpaceMembers;
is_space_member: func_IsSpaceMember;
[Symbol.asyncDispose]: () => Promise<void>;
};

export const ENV_relayed_pubkey = "relayed_pubkey";

export async function run(args: {
port?: number;
admin?: PublicKey;
admin?: PublicKey | string;
auth_required: boolean;
default_policy: DefaultPolicy;
default_information?: RelayInfomationBase;
Expand Down Expand Up @@ -122,6 +130,14 @@ export async function run(args: {
return p;
}
args.admin = p;
} else {
if (typeof args.admin == "string") {
const p = PublicKey.FromString(args.admin);
if (p instanceof Error) {
return new Error("invalid admin public key");
BlowaterNostr marked this conversation as resolved.
Show resolved Hide resolved
}
args.admin = p;
}
}
// Relay Key
// let system_key: string | PrivateKey | Error = args.system_key;
Expand Down Expand Up @@ -186,7 +202,10 @@ export async function run(args: {
write_replaceable_event,
policyStore,
relayInformationStore,
get_relay_members: get_relay_members(db),
// space member
get_space_members: get_space_members(db),
add_space_member: add_space_member(db),
// channel
create_channel: create_channel_sqlite(db),
edit_channel: edit_channel_sqlite(db),
kv: kv,
Expand Down Expand Up @@ -228,6 +247,9 @@ export async function run(args: {
get_channel_by_id: (id: string) => {
return get_channel_by_id(id);
},
// space member
get_space_members: get_space_members(db),
is_space_member: is_space_member({ admin: args.admin, db }),
[Symbol.asyncDispose]() {
return shutdown();
},
Expand Down Expand Up @@ -255,8 +277,9 @@ const root_handler = (
// write
write_regular_event: func_WriteRegularEvent;
write_replaceable_event: func_WriteReplaceableEvent;
// relay
get_relay_members: func_GetRelayMembers;
// space member
get_space_members: func_GetSpaceMembers;
add_space_member: func_AddSpaceMember;
// config
auth_required: boolean;
kv: Deno.Kv;
Expand Down Expand Up @@ -324,6 +347,7 @@ async (req: Request, info: Deno.ServeHandlerInfo) => {
}
const ok = await verify_event_v2(event);
if (!ok) {
console.error("event", event);
return new Response("event is not valid", { status: 400 });
}
if (event.kind == Kind_V2.ChannelCreation) {
Expand All @@ -339,6 +363,13 @@ async (req: Request, info: Deno.ServeHandlerInfo) => {
return new Response(res.message, { status: 400 });
}
return new Response();
} else if (event.kind == Kind_V2.SpaceMember) {
const res = await args.add_space_member(event);
if (res instanceof Error) {
console.error(res);
return new Response(res.message, { status: 400 });
}
return new Response();
} else {
return new Response(`not a recognizable event`, { status: 400 });
}
Expand All @@ -358,15 +389,14 @@ const graphql_handler = (
// get
get_events_by_filter: func_GetEventsByFilter;
get_event_count: func_GetEventCount;
get_space_members: func_GetSpaceMembers;
// write
write_regular_event: func_WriteRegularEvent;
write_replaceable_event: func_WriteReplaceableEvent;
// deletion
delete_event: func_DeleteEvent;
delete_events_from_pubkey: func_DeleteEventsFromPubkey;
get_deleted_event_ids: func_GetDeletedEventIDs;
// relay members
get_relay_members: func_GetRelayMembers;
// kv
kv: Deno.Kv;
},
Expand Down
2 changes: 1 addition & 1 deletion nostr.ts
56 changes: 39 additions & 17 deletions resolvers/policy.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DB } from "https://deno.land/x/[email protected]/mod.ts";
import { DefaultPolicy } from "../main.ts";
import { EventRelayMembers, Kind_V2 } from "../events.ts";
import { Kind_V2, SpaceMember } from "../nostr.ts/nostr.ts";
import { parseJSON } from "../nostr.ts/_helper.ts";
import { PublicKey } from "../nostr.ts/key.ts";
import { NostrKind } from "../nostr.ts/nostr.ts";
Expand Down Expand Up @@ -111,29 +111,51 @@ export class PolicyStore {
};
}

export type func_GetRelayMembers = () => Promise<undefined | EventRelayMembers | Error>;
export const get_relay_members = (db?: DB): func_GetRelayMembers => async () => {
export type func_GetSpaceMembers = () => Promise<SpaceMember[] | Error>;
export type func_AddSpaceMember = (event: SpaceMember) => Promise<void | Error>;
export type func_IsSpaceMember = (pubkey: string) => Promise<boolean | Error>;

export const get_space_members = (db?: DB): func_GetSpaceMembers => async () => {
if (!db) {
return new Error("get_relay_members is not supported");
return new Error("get_space_members is not supported");
}
const rows = db.query<[string]>(
"select event from events_v2 where kind = (?)",
[Kind_V2.RelayMember],
[Kind_V2.SpaceMember],
);

const events = [] as EventRelayMembers[];
const events = [] as SpaceMember[];
for (const row of rows) {
const relay_member_event = parseJSON<EventRelayMembers>(row[0]);
if (relay_member_event instanceof Error) {
return relay_member_event;
const space_member_event = parseJSON<SpaceMember>(row[0]);
if (space_member_event instanceof Error) {
return space_member_event;
}
events.push(relay_member_event);
}
if (events.length == 0) {
return;
events.push(space_member_event);
}
return events;
};

const event = events.sort((e1, e2) => e1.created_at - e2.created_at)[0];
console.log(event);
return event;
export const add_space_member = (db?: DB): func_AddSpaceMember => async (event: SpaceMember) => {
if (!db) {
return new Error("add_space_member is not supported");
}
db.query(
`INSERT INTO events_v2(id, pubkey, kind, event) VALUES (?, ?, ?, ?)`,
[event.id, event.pubkey, event.kind, JSON.stringify(event)],
);
};

export const is_space_member =
(args: { admin: PublicKey; db?: DB }): func_IsSpaceMember => async (pubkey: string) => {
if (args.admin.hex === pubkey) return true;

if (!args.db) {
return new Error("is_space_member is not supported");
}
const rows = args.db.query<[string]>(
BlowaterNostr marked this conversation as resolved.
Show resolved Hide resolved
"select event from events_v2 where kind = (?) and json_extract(event, '$.member') = (?)",
[Kind_V2.SpaceMember, pubkey],
);
console.log("rows", rows);
if (rows.length > 0) return true;
return false;
};
13 changes: 5 additions & 8 deletions resolvers/root.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { func_GetRelayMembers, PolicyStore } from "./policy.ts";
import { func_GetSpaceMembers, PolicyStore } from "./policy.ts";
import { Policies } from "./policy.ts";
import { RelayInformationStore } from "./nip11.ts";
import { func_GetEventCount } from "./event.ts";
Expand All @@ -10,10 +10,10 @@ export function RootResolver({ deps }: {
policyStore: PolicyStore;
relayInformationStore: RelayInformationStore;
get_event_count: func_GetEventCount;
get_space_members: func_GetSpaceMembers;
delete_event: func_DeleteEvent;
delete_events_from_pubkey: func_DeleteEventsFromPubkey;
get_deleted_event_ids: func_GetDeletedEventIDs;
get_relay_members: func_GetRelayMembers;
kv: Deno.Kv;
};
}) {
Expand All @@ -28,7 +28,7 @@ function Queries(deps: {
relayInformationStore: RelayInformationStore;
get_event_count: func_GetEventCount;
get_deleted_event_ids: func_GetDeletedEventIDs;
get_relay_members: func_GetRelayMembers;
get_space_members: func_GetSpaceMembers;
kv: Deno.Kv;
}) {
return {
Expand Down Expand Up @@ -60,15 +60,12 @@ function Queries(deps: {
return deps.get_deleted_event_ids();
},
members: async () => {
const members = await deps.get_relay_members();
const members = await deps.get_space_members();
if (members instanceof Error) {
console.error(members);
throw members;
}
if (members == undefined) {
return [];
}
return members.members;
return members;
},
};
}
Expand Down
Loading
Loading