Skip to content

Commit

Permalink
Merge branch 'auth' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
nailtonvital committed May 28, 2024
2 parents 6f30df8 + 01b065b commit 6897938
Show file tree
Hide file tree
Showing 16 changed files with 790 additions and 29 deletions.
603 changes: 587 additions & 16 deletions package-lock.json

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,20 @@
"@nestjs/common": "^10.0.0",
"@nestjs/config": "^3.2.2",
"@nestjs/core": "^10.0.0",
"@nestjs/jwt": "^10.2.0",
"@nestjs/mapped-types": "*",
"@nestjs/passport": "^10.0.3",
"@nestjs/platform-express": "^10.0.0",
"@nestjs/swagger": "^7.3.1",
"@nestjs/typeorm": "^10.0.2",
"bcrypt": "^5.1.1",
"class-validator": "^0.14.1",
"cross-env": "^7.0.3",
"jsonwebtoken": "^9.0.2",
"mysql2": "^3.9.7",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"passport-local": "^1.0.0",
"reflect-metadata": "^0.2.0",
"rxjs": "^7.8.1",
"typeorm": "^0.3.20"
Expand All @@ -41,6 +48,8 @@
"@types/express": "^4.17.17",
"@types/jest": "^29.5.2",
"@types/node": "^20.3.1",
"@types/passport-jwt": "^4.0.1",
"@types/passport-local": "^1.0.38",
"@types/supertest": "^6.0.0",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
Expand Down
3 changes: 2 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { PostCommentsModule } from './post-comments/post-comments.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from '@nestjs/config';
import { MediaUserModule } from './media-user/media-user.module';
import { AuthModule } from './auth/auth.module';

@Module({
imports: [
Expand All @@ -29,7 +30,7 @@ import { MediaUserModule } from './media-user/media-user.module';
autoLoadEntities: true,
})
}),
UsersModule, PostsModule, MediasModule, InterestsModule, PostCommentsModule, MediaUserModule],
UsersModule, PostsModule, MediasModule, InterestsModule, PostCommentsModule, MediaUserModule, AuthModule],
controllers: [AppController],
providers: [AppService],
})
Expand Down
20 changes: 20 additions & 0 deletions src/auth/auth.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';

describe('AuthController', () => {
let controller: AuthController;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [AuthController],
providers: [AuthService],
}).compile();

controller = module.get<AuthController>(AuthController);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});
});
13 changes: 13 additions & 0 deletions src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';
import { CreateAuthDto } from './dto/create-auth.dto';

@Controller('auth')
export class AuthController {
constructor(private readonly authService: AuthService) { }

@Post()
signIn(@Body() createAuthDto: CreateAuthDto) {
return this.authService.validateUser(createAuthDto.email, createAuthDto.password);
}
}
22 changes: 22 additions & 0 deletions src/auth/auth.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { LocalStrategy } from './local.auth';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { UsersModule } from 'src/users/users.module';

@Module({
imports: [
UsersModule,
PassportModule,
JwtModule.register({
secret: 'topSecret',
signOptions: { expiresIn: '2d' },
}),
],
controllers: [AuthController],
providers: [AuthService, LocalStrategy],
exports: [AuthService, LocalStrategy],
})
export class AuthModule { }
18 changes: 18 additions & 0 deletions src/auth/auth.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AuthService } from './auth.service';

describe('AuthService', () => {
let service: AuthService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [AuthService],
}).compile();

service = module.get<AuthService>(AuthService);
});

it('should be defined', () => {
expect(service).toBeDefined();
});
});
38 changes: 38 additions & 0 deletions src/auth/auth.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Injectable, UnauthorizedException, NotAcceptableException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { CreateAuthDto } from './dto/create-auth.dto';
import { UpdateAuthDto } from './dto/update-auth.dto';
import { UsersService } from '../users/users.service';
import { User } from 'src/users/entities/user.entity';

@Injectable()
export class AuthService {

constructor(
private userService: UsersService,
private jwtService: JwtService,
) { }

async validateUser(email: string, password: string): Promise<any> {
const user = await this.userService.findOne(email);
if (!user) {
throw new UnauthorizedException('Email ou Senha Inválidos');
}
if (user.password === password) {
return await this.generateToken(user);
}
throw new UnauthorizedException('Email ou Senha Inválidos');
}

async generateToken(payload: User) {
return {
access_token: this.jwtService.sign(
{ email: payload.email },
{
secret: 'topSecret512',
expiresIn: '2d',
},
),
};
}
}
4 changes: 4 additions & 0 deletions src/auth/dto/create-auth.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export class CreateAuthDto {
email: string;
password: string;
}
4 changes: 4 additions & 0 deletions src/auth/dto/update-auth.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/swagger';
import { CreateAuthDto } from './create-auth.dto';

