Skip to content

Commit fcc5adb

Browse files
authored
refactor(cat-voices): Centralize signed document metadata creation (#3609)
* feat: add content type * refactor: remove signed document metadata in favor of document data metadata * refactor: centralize parameters * refactor: cleanup * chore: add more test assertions * chore: cleanup * fix: migration test
1 parent 3cd2732 commit fcc5adb

35 files changed

+617
-626
lines changed

catalyst_voices/packages/internal/catalyst_voices_blocs/lib/src/proposal/proposal_cubit.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,10 @@ final class ProposalCubit extends Cubit<ProposalState>
170170
final comment = CommentDocument(
171171
metadata: CommentMetadata(
172172
selfRef: commentRef,
173-
ref: proposalRef! as SignedDocumentRef,
174-
template: commentTemplate!.metadata.selfRef as SignedDocumentRef,
173+
proposalRef: proposalRef! as SignedDocumentRef,
174+
commentTemplate: commentTemplate!.metadata.selfRef as SignedDocumentRef,
175175
reply: reply,
176-
parameters: proposalParameters ?? const DocumentParameters(),
176+
parameters: proposalParameters!,
177177
authorId: activeAccountId!,
178178
),
179179
document: document,

catalyst_voices/packages/internal/catalyst_voices_blocs/lib/src/proposal_builder/new_proposal/new_proposal_cubit.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ class NewProposalCubit extends Cubit<NewProposalState>
4040

4141
final category = await _campaignService.getCategory(DocumentParameters({categoryRef}));
4242
final templateRef = category.proposalTemplateRef;
43-
final template = await _proposalService.getProposalTemplate(
44-
ref: templateRef,
45-
);
43+
final template = await _proposalService.getProposalTemplate(ref: templateRef);
44+
final parameters = template.metadata.parameters;
4645

4746
final documentBuilder = DocumentBuilder.fromSchema(schema: template.schema)
4847
..addChange(
@@ -57,8 +56,8 @@ class NewProposalCubit extends Cubit<NewProposalState>
5756

5857
return await _proposalService.createDraftProposal(
5958
content: documentContent,
60-
template: templateRef,
61-
categoryRef: categoryRef,
59+
templateRef: templateRef,
60+
parameters: parameters,
6261
);
6362
} catch (error, stackTrace) {
6463
_logger.severe('Create draft', error, stackTrace);

catalyst_voices/packages/internal/catalyst_voices_blocs/lib/src/proposal_builder/proposal_builder_bloc.dart

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,11 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
140140
}
141141

142142
DocumentDataMetadata _buildDocumentMetadata([DocumentRef? selfRef]) {
143-
final categoryRef = state.metadata.categoryRef;
144-
145-
return DocumentDataMetadata(
146-
type: DocumentType.proposalDocument,
143+
return DocumentDataMetadata.proposal(
147144
selfRef: selfRef ?? state.metadata.documentRef!,
148-
template: state.metadata.templateRef,
149-
parameters: DocumentParameters({?categoryRef}),
145+
template: state.metadata.templateRef!,
146+
parameters: state.metadata.parameters!,
147+
authors: [_userService.activeAccountId],
150148
);
151149
}
152150

@@ -351,14 +349,11 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
351349
Emitter<ProposalBuilderState> emit,
352350
) async {
353351
try {
354-
final proposalRef = state.metadata.documentRef;
355-
final categoryRef = state.metadata.categoryRef!;
356-
357352
emit(state.copyWith(isChanging: true));
358353

359354
await _proposalService.forgetProposal(
360-
proposalRef: proposalRef! as SignedDocumentRef,
361-
parameters: DocumentParameters({categoryRef}),
355+
proposalRef: state.metadata.documentRef! as SignedDocumentRef,
356+
proposalParameters: state.metadata.parameters!,
362357
);
363358
unawaited(_clearCache());
364359
emitSignal(const ForgotProposalSuccessBuilderSignal());
@@ -473,18 +468,16 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
473468
final category = campaign.categories.first;
474469
final templateRef = category.proposalTemplateRef;
475470

476-
final proposalTemplate = await _proposalService.getProposalTemplate(
477-
ref: templateRef,
478-
);
479-
471+
final proposalTemplate = await _proposalService.getProposalTemplate(ref: templateRef);
472+
final templateParameters = proposalTemplate.metadata.parameters;
480473
final documentBuilder = DocumentBuilder.fromSchema(schema: proposalTemplate.schema);
481474

482475
return _cacheAndCreateState(
483476
proposalDocument: documentBuilder.build(),
484477
proposalBuilder: documentBuilder,
485478
proposalMetadata: ProposalBuilderMetadata.newDraft(
486479
templateRef: templateRef,
487-
categoryRef: category.selfRef,
480+
parameters: templateParameters,
488481
),
489482
category: category,
490483
);
@@ -552,7 +545,7 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
552545
documentRef: proposal.selfRef,
553546
originalDocumentRef: proposal.selfRef,
554547
templateRef: proposalData.document.metadata.templateRef,
555-
categoryRef: category.selfRef,
548+
parameters: proposalData.document.metadata.parameters,
556549
versions: versions,
557550
fromActiveCampaign: fromActiveCampaign,
558551
),
@@ -571,18 +564,16 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
571564
await _loadState(emit, () async {
572565
final category = await _campaignService.getCategory(DocumentParameters({categoryRef}));
573566
final templateRef = category.proposalTemplateRef;
574-
final proposalTemplate = await _proposalService.getProposalTemplate(
575-
ref: templateRef,
576-
);
577-
567+
final proposalTemplate = await _proposalService.getProposalTemplate(ref: templateRef);
568+
final templateParameters = proposalTemplate.metadata.parameters;
578569
final documentBuilder = DocumentBuilder.fromSchema(schema: proposalTemplate.schema);
579570

580571
return _cacheAndCreateState(
581572
proposalDocument: documentBuilder.build(),
582573
proposalBuilder: documentBuilder,
583574
proposalMetadata: ProposalBuilderMetadata.newDraft(
584575
templateRef: templateRef,
585-
categoryRef: categoryRef,
576+
parameters: templateParameters,
586577
),
587578
category: category,
588579
);
@@ -747,7 +738,7 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
747738

748739
await _proposalService.submitProposalForReview(
749740
proposalRef: updatedRef,
750-
proposalParameters: DocumentParameters({state.metadata.categoryRef!}),
741+
proposalParameters: state.metadata.parameters!,
751742
);
752743

753744
_updateMetadata(
@@ -1018,7 +1009,6 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
10181009
Emitter<ProposalBuilderState> emit,
10191010
) async {
10201011
final originalProposalRef = state.metadata.originalDocumentRef;
1021-
final originalProposalCategoryRef = state.metadata.categoryRef;
10221012
assert(
10231013
originalProposalRef != null,
10241014
'Proposal ref not found. Load document first!',
@@ -1038,10 +1028,10 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
10381028
final comment = CommentDocument(
10391029
metadata: CommentMetadata(
10401030
selfRef: commentRef,
1041-
ref: originalProposalRef! as SignedDocumentRef,
1042-
template: commentTemplate!.metadata.selfRef as SignedDocumentRef,
1031+
proposalRef: originalProposalRef! as SignedDocumentRef,
1032+
commentTemplate: commentTemplate!.metadata.selfRef as SignedDocumentRef,
10431033
reply: event.reply,
1044-
parameters: DocumentParameters({?originalProposalCategoryRef}),
1034+
parameters: state.metadata.parameters!,
10451035
authorId: activeAccountId!,
10461036
),
10471037
document: event.document,
@@ -1110,7 +1100,7 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
11101100
) async {
11111101
await _proposalService.submitProposalForReview(
11121102
proposalRef: state.metadata.documentRef! as SignedDocumentRef,
1113-
proposalParameters: DocumentParameters({state.metadata.categoryRef!}),
1103+
proposalParameters: state.metadata.parameters!,
11141104
);
11151105

11161106
_updateMetadata(emit, publish: ProposalPublish.submittedProposal);
@@ -1123,16 +1113,16 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
11231113
) async {
11241114
try {
11251115
final proposalRef = state.metadata.documentRef! as SignedDocumentRef;
1126-
final categoryRef = state.metadata.categoryRef!;
1116+
final parameters = state.metadata.parameters!;
11271117
emit(state.copyWith(isChanging: true));
11281118

11291119
await _proposalService.unlockProposal(
11301120
proposalRef: proposalRef,
1131-
proposalParameters: DocumentParameters({categoryRef}),
1121+
proposalParameters: parameters,
11321122
);
1133-
final stateMetadata = state.metadata.copyWith(publish: ProposalPublish.publishedDraft);
1134-
_cache = _cache.copyWith(proposalMetadata: Optional(stateMetadata));
1135-
emit(state.copyWith(metadata: stateMetadata, isChanging: false));
1123+
final updatedMetadata = state.metadata.copyWith(publish: ProposalPublish.publishedDraft);
1124+
_cache = _cache.copyWith(proposalMetadata: Optional(updatedMetadata));
1125+
emit(state.copyWith(metadata: updatedMetadata, isChanging: false));
11361126
} catch (e, stackTrace) {
11371127
_logger.severe('Unlock proposal failed', e, stackTrace);
11381128
emitError(LocalizedException.create(e));
@@ -1219,23 +1209,23 @@ final class ProposalBuilderBloc extends Bloc<ProposalBuilderEvent, ProposalBuild
12191209
Future<DraftRef> _upsertDraftProposal(DocumentDataContent document) async {
12201210
final currentRef = state.metadata.documentRef!;
12211211
final originalRef = state.metadata.originalDocumentRef;
1222-
final template = state.metadata.templateRef!;
1223-
final categoryRef = state.metadata.categoryRef!;
1212+
final templateRef = state.metadata.templateRef!;
1213+
final parameters = state.metadata.parameters!;
12241214

12251215
DraftRef nextRef;
12261216
if (originalRef == null) {
12271217
nextRef = await _proposalService.createDraftProposal(
12281218
content: document,
1229-
template: template,
1230-
categoryRef: categoryRef,
1219+
templateRef: templateRef,
1220+
parameters: parameters,
12311221
);
12321222
} else {
12331223
nextRef = currentRef.nextVersion();
12341224
await _proposalService.upsertDraftProposal(
12351225
selfRef: nextRef,
12361226
content: document,
1237-
template: template,
1238-
categoryRef: categoryRef,
1227+
templateRef: templateRef,
1228+
parameters: parameters,
12391229
);
12401230
}
12411231

catalyst_voices/packages/internal/catalyst_voices_blocs/lib/src/proposal_builder/proposal_builder_state.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ final class ProposalBuilderMetadata extends Equatable {
99
final DocumentRef? documentRef;
1010
final DocumentRef? originalDocumentRef;
1111
final SignedDocumentRef? templateRef;
12-
final SignedDocumentRef? categoryRef;
12+
final DocumentParameters? parameters;
1313
final List<DocumentVersion> versions;
1414
final bool fromActiveCampaign;
1515

@@ -18,20 +18,20 @@ final class ProposalBuilderMetadata extends Equatable {
1818
this.documentRef,
1919
this.originalDocumentRef,
2020
this.templateRef,
21-
this.categoryRef,
21+
this.parameters,
2222
this.versions = const [],
2323
this.fromActiveCampaign = true,
2424
});
2525

2626
factory ProposalBuilderMetadata.newDraft({
2727
required SignedDocumentRef templateRef,
28-
required SignedDocumentRef categoryRef,
28+
required DocumentParameters parameters,
2929
}) {
3030
final firstRef = DraftRef.generateFirstRef();
3131
return ProposalBuilderMetadata(
3232
documentRef: firstRef,
3333
templateRef: templateRef,
34-
categoryRef: categoryRef,
34+
parameters: parameters,
3535
);
3636
}
3737

@@ -43,7 +43,7 @@ final class ProposalBuilderMetadata extends Equatable {
4343
documentRef,
4444
originalDocumentRef,
4545
templateRef,
46-
categoryRef,
46+
parameters,
4747
versions,
4848
fromActiveCampaign,
4949
];
@@ -53,7 +53,7 @@ final class ProposalBuilderMetadata extends Equatable {
5353
Optional<DocumentRef>? documentRef,
5454
Optional<DocumentRef>? originalDocumentRef,
5555
Optional<SignedDocumentRef>? templateRef,
56-
Optional<SignedDocumentRef>? categoryRef,
56+
Optional<DocumentParameters>? parameters,
5757
List<DocumentVersion>? versions,
5858
bool? fromActiveCampaign,
5959
}) {
@@ -62,7 +62,7 @@ final class ProposalBuilderMetadata extends Equatable {
6262
documentRef: documentRef.dataOr(this.documentRef),
6363
originalDocumentRef: originalDocumentRef.dataOr(this.originalDocumentRef),
6464
templateRef: templateRef.dataOr(this.templateRef),
65-
categoryRef: categoryRef.dataOr(this.categoryRef),
65+
parameters: parameters.dataOr(this.parameters),
6666
versions: versions ?? this.versions,
6767
fromActiveCampaign: fromActiveCampaign ?? this.fromActiveCampaign,
6868
);

catalyst_voices/packages/internal/catalyst_voices_blocs/lib/src/workspace/workspace_bloc.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ final class WorkspaceBloc extends Bloc<WorkspaceEvent, WorkspaceState>
5757
}
5858

5959
DocumentDataMetadata _buildDocumentMetadata(ProposalDocument document) {
60-
return DocumentDataMetadata(
61-
type: DocumentType.proposalDocument,
60+
return DocumentDataMetadata.proposal(
6261
selfRef: document.metadata.selfRef,
6362
template: document.metadata.templateRef,
6463
parameters: document.metadata.parameters,
64+
authors: document.metadata.authors,
6565
);
6666
}
6767

@@ -102,7 +102,10 @@ final class WorkspaceBloc extends Bloc<WorkspaceEvent, WorkspaceState>
102102
final documentContent = _buildDocumentContent(docData.document.document);
103103

104104
final encodedProposal = await _proposalService.encodeProposalForExport(
105-
document: DocumentData(metadata: docMetadata, content: documentContent),
105+
document: DocumentData(
106+
metadata: docMetadata,
107+
content: documentContent,
108+
),
106109
);
107110

108111
final filename = '${event.prefix}_${event.ref.id}';
@@ -124,7 +127,7 @@ final class WorkspaceBloc extends Bloc<WorkspaceEvent, WorkspaceState>
124127
emit(state.copyWith(isLoading: true));
125128
await _proposalService.forgetProposal(
126129
proposalRef: proposal.selfRef as SignedDocumentRef,
127-
parameters: proposal.parameters,
130+
proposalParameters: proposal.parameters,
128131
);
129132
emit(state.copyWith(userProposals: _removeProposal(event.ref)));
130133
emitSignal(const ForgetProposalSuccessWorkspaceSignal());

catalyst_voices/packages/internal/catalyst_voices_blocs/test/workspace/workspace_bloc_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ void main() {
1919

2020
final proposalRef = SignedDocumentRef.generateFirstRef();
2121
final categoryRef = SignedDocumentRef.generateFirstRef();
22+
final authorId = CatalystId(host: 'test', role0Key: Uint8List(32));
2223

2324
final documentData = DocumentData(
24-
metadata: DocumentDataMetadata(
25-
type: DocumentType.proposalDocument,
25+
metadata: DocumentDataMetadata.proposal(
2626
selfRef: proposalRef,
2727
template: SignedDocumentRef.generateFirstRef(),
2828
parameters: DocumentParameters({categoryRef}),
29+
authors: [authorId],
2930
),
3031
content: const DocumentDataContent({}),
3132
);

catalyst_voices/packages/internal/catalyst_voices_models/lib/src/catalyst_voices_models.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export 'document/constant/all_const_documents_refs.dart';
3838
export 'document/constant/constant_documents_refs.dart';
3939
export 'document/constant/f14_const_documents_refs.dart';
4040
export 'document/constant/f15_const_documents_refs.dart';
41+
export 'document/data/document_content_type.dart';
4142
export 'document/data/document_data.dart';
4243
export 'document/data/document_data_content.dart';
4344
export 'document/data/document_data_metadata.dart';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:catalyst_voices_models/src/document/data/document_data_content.dart';
2+
3+
/// Defines the content type of the [DocumentDataContent].
4+
enum DocumentContentType {
5+
/// The document's content type is JSON.
6+
json('application/json'),
7+
8+
/// Unrecognized content type.
9+
unknown('unknown');
10+
11+
final String value;
12+
13+
const DocumentContentType(this.value);
14+
15+
static DocumentContentType fromJson(String data) {
16+
return DocumentContentType.values.firstWhere(
17+
(element) => element.value == data,
18+
orElse: () => DocumentContentType.unknown,
19+
);
20+
}
21+
22+
static String toJson(DocumentContentType type) => type.value;
23+
}

0 commit comments

Comments
 (0)