Skip to content

Commit a021915

Browse files
committed
added new tags
1 parent 95dabab commit a021915

10 files changed

Lines changed: 1486 additions & 27 deletions

File tree

distributor-node/src/services/networking/query-node/schema.graphql

Lines changed: 413 additions & 0 deletions
Large diffs are not rendered by default.

metadata-protobuf/proto/WorkingGroups.proto

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,95 @@ message ModeratePost {
6363
required string rationale = 2;
6464
}
6565

66+
message CreateTag {
67+
// Name of new Tag, e.g : roadmap
68+
required string name = 1;
69+
70+
// Description of new Tag, e.g : Roadmap covering the Joystream ecosystem
71+
required string description = 2;
72+
73+
// Type of new Tag : e.g : roadmap
74+
required string type = 3;
75+
76+
// Visibility of new Tag : e.g : true
77+
required bool visibility = 4;
78+
}
79+
80+
message UpdateTag {
81+
// ID of tag
82+
required string tag_id = 1;
83+
84+
// name of tag
85+
required string name = 2;
86+
87+
// Updated Description of Tag
88+
optional string description = 3;
89+
90+
// Updated Type of Tag
91+
optional string type = 4;
92+
93+
// Updated Visibility of Tag
94+
optional bool visibility = 5;
95+
}
96+
97+
message AssignTagToThread {
98+
// ID of tag
99+
required string tag_id = 1;
100+
101+
// ID of thread
102+
required string thread_id = 2;
103+
}
104+
105+
message UnassignTagFromThread {
106+
// ID of tag
107+
required string tag_id = 1;
108+
109+
// ID of thread
110+
required string thread_id = 2;
111+
}
112+
113+
message AssignTagToProposal {
114+
// ID of tag
115+
required string tag_id = 1;
116+
117+
// ID of proposal
118+
required string proposal_id = 2;
119+
}
120+
121+
message UnassignTagFromProposal {
122+
// ID of tag
123+
required string tag_id = 1;
124+
125+
// ID of proposal
126+
required string proposal_id = 2;
127+
}
128+
129+
message AllowTagToWorker {
130+
// ID of tag
131+
required string tag_id = 1;
132+
133+
// ID of worker
134+
required uint64 worker_id = 2;
135+
}
136+
137+
message DisallowTagToWorker {
138+
// ID of tag
139+
required string tag_id = 1;
140+
141+
// ID of worker
142+
required uint64 worker_id = 2;
143+
}
144+
66145
message RemarkMetadataAction {
67146
oneof action {
68147
ModeratePost moderate_post = 1;
148+
CreateTag create_tag = 2;
149+
UpdateTag update_tag = 3;
150+
AssignTagToThread assign_tag_to_thread = 4;
151+
UnassignTagFromThread unassign_tag_from_thread = 5;
152+
AssignTagToProposal assign_tag_to_proposal = 6;
153+
UnassignTagFromProposal unassign_tag_from_proposal = 7;
154+
AllowTagToWorker allow_tag_to_worker = 8;
155+
DisallowTagToWorker disallow_tag_to_worker = 9;
69156
}
70157
}

