Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
7 changes: 7 additions & 0 deletions src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,13 @@ export const routes: Routes = [
import('./core/components/page-not-found/page-not-found.component').then((mod) => mod.PageNotFoundComponent),
data: { skipBreadcrumbs: true },
},
{
path: 'content-flagged-as-spam',
loadComponent: () =>
import('./core/components/resource-is-spammed/resource-is-spammed.component').then(
(mod) => mod.ResourceIsSpammedComponent
),
},
{
path: 'project/:id/node/:nodeId/files/:provider/:fileId',
loadComponent: () =>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<section class="container text-center flex flex-column flex-1 my-7 mx-3 p-3 md:p-4">
<h2 class="font-bold">{{ 'resourceSpammed.title' | translate }}</h2>

<p class="mt-4 mb-4">
{{ 'resourceSpammed.message' | translate }}
</p>

<p>
<span>{{ 'resourceSpammed.contact' | translate }}</span>
<a class="ml-1 font-bold" [href]="'mailto:' + supportEmail">{{ supportEmail }} </a>
<span>{{ 'resourceSpammed.footer' | translate }}</span>
</p>
</section>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
@use "styles/mixins" as mix;

:host {
@include mix.flex-center;
flex: 1;
background: var(--gradient-3);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { TranslateModule } from '@ngx-translate/core';

import { ComponentFixture, TestBed } from '@angular/core/testing';

import { ResourceIsSpammedComponent } from './resource-is-spammed.component';

describe('ResourceIsSpammedComponent', () => {
let component: ResourceIsSpammedComponent;
let fixture: ComponentFixture<ResourceIsSpammedComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [TranslateModule.forRoot(), ResourceIsSpammedComponent],
}).compileComponents();

fixture = TestBed.createComponent(ResourceIsSpammedComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { TranslatePipe } from '@ngx-translate/core';

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

import { ENVIRONMENT } from '@core/provider/environment.provider';

@Component({
selector: 'osf-resource-is-spammed',
imports: [TranslatePipe],
templateUrl: './resource-is-spammed.component.html',
styleUrl: './resource-is-spammed.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ResourceIsSpammedComponent {
private readonly environment = inject(ENVIRONMENT);
readonly supportEmail = this.environment.supportEmail;
}
14 changes: 12 additions & 2 deletions src/app/features/preprints/services/preprints.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { map, Observable } from 'rxjs';
import { catchError, map, Observable, throwError } from 'rxjs';

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

import { ENVIRONMENT } from '@core/provider/environment.provider';
import { RegistryModerationMapper } from '@osf/features/moderation/mappers';
Expand Down Expand Up @@ -38,6 +39,7 @@ import {
export class PreprintsService {
private readonly jsonApiService = inject(JsonApiService);
private readonly environment = inject(ENVIRONMENT);
private readonly router = inject(Router);

get apiUrl() {
return `${this.environment.apiDomainUrl}/v2`;
Expand Down Expand Up @@ -95,7 +97,15 @@ export class PreprintsService {
null
>
>(`${this.apiUrl}/preprints/${id}/`, params)
.pipe(map((response) => PreprintsMapper.fromPreprintWithEmbedsJsonApi(response)));
.pipe(
map((response) => PreprintsMapper.fromPreprintWithEmbedsJsonApi(response)),
catchError((error) => {
if (error.status === 410) {
this.router.navigate(['/content-flagged-as-spam']);
}
return throwError(() => error);
})
);
}

getPreprintMetrics(id: string) {
Expand Down
12 changes: 10 additions & 2 deletions src/app/shared/services/resource.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { finalize, map, Observable } from 'rxjs';
import { catchError, finalize, map, Observable, throwError } from 'rxjs';

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

import { ENVIRONMENT } from '@core/provider/environment.provider';

Expand All @@ -24,6 +25,7 @@ export class ResourceGuidService {
private jsonApiService = inject(JsonApiService);
private loaderService = inject(LoaderService);
private readonly environment = inject(ENVIRONMENT);
private readonly router = inject(Router);

get apiUrl() {
return `${this.environment.apiDomainUrl}/v2`;
Expand Down Expand Up @@ -59,7 +61,13 @@ export class ResourceGuidService {
title: res.data.attributes?.title,
}) as CurrentResource
),
finalize(() => this.loaderService.hide())
finalize(() => this.loaderService.hide()),
catchError((error) => {
if (error.status === 410) {
this.router.navigate(['/content-flagged-as-spam']);
}
return throwError(() => error);
})
);
}

Expand Down
6 changes: 6 additions & 0 deletions src/assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2831,6 +2831,12 @@
"requestedSuccessMessage": "Your request for access has been sent.",
"alreadyRequestedMessage": "You already requested access."
},
"resourceSpammed": {
"title": "This Page Is Temporarily Unavailable.",
"message": "This content was flagged as potential spam.",
"contact": "If this is a mistake, reach out to",
"footer": "for assistance. Your content remains safe and will be restored once verified."
},
"validation": {
"required": "The field is required.",
"email": "Please enter a valid email address.",
Expand Down