Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import { CustomConfirmationService } from '@osf/shared/services/custom-confirmat
import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
import { ToastService } from '@osf/shared/services/toast.service';
import {
AddContributor,
BulkAddContributors,
BulkUpdateContributors,
ContributorsSelectors,
Expand Down Expand Up @@ -92,7 +91,6 @@ export class ProjectContributorsStepComponent {
contributorsSaved = output<void>();

actions = createDispatchMap({
addContributor: AddContributor,
bulkAddContributors: BulkAddContributors,
bulkUpdateContributors: BulkUpdateContributors,
deleteContributor: DeleteContributor,
Expand Down Expand Up @@ -207,7 +205,7 @@ export class ProjectContributorsStepComponent {
} else {
const params = { name: res.data[0].fullName };

this.actions.addContributor(this.selectedProject()?.id, ResourceType.Project, res.data[0]).subscribe({
this.actions.bulkAddContributors(this.selectedProject()?.id, ResourceType.Project, res.data).subscribe({
next: () => this.toastService.showSuccess('project.contributors.toastMessages.addSuccessMessage', params),
});
}
Expand Down
6 changes: 2 additions & 4 deletions src/app/features/contributors/contributors.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ import { LoaderService } from '@osf/shared/services/loader.service';
import { ToastService } from '@osf/shared/services/toast.service';
import {
AcceptRequestAccess,
AddContributor,
BulkAddContributors,
BulkAddContributorsFromParentProject,
BulkUpdateContributors,
Expand Down Expand Up @@ -176,7 +175,6 @@ export class ContributorsComponent implements OnInit, OnDestroy {
bulkUpdateContributors: BulkUpdateContributors,
bulkAddContributors: BulkAddContributors,
bulkAddContributorsFromParentProject: BulkAddContributorsFromParentProject,
addContributor: AddContributor,
createViewOnlyLink: CreateViewOnlyLink,
deleteViewOnlyLink: DeleteViewOnlyLink,
getRequestAccessContributors: GetRequestAccessContributors,
Expand Down Expand Up @@ -327,7 +325,7 @@ export class ContributorsComponent implements OnInit, OnDestroy {

private addContributorsToComponents(result: ContributorDialogAddModel): void {
this.actions
.bulkAddContributors(this.resourceId(), this.resourceType(), result.data, result.childNodeIds)
.bulkAddContributors(this.resourceId(), this.resourceType(), result.data)
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => this.toastService.showSuccess('project.contributors.toastMessages.multipleAddSuccessMessage'));
}
Expand Down Expand Up @@ -355,7 +353,7 @@ export class ContributorsComponent implements OnInit, OnDestroy {
} else {
const params = { name: res.data[0].fullName };

this.actions.addContributor(this.resourceId(), this.resourceType(), res.data[0]).subscribe({
this.actions.bulkAddContributors(this.resourceId(), this.resourceType(), res.data).subscribe({
next: () => this.toastService.showSuccess('project.contributors.toastMessages.addSuccessMessage', params),
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import { CustomConfirmationService } from '@osf/shared/services/custom-confirmat
import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
import { ToastService } from '@osf/shared/services/toast.service';
import {
AddContributor,
BulkAddContributors,
BulkUpdateContributors,
ContributorsSelectors,
Expand Down Expand Up @@ -96,7 +95,6 @@ export class ContributorsDialogComponent implements OnInit {
updatePermissionFilter: UpdatePermissionFilter,
updateBibliographyFilter: UpdateBibliographyFilter,
deleteContributor: DeleteContributor,
addContributor: AddContributor,
bulkAddContributors: BulkAddContributors,
bulkUpdateContributors: BulkUpdateContributors,
loadMoreContributors: LoadMoreContributors,
Expand Down Expand Up @@ -178,7 +176,7 @@ export class ContributorsDialogComponent implements OnInit {
} else {
const params = { name: res.data[0].fullName };

this.actions.addContributor(this.resourceId, this.resourceType, res.data[0]).subscribe({
this.actions.bulkAddContributors(this.resourceId, this.resourceType, res.data).subscribe({
next: () => {
this.changesMade.set(true);
this.toastService.showSuccess('project.contributors.toastMessages.addSuccessMessage', params);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import { CustomConfirmationService } from '@osf/shared/services/custom-confirmat
import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
import { ToastService } from '@osf/shared/services/toast.service';
import {
AddContributor,
BulkAddContributors,
BulkUpdateContributors,
ContributorsSelectors,
Expand Down Expand Up @@ -84,7 +83,6 @@ export class PreprintsContributorsComponent implements OnInit {
deleteContributor: DeleteContributor,
bulkUpdateContributors: BulkUpdateContributors,
bulkAddContributors: BulkAddContributors,
addContributor: AddContributor,
loadMoreContributors: LoadMoreContributors,
});

Expand Down Expand Up @@ -157,7 +155,7 @@ export class PreprintsContributorsComponent implements OnInit {
} else {
const params = { name: res.data[0].fullName };

this.actions.addContributor(this.preprintId(), ResourceType.Preprint, res.data[0]).subscribe({
this.actions.bulkAddContributors(this.preprintId(), ResourceType.Preprint, res.data).subscribe({
next: () => this.toastService.showSuccess('project.contributors.toastMessages.addSuccessMessage', params),
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import { CustomConfirmationService } from '@osf/shared/services/custom-confirmat
import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
import { ToastService } from '@osf/shared/services/toast.service';
import {
AddContributor,
BulkAddContributors,
BulkUpdateContributors,
ContributorsSelectors,
Expand Down Expand Up @@ -90,7 +89,6 @@ export class RegistriesContributorsComponent implements OnInit, OnDestroy {
deleteContributor: DeleteContributor,
bulkUpdateContributors: BulkUpdateContributors,
bulkAddContributors: BulkAddContributors,
addContributor: AddContributor,
loadMoreContributors: LoadMoreContributors,
resetContributorsState: ResetContributorsState,
});
Expand Down Expand Up @@ -176,7 +174,7 @@ export class RegistriesContributorsComponent implements OnInit, OnDestroy {
} else {
const params = { name: res.data[0].fullName };

this.actions.addContributor(this.draftId(), ResourceType.DraftRegistration, res.data[0]).subscribe({
this.actions.bulkAddContributors(this.draftId(), ResourceType.DraftRegistration, res.data).subscribe({
next: () => this.toastService.showSuccess('project.contributors.toastMessages.addSuccessMessage', params),
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,12 @@ export class AddContributorDialogComponent implements OnInit, OnDestroy {
readonly isSearchState = computed(() => this.currentState() === AddDialogState.Search);
readonly isDetailsState = computed(() => this.currentState() === AddDialogState.Details);
readonly isComponentsState = computed(() => this.currentState() === AddDialogState.Components);
readonly hasComponents = computed(() => this.components().length > 0);
readonly buttonLabel = computed(() => (this.isComponentsState() ? 'common.buttons.done' : 'common.buttons.next'));
readonly hasComponents = computed(() => this.components().length > 1);
readonly buttonLabel = computed(() =>
(this.isDetailsState() && !this.hasComponents()) || this.isComponentsState()
? 'common.buttons.done'
: 'common.buttons.next'
);

constructor() {
this.setupEffects();
Expand Down
21 changes: 21 additions & 0 deletions src/app/shared/mappers/contributors/contributors.mapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,25 @@ export class ContributorsMapper {
};
}
}

static toContributorUpdateRequest(model: ContributorModel): ContributorAddRequestModel {
return {
id: model.id,
type: 'contributors',
attributes: {
bibliographic: model.isBibliographic,
permission: model.permission,
index: model.index,
id: model.userId,
},
relationships: {
users: {
data: {
id: model.id,
type: 'users',
},
},
},
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export interface ContributorEmbedsJsonApi {

export interface ContributorAddRequestModel {
type: 'contributors';
id?: string;
attributes: {
bibliographic: boolean;
permission: string;
Expand Down
61 changes: 23 additions & 38 deletions src/app/shared/services/contributors.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { forkJoin, map, Observable, of } from 'rxjs';
import { map, Observable, of } from 'rxjs';

import { inject, Injectable } from '@angular/core';

Expand All @@ -10,11 +10,7 @@ import { ContributorsMapper } from '../mappers/contributors';
import { ResponseJsonApi } from '../models/common/json-api.model';
import { ContributorModel } from '../models/contributors/contributor.model';
import { ContributorAddModel } from '../models/contributors/contributor-add.model';
import {
ContributorDataJsonApi,
ContributorResponseJsonApi,
ContributorsResponseJsonApi,
} from '../models/contributors/contributor-response-json-api.model';
import { ContributorsResponseJsonApi } from '../models/contributors/contributor-response-json-api.model';
import { PaginatedData } from '../models/paginated-data.model';
import { UserDataJsonApi } from '../models/user/user-json-api.model';

Expand Down Expand Up @@ -110,25 +106,19 @@ export class ContributorsService {
return of([]);
}

const updateRequests = contributors.map((contributor) =>
this.updateContributor(resourceType, resourceId, contributor)
);

return forkJoin(updateRequests);
}
const baseUrl = `${this.getBaseUrl(resourceType, resourceId)}/`;

updateContributor(
resourceType: ResourceType,
resourceId: string,
data: ContributorModel
): Observable<ContributorModel> {
const baseUrl = `${this.getBaseUrl(resourceType, resourceId)}/${data.userId}/`;
const contributorData = {
data: contributors.map((contributor) => ContributorsMapper.toContributorUpdateRequest(contributor)),
};

const contributorData = { data: ContributorsMapper.toContributorAddRequest(data) };
const headers = {
'Content-Type': 'application/vnd.api+json; ext=bulk',
};

return this.jsonApiService
.patch<ContributorDataJsonApi>(baseUrl, contributorData)
.pipe(map((contributor) => ContributorsMapper.getContributor(contributor)));
.patch<ContributorsResponseJsonApi>(baseUrl, contributorData, undefined, headers)
.pipe(map((response) => ContributorsMapper.getContributors(response.data)));
}

bulkAddContributors(
Expand All @@ -141,27 +131,22 @@ export class ContributorsService {
return of([]);
}

const addRequests = contributors.map((contributor) =>
this.addContributor(resourceType, resourceId, contributor, childNodeIds)
);

return forkJoin(addRequests);
}

addContributor(
resourceType: ResourceType,
resourceId: string,
data: ContributorAddModel,
childNodeIds?: string[]
): Observable<ContributorModel> {
const baseUrl = `${this.getBaseUrl(resourceType, resourceId)}/`;
const type = data.id ? AddContributorType.Registered : AddContributorType.Unregistered;

const contributorData = { data: ContributorsMapper.toContributorAddRequest(data, type, childNodeIds) };
const contributorData = {
data: contributors.map((contributor) => {
const type = contributor.id ? AddContributorType.Registered : AddContributorType.Unregistered;
return ContributorsMapper.toContributorAddRequest(contributor, type, childNodeIds);
}),
};

const headers = {
'Content-Type': 'application/vnd.api+json; ext=bulk',
};

return this.jsonApiService
.post<ContributorResponseJsonApi>(baseUrl, contributorData)
.pipe(map((contributor) => ContributorsMapper.getContributor(contributor.data)));
.post<ContributorsResponseJsonApi>(baseUrl, contributorData, undefined, headers)
.pipe(map((response) => ContributorsMapper.getContributors(response.data)));
}

addContributorsFromProject(resourceType: ResourceType, resourceId: string): Observable<void> {
Expand Down
9 changes: 7 additions & 2 deletions src/app/shared/services/json-api.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ export class JsonApiService {
return httpParams;
}

post<T>(url: string, body?: unknown, params?: Record<string, unknown>): Observable<T> {
return this.http.post<T>(url, body, { params: this.buildHttpParams(params) });
post<T>(
url: string,
body?: unknown,
params?: Record<string, unknown>,
headers?: Record<string, string>
): Observable<T> {
return this.http.post<T>(url, body, { params: this.buildHttpParams(params), headers });
}

patch<T>(
Expand Down
10 changes: 0 additions & 10 deletions src/app/shared/stores/contributors/contributors.actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,6 @@ export class UpdateBibliographyFilter {
constructor(public bibliographyFilter: boolean | null) {}
}

export class AddContributor {
static readonly type = '[Contributors] Add Contributor';

constructor(
public resourceId: string | undefined | null,
public resourceType: ResourceType | undefined,
public contributor: ContributorAddModel
) {}
}

export class BulkUpdateContributors {
static readonly type = '[Contributors] Bulk Update Contributors';

Expand Down
25 changes: 1 addition & 24 deletions src/app/shared/stores/contributors/contributors.state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { RequestAccessService } from '@osf/shared/services/request-access.servic

import {
AcceptRequestAccess,
AddContributor,
BulkAddContributors,
BulkAddContributorsFromParentProject,
BulkUpdateContributors,
Expand Down Expand Up @@ -145,28 +144,6 @@ export class ContributorsState {
);
}

@Action(AddContributor)
addContributor(ctx: StateContext<ContributorsStateModel>, action: AddContributor) {
const state = ctx.getState();

if (!action.resourceId || !action.resourceType) {
return;
}

ctx.patchState({
contributorsList: { ...state.contributorsList, isLoading: true, error: null },
});

return this.contributorsService.addContributor(action.resourceType, action.resourceId, action.contributor).pipe(
tap(() => {
ctx.dispatch(
new GetAllContributors(action.resourceId, action.resourceType, 1, state.contributorsList.pageSize)
);
}),
catchError((error) => handleSectionError(ctx, 'contributorsList', error))
);
}

@Action(BulkUpdateContributors)
bulkUpdateContributors(ctx: StateContext<ContributorsStateModel>, action: BulkUpdateContributors) {
const state = ctx.getState();
Expand Down Expand Up @@ -204,7 +181,7 @@ export class ContributorsState {
});

return this.contributorsService
.bulkAddContributors(action.resourceType, action.resourceId, action.contributors, action.childNodeIds)
.bulkAddContributors(action.resourceType, action.resourceId, action.contributors)
.pipe(
tap(() => {
ctx.dispatch(
Expand Down