export class UpdateAuthDto extends PartialType(CreateAuthDto) {}
1 change: 1 addition & 0 deletions src/auth/entities/auth.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class Auth {}
19 changes: 19 additions & 0 deletions src/auth/local.auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super();
}

async validate(email: string, password: string): Promise<any> {
const user = await this.authService.validateUser(email, password);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
15 changes: 7 additions & 8 deletions src/posts/posts.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,9 @@ export class PostsService {
private interestRepository: Repository<Interest>,
@InjectRepository(User)
private userRepository: Repository<User>,

@InjectRepository(Interest)
private InterestsService: InterestsService


) { }

async create(createPostDto: CreatePostDto) {
Expand Down Expand Up @@ -112,7 +110,7 @@ export class PostsService {

async removeLike(id: number, userId: number) {
try {
return this.postRepository
return await this.postRepository
.createQueryBuilder()
.relation(Post, 'likes')
.of(id)
Expand All @@ -122,6 +120,7 @@ export class PostsService {
}
}


async listComments(id: number) {
try {
const post = await this.postRepository.findOne({
Expand All @@ -135,9 +134,9 @@ export class PostsService {
}
}

addComment(id: number, commentId: number) {
async addComment(id: number, commentId: number) {
try {
return this.postRepository
return await this.postRepository
.createQueryBuilder()
.relation(Post, 'comments')
.of(id)
Expand All @@ -147,9 +146,9 @@ export class PostsService {
}
}

removeComment(id: number, commentId: number) {
async removeComment(id: number, commentId: number) {
try {
return this.postRepository
return await this.postRepository
.createQueryBuilder()
.relation(Post, 'comments')
.of(id)
Expand Down Expand Up @@ -181,7 +180,7 @@ export class PostsService {
interestId: interestId
}).execute();

return this.postRepository.findOne({
return await this.postRepository.findOne({
where: { idPost: id },
relations: ['interests']
});
Expand Down
2 changes: 1 addition & 1 deletion src/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class UsersController {
@Get(':id')
async findOne(@Param('id') id: string) {
try {
return await this.usersService.findOne(+id);
return await this.usersService.findOneById(+id);
} catch (error) {
throw error;
}
Expand Down
6 changes: 5 additions & 1 deletion src/users/users.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@ import { User } from './entities/user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Interest } from '../interests/entities/interest.entity';
import { Post } from '../posts/entities/post.entity';
import { JwtModule } from '@nestjs/jwt';

@Module({
imports: [TypeOrmModule.forFeature([User, Interest, Post])],
imports: [TypeOrmModule.forFeature([User, Interest, Post]), JwtModule.register({
secret: 'yourSecretKey', // Use a strong secret key in production
signOptions: { expiresIn: '60s' },
}),],
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService]
Expand Down
42 changes: 40 additions & 2 deletions src/users/users.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { Interest } from '../interests/entities/interest.entity';
import { parse } from 'path';
import { JwtService } from '@nestjs/jwt';

@Injectable()
export class UsersService {
Expand All @@ -15,6 +16,7 @@ export class UsersService {
private userRepository: Repository<User>,
@InjectRepository(Interest)
private interestRepository: Repository<Interest>,
private jwtService: JwtService,
) { }

async create(createUserDto: CreateUserDto) {
Expand Down Expand Up @@ -54,12 +56,38 @@ export class UsersService {
}
}

async findOne(id: number) {

async findOne(email: string) {
try {
return await this.userRepository.findOne({
where: { email: email },
relations: ['interests'],
})
} catch (error) {
throw error;
}
}

async findOneById(id: number) {
try {
return await this.userRepository.findOne({
where: { idUser: id },
relations: ['interests', 'posts'],
relations: ['interests'],
});
} catch (error) {
throw error;
}
}

async auth(email, password) {
try {
const emailItem = await this.userRepository.findOne({
where: { email: email }
})
if (emailItem.password === password) {
this.generateToken(emailItem);
}
return null;
} catch (error) {
throw error;
}
Expand All @@ -81,6 +109,7 @@ export class UsersService {
}
}


// async listPosts(id: number) {
// try {
// const user = await this.userRepository.findOne({
Expand All @@ -92,4 +121,13 @@ export class UsersService {
// throw error;
// }
// }

generateToken(user: User) {
const payload = { email: user.email, sub: user.idUser };
return {
access_token: this.jwtService.sign(payload),
};
}


}

0 comments on commit 6897938

Please sign in to comment.