Skip to content

Commit dde18ee

Browse files
committed
refactor: apply camelCase conversion and fix model/controller naming
1 parent 26a2cea commit dde18ee

8 files changed

Lines changed: 62 additions & 44 deletions

File tree

src/controllers/authorsController.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import camelcaseKeys from "camelcase-keys";
12
import dotenv from "dotenv";
23
import sql from "mssql";
34
import { Body, Controller, Delete, Get, Path, Post, Put, Route, SuccessResponse, Tags } from "tsoa";
45

5-
import { BookAuthor } from "../models/book.js";
6-
import { AuthorCreateRequest, AuthorRequest, AuthorUpdateRequest } from "./../models/author.js";
6+
import { BookAuthorResponse } from "../models/book.js";
7+
import { AuthorCreateRequest, AuthorResponse, AuthorUpdateRequest } from "./../models/author.js";
78

89
dotenv.config();
910

@@ -74,7 +75,7 @@ export class AuthorsController extends Controller {
7475

7576
/** GET /Authors/{id} */
7677
@Get("{id}")
77-
public async getAuthor(@Path() id: number): Promise<AuthorRequest | null> {
78+
public async getAuthor(@Path() id: number): Promise<AuthorResponse | null> {
7879
const pool = await sql.connect(sqlConfig);
7980
// const pool = await getSqlPool();
8081
const result = await pool.request().input("id", sql.Int, id).query("SELECT * FROM Authors WHERE AuthorId = @id");
@@ -84,24 +85,29 @@ export class AuthorsController extends Controller {
8485
return null;
8586
}
8687

87-
return result.recordset[0] as AuthorRequest;
88+
// return result.recordset[0] as AuthorRequest;
89+
return camelcaseKeys(result.recordset[0], { deep: true }) as unknown as AuthorResponse;
8890
}
8991

9092
/** GET /authors */
9193
@Get()
92-
public async getAuthors(): Promise<AuthorRequest[]> {
94+
public async getAuthors(): Promise<AuthorResponse[]> {
9395
const pool = await sql.connect(sqlConfig);
9496
// const pool = await getSqlPool();
9597
const result = await pool.request().query("SELECT * FROM Authors");
96-
return result.recordset as AuthorRequest[];
98+
// return result.recordset as AuthorRequest[];
99+
100+
return camelcaseKeys(result.recordset, { deep: true }) as unknown as AuthorResponse[];
97101
}
98102

99103
/** GET /authors/{authorId}/books */
100104
@Get("{authorId}/books")
101-
public async getBooksByAuthor(@Path() authorId: number): Promise<BookAuthor[]> {
105+
public async getBooksByAuthor(@Path() authorId: number): Promise<BookAuthorResponse[]> {
102106
const pool = await sql.connect(sqlConfig);
103107
const result = await pool.request().input("authorId", sql.Int, authorId).query("SELECT * FROM BooksAuthors WHERE AuthorId = @authorId");
104-
return result.recordset as BookAuthor[];
108+
// return result.recordset as BookAuthor[];
109+
110+
return camelcaseKeys(result.recordset, { deep: true }) as unknown as BookAuthorResponse[];
105111
}
106112

107113
/** PUT /Authors/{id} */

src/controllers/booksController.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import camelcaseKeys from "camelcase-keys";
12
import dotenv from "dotenv";
23
import sql from "mssql";
34
import { Body, Controller, Delete, Get, Path, Post, Put, Route, SuccessResponse, Tags } from "tsoa";
45

5-
import { BookAuthor, BookAuthorCreateRequest, BookCreateRequest, BookRequest, BookUpdateRequest } from "./../models/book.js";
6+
import { BookAuthorCreateRequest, BookAuthorResponse, BookCreateRequest, BookResponse, BookUpdateRequest } from "./../models/book.js";
67

78
dotenv.config();
89

@@ -81,10 +82,10 @@ export class BooksController extends Controller {
8182
.input("title", sql.NVarChar(200), title)
8283
.input("year", sql.Int, year).query<{ BookId: number }>(`
8384
INSERT INTO Books
84-
(CreatedBy, Description, DownloadUrl, ImageUrl, ISBN, LanguageId, Title, Year)
85+
(Description, DownloadUrl, ImageUrl, ISBN, LanguageId, Title, Year)
8586
OUTPUT INSERTED.BookId
8687
VALUES
87-
(@createdBy, @description, @downloadUrl, @imageUrl, @isbn, @languageId, @title, @year)
88+
( @description, @downloadUrl, @imageUrl, @isbn, @languageId, @title, @year)
8889
`);
8990

9091
return { id: result.recordset[0].BookId, message: "Book created successfully" };
@@ -110,15 +111,16 @@ export class BooksController extends Controller {
110111

111112
/** GET /books/{bookId}/authors */
112113
@Get("{bookId}/authors")
113-
public async getAuthorsByBook(@Path() bookId: number): Promise<BookAuthor[]> {
114+
public async getAuthorsByBook(@Path() bookId: number): Promise<BookAuthorResponse[]> {
114115
const pool = await sql.connect(sqlConfig);
115116
const result = await pool.request().input("bookId", sql.Int, bookId).query("SELECT * FROM BooksAuthors WHERE BookId = @bookId");
116-
return result.recordset as BookAuthor[];
117+
// return result.recordset as BookAuthor[];
118+
return camelcaseKeys(result.recordset, { deep: true }) as unknown as BookAuthorResponse[];
117119
}
118120

119121
/** GET /books/{id} */
120122
@Get("{id}")
121-
public async getBook(@Path() id: number): Promise<BookRequest | null> {
123+
public async getBook(@Path() id: number): Promise<BookResponse | null> {
122124
const pool = await sql.connect(sqlConfig);
123125
const result = await pool.request().input("id", sql.Int, id).query("SELECT * FROM Books WHERE BookId = @id");
124126

@@ -127,15 +129,17 @@ export class BooksController extends Controller {
127129
return null;
128130
}
129131

130-
return result.recordset[0] as BookRequest;
132+
// return result.recordset[0] as BookRequest;
133+
return camelcaseKeys(result.recordset[0], { deep: true }) as BookResponse;
131134
}
132135

133136
/** GET /books */ // -- books
134137
@Get()
135-
public async getBooks(): Promise<BookRequest[]> {
138+
public async getBooks(): Promise<BookResponse[]> {
136139
const pool = await sql.connect(sqlConfig);
137140
const result = await pool.request().query("SELECT * FROM Books");
138-
return result.recordset;
141+
// return result.recordset;
142+
return camelcaseKeys(result.recordset, { deep: true }) as unknown as BookResponse[];
139143
}
140144

141145
/** DELETE /books/{bookId}/authors/{authorId} */

src/controllers/languagesController.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import camelcaseKeys from "camelcase-keys";
12
import dotenv from "dotenv";
23
import sql from "mssql";
34
import { Body, Controller, Delete, Get, Path, Post, Put, Route, SuccessResponse, Tags } from "tsoa";
45

5-
import { CreateLanguageRequest, LanguageRequest, UpdateLanguageRequest } from "./../models/language.js";
6+
import { CreateLanguageRequest, LanguageResponse, UpdateLanguageRequest } from "./../models/language.js";
67

78
dotenv.config();
89

@@ -63,7 +64,7 @@ export class LanguagesController extends Controller {
6364

6465
/** GET /languages/{id} */
6566
@Get("{id}")
66-
public async getLanguage(@Path() id: number): Promise<LanguageRequest | null> {
67+
public async getLanguage(@Path() id: number): Promise<LanguageResponse | null> {
6768
const pool = await sql.connect(sqlConfig);
6869
const result = await pool.request().input("id", sql.Int, id).query("SELECT * FROM Languages WHERE LanguageId = @id");
6970

@@ -72,15 +73,17 @@ export class LanguagesController extends Controller {
7273
return null;
7374
}
7475

75-
return result.recordset[0] as LanguageRequest;
76+
// return result.recordset[0] as LanguageRequest;
77+
return camelcaseKeys(result.recordset[0], { deep: true }) as unknown as LanguageResponse;
7678
}
7779

7880
/** GET /languages */
7981
@Get()
80-
public async getLanguages(): Promise<LanguageRequest[]> {
82+
public async getLanguages(): Promise<LanguageResponse[]> {
8183
const pool = await sql.connect(sqlConfig);
8284
const result = await pool.request().query("SELECT * FROM Languages");
83-
return result.recordset as LanguageRequest[];
85+
// return result.recordset as LanguageRequest[];
86+
return camelcaseKeys(result.recordset, { deep: true }) as unknown as LanguageResponse[];
8487
}
8588

8689
/** PUT /languages/{id} */

src/controllers/usersController.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import camelcaseKeys from "camelcase-keys";
12
import dotenv from "dotenv";
23
import sql from "mssql";
34
import { Body, Controller, Delete, Get, Path, Post, Put, Route, SuccessResponse, Tags } from "tsoa";
45

5-
import { UserCreateRequest, UserRequest, UserUpdateRequest } from "./../models/user.js";
6+
import { UserCreateRequest, UserResponse, UserUpdateRequest } from "./../models/user.js";
67

78
dotenv.config();
89

@@ -28,7 +29,7 @@ export class UsersController extends Controller {
2829
/** POST /users */
2930
@Post()
3031
@SuccessResponse("201", "Created")
31-
public async createUser(@Body() body: UserCreateRequest): Promise<{ message: string; user?: UserRequest }> {
32+
public async createUser(@Body() body: UserCreateRequest): Promise<{ message: string }> {
3233
const { username } = body;
3334

3435
if (!username || username.length < 3) {
@@ -38,9 +39,9 @@ export class UsersController extends Controller {
3839

3940
const pool = await sql.connect(sqlConfig);
4041

41-
const result = await pool.request().input("username", sql.VarChar(100), username).query("INSERT INTO Users (Username) VALUES (@username)");
42+
await pool.request().input("username", sql.VarChar(100), username).query("INSERT INTO Users (Username) VALUES (@username)");
4243

43-
return { message: "User created successfully", user: result.recordset[0] as UserRequest };
44+
return { message: "User created successfully" };
4445
}
4546

4647
/** DELETE /users/{id} */
@@ -68,7 +69,7 @@ export class UsersController extends Controller {
6869

6970
/** GET /users/{id} */
7071
@Get("{id}")
71-
public async getUser(@Path() id: number): Promise<null | UserRequest> {
72+
public async getUser(@Path() id: number): Promise<null | UserResponse> {
7273
const pool = await sql.connect(sqlConfig);
7374
const result = await pool.request().input("id", sql.Int, id).query("SELECT * FROM Users WHERE UserId = @id");
7475

@@ -77,19 +78,23 @@ export class UsersController extends Controller {
7778
return null;
7879
}
7980

80-
return result.recordset[0] as UserRequest;
81+
// return result.recordset[0] as UserRequest;
82+
83+
return camelcaseKeys(result.recordset[0], { deep: true }) as UserResponse;
8184
}
8285

8386
@Get()
84-
public async getUsers(): Promise<UserRequest[]> {
87+
public async getUsers(): Promise<UserResponse[]> {
8588
const pool = await sql.connect(sqlConfig);
8689
const result = await pool.request().query("SELECT * FROM Users");
87-
return result.recordset as UserRequest[];
90+
// return result.recordset as UserRequest[];
91+
92+
return camelcaseKeys(result.recordset, { deep: true }) as unknown as UserResponse[];
8893
}
8994

9095
/** PUT /users/{id} */
9196
@Put("{id}")
92-
public async updateUser(@Path() id: number, @Body() body: UserUpdateRequest): Promise<{ message: string; user?: UserRequest }> {
97+
public async updateUser(@Path() id: number, @Body() body: UserUpdateRequest): Promise<{ message: string; user?: UserResponse }> {
9398
const { username } = body;
9499

95100
if (!username || username.length < 3) {
@@ -112,7 +117,7 @@ export class UsersController extends Controller {
112117

113118
return {
114119
message: "User updated successfully",
115-
user: result.recordset[0] as UserRequest,
120+
user: result.recordset[0] as UserResponse,
116121
};
117122
}
118123
}

src/models/author.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ export interface AuthorCreateRequest {
44
surname?: string;
55
}
66

7-
export interface AuthorRequest {
8-
AuthorId: number;
9-
Middlename?: string;
10-
Name: string;
11-
Surname?: string;
7+
export interface AuthorResponse {
8+
authorId: number;
9+
middlename?: string;
10+
name: string;
11+
surname?: string;
1212
}
1313

1414
export interface AuthorUpdateRequest {

src/models/book.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
export interface BookAuthor {
2-
AuthorId: number;
3-
BookId: number;
1+
export interface BookAuthorCreateRequest {
2+
authorId: number;
43
}
54

6-
export interface BookAuthorCreateRequest {
5+
export interface BookAuthorResponse {
76
authorId: number;
7+
bookId: number;
88
}
99

1010
export interface BookCreateRequest {
@@ -17,7 +17,7 @@ export interface BookCreateRequest {
1717
year: number;
1818
}
1919

20-
export interface BookRequest {
20+
export interface BookResponse {
2121
bookId: number;
2222
createdAtUtc: string;
2323
createdBy: number;

src/models/language.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export interface CreateLanguageRequest {
22
languageCode: string;
33
}
4-
export interface LanguageRequest {
4+
export interface LanguageResponse {
55
languageCode: string;
66
languageId: number;
77
}

src/models/user.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ export interface UserCreateRequest {
22
username: string;
33
}
44

5-
export interface UserRequest {
5+
export interface UserResponse {
66
userId: number;
77
username: string;
88
}

0 commit comments

Comments
 (0)