query-node/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
- Refactor of mappings for more better handling of error cases. [#4856](https://github.com/Joystream/joystream/pull/4856)
44
- Bug fix [#4855](https://github.com/Joystream/joystream/issues/4855)
5-
- Add support for UpdateGlobalNftLimit proposal.
5+
- Add support for UpdateGlobalNftLimit proposal.
66

77
### 1.6.0
88

query-node/mappings/src/common.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,4 +434,10 @@ export enum MetaprotocolTxError {
434434

435435
// Channel errors
436436
InvalidChannelRewardAccount = 'InvalidChannelRewardAccount',
437+
438+
// Tag errors
439+
TagAlreadyExists = 'TagAlreadyExists',
440+
TagIsNotLead = 'TagIsNotLead',
441+
TagNotFound = 'TagNotFound',
442+
TagPermNotAllowed = 'TagPermNotAllowed',
437443
}
Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
import { DatabaseManager, SubstrateEvent } from '@joystream/hydra-common'
2+
import {
3+
ICreateTag,
4+
IUpdateTag,
5+
IAssignTagToThread,
6+
IAssignTagToProposal,
7+
IUnassignTagFromThread,
8+
IUnassignTagFromProposal,
9+
IAllowTagToWorker,
10+
IDisallowTagToWorker,
11+
} from '@joystream/metadata-protobuf'
12+
import { DecodedMetadataObject } from '@joystream/metadata-protobuf/types'
13+
import {
14+
WorkingGroup,
15+
Tag,
16+
TagToWorker,
17+
TagToThread,
18+
TagToProposal,
19+
ForumThread,
20+
Proposal,
21+
} from 'query-node/dist/model'
22+
import { MetaprotocolTxError, getOneBy, getById, logger, getOneByOrFail, getByIdOrFail } from 'src/common'
23+
24+
export async function processCreateTag(
25+
store: DatabaseManager,
26+
event: SubstrateEvent,
27+
metadata: DecodedMetadataObject<ICreateTag>,
28+
workgroup: WorkingGroup,
29+
isLead: boolean,
30+
workerId: number
31+
): Promise<any> {
32+
const { name, description, type, visibility } = metadata
33+
34+
if (isLead === false) {
35+
return MetaprotocolTxError.TagPermNotAllowed
36+
}
37+
38+
const tagId = `${event.blockNumber}-${event.indexInBlock}`
39+
40+
const isTagExists = await getOneBy(store, Tag, { name: name })
41+
42+
if (isTagExists) {
43+
return MetaprotocolTxError.TagAlreadyExists
44+
}
45+
46+
const newTag = new Tag({
47+
name: name,
48+
description: description,
49+
type: type,
50+
visibility: visibility,
51+
})
52+
53+
await store.save<Tag>(newTag)
54+
logger.info('Tag has been created', { name })
55+
56+
return newTag
57+
}
58+
59+
export async function processUpdateTag(
60+
store: DatabaseManager,
61+
event: SubstrateEvent,
62+
metadata: DecodedMetadataObject<IUpdateTag>,
63+
workingGroup: WorkingGroup,
64+
isLead: boolean,
65+
workerId: number
66+
): Promise<any> {
67+
const { tagId, name, description, type, visibility } = metadata
68+
69+
if (isLead === false) {
70+
return MetaprotocolTxError.TagPermNotAllowed
71+
}
72+
73+
const tag: Tag | undefined = await getById(store, Tag, tagId)
74+
75+
if (!tag) {
76+
return MetaprotocolTxError.TagNotFound
77+
}
78+
79+
if (name) {
80+
tag.name = name
81+
}
82+
83+
if (description) {
84+
tag.description = description
85+
}
86+
87+
if (type) {
88+
tag.type = type
89+
}
90+
91+
if (visibility) {
92+
tag.visibility = visibility
93+
}
94+
95+
await store.save<Tag>(tag)
96+
97+
logger.info('Tag has been created', { name })
98+
return tag
99+
}
100+
101+
export async function processAssignTagToThread(
102+
store: DatabaseManager,
103+
event: SubstrateEvent,
104+
metadata: DecodedMetadataObject<IAssignTagToThread>,
105+
workingGroup: WorkingGroup,
106+
isLead: boolean,
107+
workerId: number
108+
): Promise<any> {
109+
const { tagId, threadId } = metadata
110+
111+
if (!isLead) {
112+
await getOneByOrFail(store, TagToWorker, { tagId: tagId, workerId: workerId.toString() })
113+
}
114+
115+
await getByIdOrFail(store, ForumThread, threadId)
116+
const tagToThread: TagToThread | undefined = await getOneBy(store, TagToThread, { tagId: tagId, threadId: threadId })
117+
118+
if (!tagToThread) {
119+
const newTagToThread = new TagToThread({
120+
tagId: tagId,
121+
threadId: threadId,
122+
})
123+
await store.save<TagToThread>(newTagToThread)
124+
}
125+
126+
logger.info('TagToThread has been assigned', { tagId, threadId })
127+
return tagToThread
128+
}
129+
130+
export async function processAssignTagToProposal(
131+
store: DatabaseManager,
132+
event: SubstrateEvent,
133+
metadata: DecodedMetadataObject<IAssignTagToProposal>,
134+
workingGroup: WorkingGroup,
135+
isLead: boolean,
136+
workerId: number
137+
): Promise<any> {
138+
const { tagId, proposalId } = metadata
139+
140+
if (!isLead) {
141+
await getOneByOrFail(store, TagToWorker, { tagId: tagId, workerId: workerId.toString() })
142+
}
143+
144+
await getByIdOrFail(store, Proposal, proposalId)
145+
const tagToProposal: TagToProposal | undefined = await getOneBy(store, TagToProposal, {
146+
tagId: tagId,
147+
proposalId: proposalId,
148+
})
149+
150+
if (!tagToProposal) {
151+
const newTagToProposal = new TagToProposal({
152+
tagId: tagId,
153+
proposalId: proposalId,
154+
})
155+
await store.save<TagToProposal>(newTagToProposal)
156+
}
157+
158+
logger.info('TagToProposal has been assigned', { tagId, proposalId })
159+
return tagToProposal
160+
}
161+
162+
export async function processUnassignTagFromThread(
163+
store: DatabaseManager,
164+
event: SubstrateEvent,
165+
metadata: DecodedMetadataObject<IUnassignTagFromThread>,
166+
workingGroup: WorkingGroup,
167+
isLead: boolean,
168+
workerId: number
169+
): Promise<any> {
170+
const { tagId, threadId } = metadata
171+
172+
if (!isLead) {
173+
await getOneByOrFail(store, TagToWorker, { tagId: tagId, workerId: workerId.toString() })
174+
}
175+
176+
await getByIdOrFail(store, ForumThread, threadId)
177+
const tagToThread: TagToThread | undefined = await getOneBy(store, TagToThread, { tagId: tagId, threadId: threadId })
178+
179+
if (tagToThread) {
180+
await store.remove<TagToThread>(tagToThread)
181+
}
182+
183+
logger.info('TagToThread has been unassigned', { tagId, threadId })
184+
return tagToThread
185+
}
186+
187+
export async function processUnassignTagFromProposal(
188+
store: DatabaseManager,
189+
event: SubstrateEvent,
190+
metadata: DecodedMetadataObject<IUnassignTagFromProposal>,
191+
workingGroup: WorkingGroup,
192+
isLead: boolean,
193+
workerId: number
194+
): Promise<any> {
195+
const { tagId, proposalId } = metadata
196+
197+
if (!isLead) {
198+
await getOneByOrFail(store, TagToWorker, { tagId: tagId, workerId: workerId.toString() })
199+
}
200+
201+
await getByIdOrFail(store, Proposal, proposalId)
202+
203+
const tagToProposal: TagToProposal | undefined = await getOneBy(store, TagToProposal, {
204+
tagId: tagId,
205+
proposalId: proposalId,
206+
})
207+
208+
if (tagToProposal) {
209+
await store.remove<TagToProposal>(tagToProposal)
210+
}
211+
212+
logger.info('TagToProposal has been unassigned', { tagId, proposalId })
213+
return tagToProposal
214+
}
215+
216+
export async function processAllowTagToWorker(
217+
store: DatabaseManager,
218+
event: SubstrateEvent,
219+
metadata: DecodedMetadataObject<IAllowTagToWorker>,
220+
workingGroup: WorkingGroup,
221+
isLead: boolean,
222+
workerId: number
223+
): Promise<any> {
224+
const { tagId, workerId: assigneeId } = metadata
225+
226+
if (!isLead) {
227+
return MetaprotocolTxError.TagPermNotAllowed
228+
}
229+
230+
const tagToWorker: TagToWorker | undefined = await getOneBy(store, TagToWorker, {
231+
tagId: tagId,
232+
workerId: assigneeId,
233+
})
234+
235+
if (!tagToWorker) {
236+
const newTagToWorker = new TagToWorker({
237+
tagId: tagId,
238+
workerId: assigneeId,
239+
})
240+
await store.save<TagToWorker>(newTagToWorker)
241+
}
242+
243+
logger.info('TagToWorker has been allowed', { tagId, assigneeId })
244+
}
245+
246+
export async function processDisallowTagToWorker(
247+
store: DatabaseManager,
248+
event: SubstrateEvent,
249+
metadata: DecodedMetadataObject<IDisallowTagToWorker>,
250+
workingGroup: WorkingGroup,
251+
isLead: boolean,
252+
workerId: number
253+
): Promise<any> {
254+
const { tagId, workerId: assigneeId } = metadata
255+
256+
if (!isLead) {
257+
return MetaprotocolTxError.TagPermNotAllowed
258+
}
259+
260+
const tagToWorker: TagToWorker | undefined = await getOneBy(store, TagToWorker, {
261+
tagId: tagId,
262+
workerId: assigneeId,
263+
})
264+
265+
if (tagToWorker) {
266+
await store.remove<TagToWorker>(tagToWorker)
267+
}
268+
269+
logger.info('TagToWorker has been disallowed', { tagId, assigneeId })
270+
}

0 commit comments

Comments
 (0)