@powerhousedao/renown-package 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/document-models/renown-credential/gen/document-model.js +96 -10
- package/dist/document-models/renown-credential/gen/manager/actions.d.ts +14 -2
- package/dist/document-models/renown-credential/gen/manager/creators.d.ts +5 -2
- package/dist/document-models/renown-credential/gen/manager/creators.js +4 -1
- package/dist/document-models/renown-credential/gen/manager/error.d.ts +45 -1
- package/dist/document-models/renown-credential/gen/manager/error.js +53 -1
- package/dist/document-models/renown-credential/gen/manager/object.d.ts +5 -2
- package/dist/document-models/renown-credential/gen/manager/object.js +10 -1
- package/dist/document-models/renown-credential/gen/manager/operations.d.ts +4 -1
- package/dist/document-models/renown-credential/gen/object.d.ts +1 -1
- package/dist/document-models/renown-credential/gen/ph-factories.js +11 -5
- package/dist/document-models/renown-credential/gen/reducer.d.ts +1 -1
- package/dist/document-models/renown-credential/gen/reducer.js +12 -0
- package/dist/document-models/renown-credential/gen/schema/types.d.ts +43 -12
- package/dist/document-models/renown-credential/gen/schema/zod.d.ts +5 -1
- package/dist/document-models/renown-credential/gen/schema/zod.js +48 -10
- package/dist/document-models/renown-credential/gen/utils.d.ts +1 -1
- package/dist/document-models/renown-credential/gen/utils.js +11 -5
- package/dist/document-models/renown-credential/index.d.ts +3 -0
- package/dist/document-models/renown-credential/src/reducers/manager.js +69 -15
- package/dist/document-models/renown-user/gen/object.d.ts +1 -1
- package/dist/document-models/renown-user/gen/profile/object.d.ts +1 -1
- package/dist/document-models/renown-user/gen/reducer.d.ts +1 -1
- package/dist/document-models/renown-user/gen/utils.d.ts +1 -1
- package/dist/processors/index.d.ts +1 -0
- package/dist/processors/index.js +1 -0
- package/dist/processors/renown-credential/index.d.ts +9 -0
- package/dist/processors/renown-credential/index.js +129 -0
- package/dist/processors/renown-credential/migrations.d.ts +3 -0
- package/dist/processors/renown-credential/migrations.js +77 -0
- package/dist/processors/renown-credential/schema.d.ts +27 -0
- package/dist/processors/renown-credential/schema.js +1 -0
- package/dist/processors/renown-user/migrations.js +2 -2
- package/dist/style.css +18 -12
- package/dist/subgraphs/renown-credential/resolvers.js +36 -0
- package/dist/subgraphs/renown-credential/schema.js +62 -12
- package/dist/subgraphs/renown-read-model/resolvers.js +122 -3
- package/dist/subgraphs/renown-read-model/schema.js +61 -2
- package/package.json +33 -2
|
@@ -3,14 +3,34 @@ export const schema = gql `
|
|
|
3
3
|
"""
|
|
4
4
|
Subgraph definition for RenownCredential (renown/credential)
|
|
5
5
|
"""
|
|
6
|
+
type CredentialStatus {
|
|
7
|
+
id: String!
|
|
8
|
+
type: String!
|
|
9
|
+
statusPurpose: String!
|
|
10
|
+
statusListIndex: String!
|
|
11
|
+
statusListCredential: String!
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
type RenownCredentialState {
|
|
7
|
-
"
|
|
15
|
+
"W3C VC Required Fields"
|
|
16
|
+
context: [String!]!
|
|
17
|
+
id: String
|
|
18
|
+
type: [String!]!
|
|
19
|
+
issuer: String!
|
|
20
|
+
issuanceDate: DateTime!
|
|
21
|
+
credentialSubject: String!
|
|
22
|
+
|
|
23
|
+
"W3C VC Optional Fields"
|
|
24
|
+
expirationDate: DateTime
|
|
25
|
+
credentialStatus: CredentialStatus
|
|
26
|
+
|
|
27
|
+
"JWT Representation"
|
|
8
28
|
jwt: String
|
|
29
|
+
|
|
30
|
+
"Revocation tracking"
|
|
9
31
|
revoked: Boolean
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
audience: String
|
|
13
|
-
payload: String
|
|
32
|
+
revokedAt: DateTime
|
|
33
|
+
revocationReason: String
|
|
14
34
|
}
|
|
15
35
|
|
|
16
36
|
"""
|
|
@@ -41,20 +61,50 @@ export const schema = gql `
|
|
|
41
61
|
docId: PHID
|
|
42
62
|
input: RenownCredential_RevokeInput
|
|
43
63
|
): Int
|
|
64
|
+
RenownCredential_updateCredentialSubject(
|
|
65
|
+
driveId: String
|
|
66
|
+
docId: PHID
|
|
67
|
+
input: RenownCredential_UpdateCredentialSubjectInput
|
|
68
|
+
): Int
|
|
69
|
+
RenownCredential_setJwt(
|
|
70
|
+
driveId: String
|
|
71
|
+
docId: PHID
|
|
72
|
+
input: RenownCredential_SetJwtInput
|
|
73
|
+
): Int
|
|
74
|
+
RenownCredential_setCredentialStatus(
|
|
75
|
+
driveId: String
|
|
76
|
+
docId: PHID
|
|
77
|
+
input: RenownCredential_SetCredentialStatusInput
|
|
78
|
+
): Int
|
|
44
79
|
}
|
|
45
80
|
|
|
46
81
|
"""
|
|
47
82
|
Module: Manager
|
|
48
83
|
"""
|
|
49
84
|
input RenownCredential_InitInput {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
85
|
+
context: [String!]
|
|
86
|
+
id: String
|
|
87
|
+
type: [String!]
|
|
88
|
+
issuer: String!
|
|
89
|
+
issuanceDate: DateTime!
|
|
90
|
+
credentialSubject: String!
|
|
91
|
+
expirationDate: DateTime
|
|
56
92
|
}
|
|
57
93
|
input RenownCredential_RevokeInput {
|
|
58
|
-
|
|
94
|
+
revokedAt: DateTime!
|
|
95
|
+
reason: String
|
|
96
|
+
}
|
|
97
|
+
input RenownCredential_UpdateCredentialSubjectInput {
|
|
98
|
+
credentialSubject: String!
|
|
99
|
+
}
|
|
100
|
+
input RenownCredential_SetJwtInput {
|
|
101
|
+
jwt: String!
|
|
102
|
+
}
|
|
103
|
+
input RenownCredential_SetCredentialStatusInput {
|
|
104
|
+
statusId: String!
|
|
105
|
+
statusType: String!
|
|
106
|
+
statusPurpose: String!
|
|
107
|
+
statusListIndex: String!
|
|
108
|
+
statusListCredential: String!
|
|
59
109
|
}
|
|
60
110
|
`;
|
|
@@ -1,9 +1,128 @@
|
|
|
1
|
+
import { RenownUserProcessor } from "../../processors/renown-user/index.js";
|
|
2
|
+
import { RenownCredentialProcessor } from "../../processors/renown-credential/index.js";
|
|
3
|
+
const mapToUser = (user) => ({
|
|
4
|
+
documentId: user.document_id,
|
|
5
|
+
username: user.username,
|
|
6
|
+
ethAddress: user.eth_address,
|
|
7
|
+
userImage: user.user_image,
|
|
8
|
+
createdAt: user.created_at,
|
|
9
|
+
updatedAt: user.updated_at,
|
|
10
|
+
});
|
|
11
|
+
const mapToCredential = (credential) => ({
|
|
12
|
+
documentId: credential.document_id,
|
|
13
|
+
credentialId: credential.credential_id,
|
|
14
|
+
context: JSON.parse(credential.context),
|
|
15
|
+
type: JSON.parse(credential.type),
|
|
16
|
+
issuer: credential.issuer,
|
|
17
|
+
issuanceDate: credential.issuance_date,
|
|
18
|
+
credentialSubject: credential.credential_subject,
|
|
19
|
+
expirationDate: credential.expiration_date,
|
|
20
|
+
credentialStatus: credential.credential_status_id &&
|
|
21
|
+
credential.credential_status_type &&
|
|
22
|
+
credential.credential_status_purpose &&
|
|
23
|
+
credential.credential_status_list_index &&
|
|
24
|
+
credential.credential_status_list_credential
|
|
25
|
+
? {
|
|
26
|
+
id: credential.credential_status_id,
|
|
27
|
+
type: credential.credential_status_type,
|
|
28
|
+
statusPurpose: credential.credential_status_purpose,
|
|
29
|
+
statusListIndex: credential.credential_status_list_index,
|
|
30
|
+
statusListCredential: credential.credential_status_list_credential,
|
|
31
|
+
}
|
|
32
|
+
: null,
|
|
33
|
+
jwt: credential.jwt,
|
|
34
|
+
revoked: credential.revoked,
|
|
35
|
+
revokedAt: credential.revoked_at,
|
|
36
|
+
revocationReason: credential.revocation_reason,
|
|
37
|
+
createdAt: credential.created_at,
|
|
38
|
+
updatedAt: credential.updated_at,
|
|
39
|
+
});
|
|
40
|
+
const getDriveId = (driveId) => {
|
|
41
|
+
const resolvedDriveId = driveId || process.env.RENOWN_PROFILES_DRIVE_ID;
|
|
42
|
+
if (!resolvedDriveId) {
|
|
43
|
+
throw new Error("Drive ID is required. Provide it in the input or set RENOWN_PROFILES_DRIVE_ID environment variable.");
|
|
44
|
+
}
|
|
45
|
+
return resolvedDriveId;
|
|
46
|
+
};
|
|
1
47
|
export const getResolvers = (subgraph) => {
|
|
2
|
-
const
|
|
48
|
+
const db = subgraph.relationalDb;
|
|
3
49
|
return {
|
|
4
50
|
Query: {
|
|
5
|
-
|
|
6
|
-
|
|
51
|
+
renownUser: async (parent, args) => {
|
|
52
|
+
const { driveId, phid, ethAddress, username } = args.input;
|
|
53
|
+
const resolvedDriveId = getDriveId(driveId);
|
|
54
|
+
let query = RenownUserProcessor.query(resolvedDriveId, db).selectFrom("renown_user");
|
|
55
|
+
// Priority: phid > ethAddress > username
|
|
56
|
+
if (phid) {
|
|
57
|
+
query = query.where("renown_user.document_id", "=", phid);
|
|
58
|
+
}
|
|
59
|
+
else if (ethAddress) {
|
|
60
|
+
query = query.where("renown_user.eth_address", "=", ethAddress);
|
|
61
|
+
}
|
|
62
|
+
else if (username) {
|
|
63
|
+
query = query.where("renown_user.username", "=", username);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error("At least one of phid, ethAddress, or username must be provided");
|
|
67
|
+
}
|
|
68
|
+
const result = await query.selectAll().executeTakeFirst();
|
|
69
|
+
return result ? mapToUser(result) : null;
|
|
70
|
+
},
|
|
71
|
+
renownUsers: async (parent, args) => {
|
|
72
|
+
const { driveId, phids, ethAddresses, usernames } = args.input;
|
|
73
|
+
const resolvedDriveId = getDriveId(driveId);
|
|
74
|
+
let query = RenownUserProcessor.query(resolvedDriveId, db).selectFrom("renown_user");
|
|
75
|
+
const hasPhids = phids && phids.length > 0;
|
|
76
|
+
const hasEthAddresses = ethAddresses && ethAddresses.length > 0;
|
|
77
|
+
const hasUsernames = usernames && usernames.length > 0;
|
|
78
|
+
if (!hasPhids && !hasEthAddresses && !hasUsernames) {
|
|
79
|
+
throw new Error("At least one of phids, ethAddresses, or usernames must be provided");
|
|
80
|
+
}
|
|
81
|
+
query = query.where((eb) => {
|
|
82
|
+
const conditions = [];
|
|
83
|
+
if (hasPhids) {
|
|
84
|
+
conditions.push(eb("renown_user.document_id", "in", phids));
|
|
85
|
+
}
|
|
86
|
+
if (hasEthAddresses) {
|
|
87
|
+
conditions.push(eb("renown_user.eth_address", "in", ethAddresses));
|
|
88
|
+
}
|
|
89
|
+
if (hasUsernames) {
|
|
90
|
+
conditions.push(eb("renown_user.username", "in", usernames));
|
|
91
|
+
}
|
|
92
|
+
return eb.or(conditions);
|
|
93
|
+
});
|
|
94
|
+
const results = await query.selectAll().execute();
|
|
95
|
+
return results.map(mapToUser);
|
|
96
|
+
},
|
|
97
|
+
renownCredentials: async (parent, args) => {
|
|
98
|
+
const { driveId, ethAddress, did, issuer, includeRevoked = true } = args.input;
|
|
99
|
+
const resolvedDriveId = getDriveId(driveId);
|
|
100
|
+
let query = RenownCredentialProcessor.query(resolvedDriveId, db).selectFrom("renown_credential");
|
|
101
|
+
// Search by ethAddress or DID in credential_subject JSON
|
|
102
|
+
if (ethAddress || did) {
|
|
103
|
+
query = query.where((eb) => {
|
|
104
|
+
const conditions = [];
|
|
105
|
+
if (ethAddress) {
|
|
106
|
+
// Search for ethAddress in credential_subject JSON
|
|
107
|
+
conditions.push(eb("renown_credential.credential_subject", "like", `%${ethAddress}%`));
|
|
108
|
+
}
|
|
109
|
+
if (did) {
|
|
110
|
+
// Search for DID in credential_subject JSON
|
|
111
|
+
conditions.push(eb("renown_credential.credential_subject", "like", `%${did}%`));
|
|
112
|
+
}
|
|
113
|
+
return eb.or(conditions);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// Filter by issuer if provided
|
|
117
|
+
if (issuer) {
|
|
118
|
+
query = query.where("renown_credential.issuer", "=", issuer);
|
|
119
|
+
}
|
|
120
|
+
// Filter by revoked status
|
|
121
|
+
if (!includeRevoked) {
|
|
122
|
+
query = query.where("renown_credential.revoked", "=", false);
|
|
123
|
+
}
|
|
124
|
+
const results = await query.selectAll().execute();
|
|
125
|
+
return results.map(mapToCredential);
|
|
7
126
|
},
|
|
8
127
|
},
|
|
9
128
|
};
|
|
@@ -1,9 +1,68 @@
|
|
|
1
1
|
import { gql } from "graphql-tag";
|
|
2
2
|
export const schema = gql `
|
|
3
3
|
"""
|
|
4
|
-
Subgraph definition
|
|
4
|
+
Subgraph definition for Renown Read Model
|
|
5
5
|
"""
|
|
6
|
+
type RenownUser {
|
|
7
|
+
documentId: String!
|
|
8
|
+
username: String
|
|
9
|
+
ethAddress: String
|
|
10
|
+
userImage: String
|
|
11
|
+
createdAt: DateTime
|
|
12
|
+
updatedAt: DateTime
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
input RenownUserInput {
|
|
16
|
+
driveId: String
|
|
17
|
+
phid: String
|
|
18
|
+
ethAddress: String
|
|
19
|
+
username: String
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
input RenownUsersInput {
|
|
23
|
+
driveId: String
|
|
24
|
+
phids: [String!]
|
|
25
|
+
ethAddresses: [String!]
|
|
26
|
+
usernames: [String!]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type RenownCredential {
|
|
30
|
+
documentId: String!
|
|
31
|
+
credentialId: String
|
|
32
|
+
context: [String!]!
|
|
33
|
+
type: [String!]!
|
|
34
|
+
issuer: String!
|
|
35
|
+
issuanceDate: DateTime!
|
|
36
|
+
credentialSubject: String!
|
|
37
|
+
expirationDate: DateTime
|
|
38
|
+
credentialStatus: CredentialStatus
|
|
39
|
+
jwt: String
|
|
40
|
+
revoked: Boolean!
|
|
41
|
+
revokedAt: DateTime
|
|
42
|
+
revocationReason: String
|
|
43
|
+
createdAt: DateTime
|
|
44
|
+
updatedAt: DateTime
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
type CredentialStatus {
|
|
48
|
+
id: String!
|
|
49
|
+
type: String!
|
|
50
|
+
statusPurpose: String!
|
|
51
|
+
statusListIndex: String!
|
|
52
|
+
statusListCredential: String!
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
input RenownCredentialsInput {
|
|
56
|
+
driveId: String
|
|
57
|
+
ethAddress: String
|
|
58
|
+
did: String
|
|
59
|
+
issuer: String
|
|
60
|
+
includeRevoked: Boolean
|
|
61
|
+
}
|
|
62
|
+
|
|
6
63
|
type Query {
|
|
7
|
-
|
|
64
|
+
renownUser(input: RenownUserInput!): RenownUser
|
|
65
|
+
renownUsers(input: RenownUsersInput!): [RenownUser!]!
|
|
66
|
+
renownCredentials(input: RenownCredentialsInput!): [RenownCredential!]!
|
|
8
67
|
}
|
|
9
68
|
`;
|
package/package.json
CHANGED
|
@@ -1,12 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/renown-package",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.4",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"files": [
|
|
8
8
|
"/dist"
|
|
9
9
|
],
|
|
10
|
+
"release": {
|
|
11
|
+
"branches": [
|
|
12
|
+
"main",
|
|
13
|
+
{
|
|
14
|
+
"name": "staging",
|
|
15
|
+
"prerelease": "staging"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "dev",
|
|
19
|
+
"prerelease": "dev"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"plugins": [
|
|
23
|
+
"@semantic-release/changelog",
|
|
24
|
+
"@semantic-release/git",
|
|
25
|
+
"@semantic-release/commit-analyzer",
|
|
26
|
+
"@semantic-release/release-notes-generator",
|
|
27
|
+
[
|
|
28
|
+
"@semantic-release/npm",
|
|
29
|
+
{
|
|
30
|
+
"npmPublish": true,
|
|
31
|
+
"tarballDir": "dist"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"@semantic-release/github"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
10
37
|
"exports": {
|
|
11
38
|
".": {
|
|
12
39
|
"types": "./dist/index.d.ts",
|
|
@@ -44,6 +71,7 @@
|
|
|
44
71
|
"graphql": "^16.10.0",
|
|
45
72
|
"graphql-tag": "^2.12.6",
|
|
46
73
|
"kysely": "^0.28.7",
|
|
74
|
+
"scalars": "link:../powerhouse/packages/scalars",
|
|
47
75
|
"uuid": "^11.1.0",
|
|
48
76
|
"zod": "^3.24.2"
|
|
49
77
|
},
|
|
@@ -56,8 +84,10 @@
|
|
|
56
84
|
"@powerhousedao/reactor-api": "staging",
|
|
57
85
|
"@powerhousedao/reactor-browser": "staging",
|
|
58
86
|
"@powerhousedao/reactor-local": "staging",
|
|
59
|
-
"@powerhousedao/scalars": "
|
|
87
|
+
"@powerhousedao/scalars": "staging",
|
|
60
88
|
"@powerhousedao/switchboard": "staging",
|
|
89
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
90
|
+
"@semantic-release/git": "^10.0.1",
|
|
61
91
|
"@tailwindcss/cli": "^4.0.15",
|
|
62
92
|
"@testing-library/react": "^16.3.0",
|
|
63
93
|
"@types/node": "^22.13.11",
|
|
@@ -72,6 +102,7 @@
|
|
|
72
102
|
"pm2": "^5.4.3",
|
|
73
103
|
"react": "^18.3.1",
|
|
74
104
|
"react-dom": "^18.3.1",
|
|
105
|
+
"semantic-release": "^24.2.8",
|
|
75
106
|
"tailwindcss": "^4.1.4",
|
|
76
107
|
"typescript": "^5.8.3",
|
|
77
108
|
"typescript-eslint": "^8.30.1",
|