mirror of
https://github.com/nestjs/nest.git
synced 2026-02-21 23:11:44 +00:00
docs: fix typos
This commit is contained in:
@@ -6,7 +6,7 @@ class ServiceInjectingItself {
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
class ServiceInjectingItselfForwared {
|
||||
class ServiceInjectingItselfForward {
|
||||
constructor(
|
||||
@Inject(forwardRef(() => ServiceInjectingItself))
|
||||
private readonly coreService: ServiceInjectingItself,
|
||||
@@ -24,7 +24,7 @@ class ServiceInjectingItselfViaCustomToken {
|
||||
export class SelfInjectionProviderModule {}
|
||||
|
||||
@Module({
|
||||
providers: [ServiceInjectingItselfForwared],
|
||||
providers: [ServiceInjectingItselfForward],
|
||||
})
|
||||
export class SelfInjectionForwardProviderModule {}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ export const sendHttpRequest = async (url: URL) => {
|
||||
res.on('data', chunk => {
|
||||
// no op
|
||||
});
|
||||
// fail the test if somethin goes wrong
|
||||
// fail the test if something goes wrong
|
||||
res.on('error', err => {
|
||||
reject(err);
|
||||
});
|
||||
|
||||
@@ -71,7 +71,7 @@ export class CacheInterceptor implements NestInterceptor {
|
||||
await this.cacheManager.set(...args);
|
||||
} catch (err) {
|
||||
Logger.error(
|
||||
`An error has occured when inserting "key: ${key}", "value: ${response}"`,
|
||||
`An error has occurred when inserting "key: ${key}", "value: ${response}"`,
|
||||
'CacheInterceptor',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ export class ConfigurableModuleBuilder<
|
||||
|
||||
/**
|
||||
* Registers the "extras" object (a set of extra options that can be used to modify the dynamic module definition).
|
||||
* Values you specify within the "extras" object will be used as default values (that can be overriden by module consumers).
|
||||
* Values you specify within the "extras" object will be used as default values (that can be overridden by module consumers).
|
||||
*
|
||||
* This method also applies the so-called "module definition transform function" that takes the auto-generated
|
||||
* dynamic module object ("DynamicModule") and the actual consumer "extras" object as input parameters.
|
||||
|
||||
@@ -51,7 +51,7 @@ describe('mixin', () => {
|
||||
expect(type.name).to.not.eql('Test');
|
||||
});
|
||||
|
||||
it('should not lost the design:parmatypes metadata', () => {
|
||||
it('should not lost the design:paramtypes metadata', () => {
|
||||
const type = mixin(Test);
|
||||
const constructorParams = Reflect.getMetadata('design:paramtypes', type);
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ describe('HttpException', () => {
|
||||
expect(cause).to.be.eql(errorCause);
|
||||
});
|
||||
|
||||
it('configures a cause when using a bult-in exception with options', () => {
|
||||
it('configures a cause when using a built-in exception with options', () => {
|
||||
const builtInErrorClasses = [
|
||||
BadGatewayException,
|
||||
BadRequestException,
|
||||
|
||||
@@ -45,7 +45,7 @@ class TestModel {
|
||||
public optionalProp: string;
|
||||
}
|
||||
|
||||
class TestModelNoValidaton {
|
||||
class TestModelNoValidation {
|
||||
constructor() {}
|
||||
|
||||
public prop1: string;
|
||||
@@ -367,7 +367,7 @@ describe('ValidationPipe', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('when type doesnt match', () => {
|
||||
describe("when type doesn't match", () => {
|
||||
describe('when validation rules are applied', () => {
|
||||
it('should throw an error', async () => {
|
||||
target = new ValidationPipe();
|
||||
@@ -389,7 +389,7 @@ describe('ValidationPipe', () => {
|
||||
{ prop1: 'value1', prop2: 'value2', prop3: 'value3' },
|
||||
];
|
||||
|
||||
const objMetadata = { ...metadata, metatype: TestModelNoValidaton };
|
||||
const objMetadata = { ...metadata, metatype: TestModelNoValidation };
|
||||
const result = await target.transform(testObj, objMetadata);
|
||||
|
||||
expect(result).to.not.be.instanceOf(TestModel);
|
||||
|
||||
@@ -26,7 +26,7 @@ const getInstanceName = (instance: unknown): string => {
|
||||
* Returns the name of the dependency
|
||||
* Tries to get the class name, otherwise the string value
|
||||
* (= injection token). As fallback it returns '+'
|
||||
* @param dependency The dependency whichs name should get displayed
|
||||
* @param dependency The name of the dependency to be displayed
|
||||
*/
|
||||
const getDependencyName = (dependency: InjectorDependency): string =>
|
||||
// use class name
|
||||
|
||||
@@ -4,7 +4,7 @@ import { InstanceToken } from '../module';
|
||||
|
||||
/**
|
||||
* Returns the instances which are transient
|
||||
* @param instances The instances which should be checked whether they are transcient
|
||||
* @param instances The instances which should be checked whether they are transient
|
||||
*/
|
||||
export function getTransientInstances(
|
||||
instances: [InstanceToken, InstanceWrapper][],
|
||||
@@ -20,7 +20,7 @@ export function getTransientInstances(
|
||||
|
||||
/**
|
||||
* Returns the instances which are not transient
|
||||
* @param instances The instances which should be checked whether they are transcient
|
||||
* @param instances The instances which should be checked whether they are transient
|
||||
*/
|
||||
export function getNonTransientInstances(
|
||||
instances: [InstanceToken, InstanceWrapper][],
|
||||
|
||||
@@ -127,15 +127,15 @@ export class ReplContext {
|
||||
|
||||
this.nativeFunctions.set(nativeFunction.fnDefinition.name, nativeFunction);
|
||||
|
||||
nativeFunction.fnDefinition.aliases?.forEach(aliaseName => {
|
||||
nativeFunction.fnDefinition.aliases?.forEach(aliasName => {
|
||||
const aliasNativeFunction: InstanceType<ReplFunctionClass> =
|
||||
Object.create(nativeFunction);
|
||||
aliasNativeFunction.fnDefinition = {
|
||||
name: aliaseName,
|
||||
name: aliasName,
|
||||
description: aliasNativeFunction.fnDefinition.description,
|
||||
signature: aliasNativeFunction.fnDefinition.signature,
|
||||
};
|
||||
this.nativeFunctions.set(aliaseName, aliasNativeFunction);
|
||||
this.nativeFunctions.set(aliasName, aliasNativeFunction);
|
||||
nativeFunctions.push(aliasNativeFunction);
|
||||
});
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ describe('ContextUtils', () => {
|
||||
});
|
||||
});
|
||||
describe('mergeParamsMetatypes', () => {
|
||||
it('should return "paramsProperties" when paramtypes array doesnt exists', () => {
|
||||
it('should return "paramsProperties" when paramtypes array doesn\'t exists', () => {
|
||||
const paramsProperties = ['1'];
|
||||
expect(
|
||||
contextUtils.mergeParamsMetatypes(paramsProperties as any, null),
|
||||
|
||||
@@ -98,7 +98,7 @@ describe('InstanceWrapper', () => {
|
||||
});
|
||||
describe('when statically scoped', () => {
|
||||
describe('dependencies, properties, enhancers', () => {
|
||||
describe('dependecies non static, properties static, enhancers static', () => {
|
||||
describe('dependencies non static, properties static, enhancers static', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper();
|
||||
wrapper.addCtorMetadata(
|
||||
@@ -110,7 +110,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeStatic()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('dependecies static, properties non static, enhancers static', () => {
|
||||
describe('dependencies static, properties non static, enhancers static', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper();
|
||||
wrapper.addCtorMetadata(0, new InstanceWrapper());
|
||||
@@ -122,7 +122,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeStatic()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('dependecies static, properties static, enhancers non static', () => {
|
||||
describe('dependencies static, properties static, enhancers non static', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper();
|
||||
wrapper.addCtorMetadata(0, new InstanceWrapper());
|
||||
@@ -268,7 +268,7 @@ describe('InstanceWrapper', () => {
|
||||
});
|
||||
describe('when statically scoped', () => {
|
||||
describe('dependencies, properties, enhancers', () => {
|
||||
describe('dependecies non durable, properties non durable, enhancers durable', () => {
|
||||
describe('dependencies non durable, properties non durable, enhancers durable', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper();
|
||||
wrapper.addCtorMetadata(
|
||||
@@ -281,7 +281,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('dependecies non durable, properties durable, enhancers durable', () => {
|
||||
describe('dependencies non durable, properties durable, enhancers durable', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper();
|
||||
wrapper.addCtorMetadata(
|
||||
@@ -297,7 +297,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('dependecies non durable, properties durable', () => {
|
||||
describe('dependencies non durable, properties durable', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper();
|
||||
wrapper.addCtorMetadata(
|
||||
@@ -342,14 +342,14 @@ describe('InstanceWrapper', () => {
|
||||
});
|
||||
});
|
||||
describe('dependencies', () => {
|
||||
describe('when wrapper is non durable and dependecy is static', () => {
|
||||
describe('when wrapper is non durable and dependency is static', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper({ scope: Scope.REQUEST });
|
||||
wrapper.addCtorMetadata(0, new InstanceWrapper());
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is static', () => {
|
||||
describe('when wrapper is durable and dependency is static', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -359,7 +359,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is non durable and dependecy is durable', () => {
|
||||
describe('when wrapper is non durable and dependency is durable', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -371,7 +371,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is static', () => {
|
||||
describe('when wrapper is durable and dependency is static', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -381,7 +381,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is non durable', () => {
|
||||
describe('when wrapper is durable and dependency is non durable', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -450,14 +450,14 @@ describe('InstanceWrapper', () => {
|
||||
});
|
||||
});
|
||||
describe('properties', () => {
|
||||
describe('when wrapper is non durable and dependecy is static', () => {
|
||||
describe('when wrapper is non durable and dependency is static', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper({ scope: Scope.REQUEST });
|
||||
wrapper.addPropertiesMetadata('key1', new InstanceWrapper());
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is static', () => {
|
||||
describe('when wrapper is durable and dependency is static', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -467,7 +467,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is non durable and dependecy is durable', () => {
|
||||
describe('when wrapper is non durable and dependency is durable', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -479,7 +479,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is static', () => {
|
||||
describe('when wrapper is durable and dependency is static', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -489,7 +489,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is non durable', () => {
|
||||
describe('when wrapper is durable and dependency is non durable', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -549,14 +549,14 @@ describe('InstanceWrapper', () => {
|
||||
});
|
||||
});
|
||||
describe('enhancers', () => {
|
||||
describe('when wrapper is non durable and dependecy is static', () => {
|
||||
describe('when wrapper is non durable and dependency is static', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper({ scope: Scope.REQUEST });
|
||||
wrapper.addEnhancerMetadata(new InstanceWrapper());
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is static', () => {
|
||||
describe('when wrapper is durable and dependency is static', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -566,7 +566,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is non durable and dependecy is durable', () => {
|
||||
describe('when wrapper is non durable and dependency is durable', () => {
|
||||
it('should return false', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -577,7 +577,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.false;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is static', () => {
|
||||
describe('when wrapper is durable and dependency is static', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
@@ -587,7 +587,7 @@ describe('InstanceWrapper', () => {
|
||||
expect(wrapper.isDependencyTreeDurable()).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when wrapper is durable and dependecy is non durable', () => {
|
||||
describe('when wrapper is durable and dependency is non durable', () => {
|
||||
it('should return true', () => {
|
||||
const wrapper = new InstanceWrapper({
|
||||
scope: Scope.REQUEST,
|
||||
|
||||
@@ -189,7 +189,7 @@ describe('RouterExplorer', () => {
|
||||
instance: { [methodKey]: {} },
|
||||
});
|
||||
|
||||
it('should delegete error to exception filters', async () => {
|
||||
it('should delegate error to exception filters', async () => {
|
||||
const handler = routerBuilder.createRequestScopedHandler(
|
||||
wrapper,
|
||||
RequestMethod.ALL,
|
||||
|
||||
@@ -260,21 +260,21 @@ describe('DependenciesScanner', () => {
|
||||
|
||||
expect(module.forwardRef.called).to.be.true;
|
||||
});
|
||||
it('should throw "InvalidClassModuleException" exception when suppling a class annotated with `@Injectable()` decorator', () => {
|
||||
it('should throw "InvalidClassModuleException" exception when supplying a class annotated with `@Injectable()` decorator', () => {
|
||||
sinon.stub(container, 'addModule').returns({} as any);
|
||||
|
||||
expect(scanner.insertModule(TestComponent, [])).to.be.rejectedWith(
|
||||
InvalidClassModuleException,
|
||||
);
|
||||
});
|
||||
it('should throw "InvalidClassModuleException" exception when suppling a class annotated with `@Controller()` decorator', () => {
|
||||
it('should throw "InvalidClassModuleException" exception when supplying a class annotated with `@Controller()` decorator', () => {
|
||||
sinon.stub(container, 'addModule').returns({} as any);
|
||||
|
||||
expect(scanner.insertModule(TestController, [])).to.be.rejectedWith(
|
||||
InvalidClassModuleException,
|
||||
);
|
||||
});
|
||||
it('should throw "InvalidClassModuleException" exception when suppling a class annotated with (only) `@Catch()` decorator', () => {
|
||||
it('should throw "InvalidClassModuleException" exception when supplying a class annotated with (only) `@Catch()` decorator', () => {
|
||||
sinon.stub(container, 'addModule').returns({} as any);
|
||||
|
||||
expect(
|
||||
|
||||
@@ -971,7 +971,7 @@ export type ConsumerRebalancingEvent = InstrumentationEvent<{
|
||||
groupId: string;
|
||||
memberId: string;
|
||||
}>;
|
||||
export type ConsumerReceivedUnsubcribedTopicsEvent = InstrumentationEvent<{
|
||||
export type ConsumerReceivedUnsubscribedTopicsEvent = InstrumentationEvent<{
|
||||
groupId: string;
|
||||
generationId: number;
|
||||
memberId: string;
|
||||
@@ -1106,7 +1106,7 @@ export type Consumer = {
|
||||
): RemoveInstrumentationEventListener<typeof eventName>;
|
||||
on(
|
||||
eventName: ConsumerEvents['RECEIVED_UNSUBSCRIBED_TOPICS'],
|
||||
listener: (event: ConsumerReceivedUnsubcribedTopicsEvent) => void,
|
||||
listener: (event: ConsumerReceivedUnsubscribedTopicsEvent) => void,
|
||||
): RemoveInstrumentationEventListener<typeof eventName>;
|
||||
on(
|
||||
eventName: ConsumerEvents['REQUEST'],
|
||||
|
||||
@@ -351,13 +351,13 @@ describe('ClientGrpcProxy', () => {
|
||||
|
||||
const stream$ = client.createUnaryServiceMethod(obj, methodName)();
|
||||
|
||||
const subsciption = stream$.subscribe({
|
||||
const subscription = stream$.subscribe({
|
||||
next: dataSpy,
|
||||
error: errorSpy,
|
||||
complete: completeSpy,
|
||||
});
|
||||
|
||||
subsciption.unsubscribe();
|
||||
subscription.unsubscribe();
|
||||
handler(null, 'a');
|
||||
|
||||
expect(dataSpy.called).to.be.false;
|
||||
|
||||
@@ -108,8 +108,8 @@ describe('JsonSocket message parsing', () => {
|
||||
describe('Error handling', () => {
|
||||
describe('JSON Error', () => {
|
||||
const errorMsg = `Could not parse JSON: Unexpected end of JSON input\nRequest data: "Hel`;
|
||||
const packetStrin = '4#"Hel';
|
||||
const packet = Buffer.from(packetStrin);
|
||||
const packetString = '4#"Hel';
|
||||
const packet = Buffer.from(packetString);
|
||||
|
||||
it('should fail to parse invalid JSON', () => {
|
||||
try {
|
||||
@@ -146,12 +146,12 @@ describe('JsonSocket message parsing', () => {
|
||||
|
||||
describe('Corrupted length value', () => {
|
||||
const errorMsg = `Corrupted length value "wtf" supplied in a packet`;
|
||||
const packetStrin = 'wtf#"Hello"';
|
||||
const packet = Buffer.from(packetStrin);
|
||||
const packetString = 'wtf#"Hello"';
|
||||
const packet = Buffer.from(packetString);
|
||||
|
||||
it('should not accept invalid content length', () => {
|
||||
try {
|
||||
socket['handleData'](packetStrin);
|
||||
socket['handleData'](packetString);
|
||||
} catch (err) {
|
||||
expect(err.message).to.deep.equal(errorMsg);
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ describe('ListenersController', () => {
|
||||
const patterns = [{}];
|
||||
const wrapper = new InstanceWrapper({ instance: { [methodKey]: {} } });
|
||||
|
||||
it('should delegete error to exception filters', async () => {
|
||||
it('should delegate error to exception filters', async () => {
|
||||
sinon.stub(injector, 'loadPerContext').callsFake(() => {
|
||||
throw new Error();
|
||||
});
|
||||
|
||||
@@ -65,7 +65,7 @@ export interface NestFastifyApplication extends INestApplication {
|
||||
/**
|
||||
* Sets a view engine for templates (views), for example: `pug`, `handlebars`, or `ejs`.
|
||||
*
|
||||
* Don't pass in a string. The string type in the argument is for compatibilility reason and will cause an exception.
|
||||
* Don't pass in a string. The string type in the argument is for compatibility reason and will cause an exception.
|
||||
* @returns {this}
|
||||
*/
|
||||
setViewEngine(options: FastifyViewOptions | string): this;
|
||||
|
||||
@@ -4,7 +4,7 @@ A simple example of GraphQL Federation using Code First approach.
|
||||
|
||||
## Execution
|
||||
|
||||
Make sure to start the two sub-graph applications first, then the gatway. Otherwise the gateway won't be able to fetch schemas from the sub-graphs.
|
||||
Make sure to start the two sub-graph applications first, then the gateway. Otherwise the gateway won't be able to fetch schemas from the sub-graphs.
|
||||
|
||||
```sh
|
||||
cd users-application && npm run start
|
||||
|
||||
@@ -4,7 +4,7 @@ A simple example of GraphQL Federation using Schema First approach.
|
||||
|
||||
## Execution
|
||||
|
||||
Make sure to start the two sub-graph applications first, then the gatway. Otherwise the gateway won't be able to fetch schemas from the sub-graphs.
|
||||
Make sure to start the two sub-graph applications first, then the gateway. Otherwise the gateway won't be able to fetch schemas from the sub-graphs.
|
||||
|
||||
```sh
|
||||
cd users-application && npm run start
|
||||
|
||||
@@ -15,7 +15,7 @@ export function getDirs(base: string) {
|
||||
|
||||
/**
|
||||
* Checks if the directory contains a package.json file
|
||||
* @param dir Path to the dircetory
|
||||
* @param dir Path to the directory
|
||||
* @returns True if the directory contains a package.json
|
||||
*/
|
||||
export function containsPackageJson(dir: string) {
|
||||
|
||||
Reference in New Issue
Block a user