Florin Bobiș commited on
Commit
77ebc6a
1 Parent(s): 27fff89

Super fast api

Browse files
Files changed (5) hide show
  1. .vscode/tasks.json +3 -3
  2. Dockerfile.original +0 -16
  3. GlobalData.cs +4 -0
  4. Program.cs +12 -6
  5. QuotesAPI.http +2 -2
.vscode/tasks.json CHANGED
@@ -7,7 +7,7 @@
7
  "type": "process",
8
  "args": [
9
  "build",
10
- "${workspaceFolder}/quotes-api-net.generated.sln",
11
  "/property:GenerateFullPaths=true",
12
  "/consoleloggerparameters:NoSummary;ForceNoAlign"
13
  ],
@@ -19,7 +19,7 @@
19
  "type": "process",
20
  "args": [
21
  "publish",
22
- "${workspaceFolder}/quotes-api-net.generated.sln",
23
  "/property:GenerateFullPaths=true",
24
  "/consoleloggerparameters:NoSummary;ForceNoAlign"
25
  ],
@@ -33,7 +33,7 @@
33
  "watch",
34
  "run",
35
  "--project",
36
- "${workspaceFolder}/quotes-api-net.generated.sln"
37
  ],
38
  "problemMatcher": "$msCompile"
39
  }
 
7
  "type": "process",
8
  "args": [
9
  "build",
10
+ "${workspaceFolder}/QuotesAPI.sln",
11
  "/property:GenerateFullPaths=true",
12
  "/consoleloggerparameters:NoSummary;ForceNoAlign"
13
  ],
 
19
  "type": "process",
20
  "args": [
21
  "publish",
22
+ "${workspaceFolder}/QuotesAPI.sln",
23
  "/property:GenerateFullPaths=true",
24
  "/consoleloggerparameters:NoSummary;ForceNoAlign"
25
  ],
 
33
  "watch",
34
  "run",
35
  "--project",
36
+ "${workspaceFolder}/QuotesAPI.sln"
37
  ],
38
  "problemMatcher": "$msCompile"
39
  }
Dockerfile.original DELETED
@@ -1,16 +0,0 @@
1
- FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
2
- # current folder
3
- WORKDIR /
4
-
5
- # Copy everything
6
- COPY . ./
7
- # Restore as distinct layers
8
- RUN dotnet restore
9
- # Build and publish a release
10
- RUN dotnet publish -c Release -o out
11
-
12
- # Build runtime image
13
- FROM mcr.microsoft.com/dotnet/aspnet:8.0
14
- WORKDIR /
15
- COPY --from=build-env /out .
16
- ENTRYPOINT ["dotnet", "QuotesAPI.dll"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
GlobalData.cs ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ public static class GlobalData
2
+ {
3
+ public static List<Quote> Quotes { get; set; }
4
+ }
Program.cs CHANGED
@@ -1,3 +1,4 @@
 
1
  using System.Text.Json;
2
  using Microsoft.EntityFrameworkCore;
3
 
@@ -32,10 +33,14 @@ app.MapGet("/quotes", async (QuoteDbContext db, int pageNumber = 1, int pageSize
32
  if (pageSize < 1) pageSize = 10;
33
  pageSize = Math.Min(pageSize, MaxPageSize); // Limit pageSize to MaxPageSize
34
 
35
- var quotes = await db.Quotes
 
 
 
 
36
  .Skip((pageNumber - 1) * pageSize)
37
  .Take(pageSize)
38
- .ToListAsync();
39
 
40
  return Results.Ok(quotes);
41
  });
@@ -84,22 +89,21 @@ app.MapDelete("/quotes/{id}", async (int id, QuoteDbContext db) =>
84
  // Random quote endpoint
85
  app.MapGet("/quotes/random", async (QuoteDbContext db) =>
86
  {
87
- var quoteCount = await db.Quotes.CountAsync();
88
  if (quoteCount == 0)
89
  return Results.NotFound("No quotes available.");
90
 
91
  var random = new Random();
92
  var randomIndex = random.Next(quoteCount);
93
 
94
- var randomQuote = await db.Quotes.Skip(randomIndex).Take(1).FirstOrDefaultAsync();
95
-
96
  return randomQuote != null ? Results.Ok(randomQuote) : Results.NotFound("No quote found.");
97
  });
98
 
99
  // Search quotes by author, categories, book, or quoteText with pagination
100
  app.MapGet("/quotes/search", async (string search, QuoteDbContext db, int pageNumber = 1, int pageSize = 10) =>
101
  {
102
- var query = db.Quotes.AsQueryable();
103
 
104
  if (!string.IsNullOrWhiteSpace(search))
105
  query = query.Where(q => q.Author.Contains(search));
@@ -224,6 +228,8 @@ using (var scope = app.Services.CreateScope())
224
  {
225
  var db = scope.ServiceProvider.GetRequiredService<QuoteDbContext>();
226
  db.Database.EnsureCreated();
 
 
227
  await SeedDatabase(db);
228
  }
229
 
 
1
+ using System.Linq;
2
  using System.Text.Json;
3
  using Microsoft.EntityFrameworkCore;
4
 
 
33
  if (pageSize < 1) pageSize = 10;
34
  pageSize = Math.Min(pageSize, MaxPageSize); // Limit pageSize to MaxPageSize
35
 
36
+ // var quotes = await db.Quotes
37
+ // .Skip((pageNumber - 1) * pageSize)
38
+ // .Take(pageSize)
39
+ // .ToListAsync();
40
+ var quotes = GlobalData.Quotes
41
  .Skip((pageNumber - 1) * pageSize)
42
  .Take(pageSize)
43
+ .ToList();
44
 
45
  return Results.Ok(quotes);
46
  });
 
89
  // Random quote endpoint
90
  app.MapGet("/quotes/random", async (QuoteDbContext db) =>
91
  {
92
+ var quoteCount = GlobalData.Quotes.Count(); //await db.Quotes.CountAsync();
93
  if (quoteCount == 0)
94
  return Results.NotFound("No quotes available.");
95
 
96
  var random = new Random();
97
  var randomIndex = random.Next(quoteCount);
98
 
99
+ var randomQuote = GlobalData.Quotes[randomIndex]; //await db.Quotes.Skip(randomIndex).Take(1).FirstOrDefaultAsync();
 
100
  return randomQuote != null ? Results.Ok(randomQuote) : Results.NotFound("No quote found.");
101
  });
102
 
103
  // Search quotes by author, categories, book, or quoteText with pagination
104
  app.MapGet("/quotes/search", async (string search, QuoteDbContext db, int pageNumber = 1, int pageSize = 10) =>
105
  {
106
+ var query = GlobalData.Quotes.AsQueryable(); //db.Quotes.AsQueryable();
107
 
108
  if (!string.IsNullOrWhiteSpace(search))
109
  query = query.Where(q => q.Author.Contains(search));
 
228
  {
229
  var db = scope.ServiceProvider.GetRequiredService<QuoteDbContext>();
230
  db.Database.EnsureCreated();
231
+
232
+ GlobalData.Quotes = await db.Quotes.ToListAsync();
233
  await SeedDatabase(db);
234
  }
235
 
QuotesAPI.http CHANGED
@@ -1,6 +1,6 @@
1
- @QuotesAPI_HostAddress = http://localhost:5058
2
 
3
- GET {{QuotesAPI_HostAddress}}/weatherforecast/
4
  Accept: application/json
5
 
6
  ###
 
1
+ @QuotesAPI_HostAddress = http://localhost:7860
2
 
3
+ GET {{QuotesAPI_HostAddress}}/quotes/random
4
  Accept: application/json
5
 
6
  ###