File size: 4,553 Bytes
e36e2eb
068485b
da13799
 
068485b
 
 
 
 
 
 
 
 
 
1a7e978
ccc2569
 
ee79726
ccc2569
ee79726
ccc2569
068485b
ed77e1a
068485b
 
ccc2569
e36e2eb
 
d8a7fc4
e36e2eb
 
 
 
 
 
 
 
 
 
 
 
ccc2569
6f32ae8
 
 
ace6185
 
 
 
 
 
6f32ae8
 
 
 
1a7e978
068485b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
da13799
ed77e1a
068485b
 
 
 
 
 
 
 
ccc2569
 
ee79726
ccc2569
068485b
ee79726
1a7e978
 
 
 
 
 
068485b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f32ae8
 
 
068485b
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using System.IO;
using System.Text;
using DbConnect.Data;
using DbConnect.Entities;
using Backend.Features.Auth;
using Backend.Features.Users;
using Backend.Features.Books;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Backend.Features.Subscriptions;
using Backend.Features.Categories;
using Backend.Features.Borrowings;
using Backend.Features.Loyalty;
using Backend.Features.Notification;
using Backend.Features.Wishlist;
using Backend.Features.Wallet;
using FirebaseAdmin;

using Google.Apis.Auth.OAuth2;

AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
var builder = WebApplication.CreateBuilder(args);

// Firebase Admin SDK Initialization
var firebaseConfig = Environment.GetEnvironmentVariable("FIREBASE_CONFIG");
if (!string.IsNullOrEmpty(firebaseConfig))
{
    FirebaseApp.Create(new AppOptions()
    {
        Credential = GoogleCredential.FromJson(firebaseConfig)
    });
}
else if (File.Exists("LibraryFirebase.json"))
{
    FirebaseApp.Create(new AppOptions()
    {
        Credential = GoogleCredential.FromFile("LibraryFirebase.json")
    });
}

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowWasm",
        policy => policy.WithOrigins(
                "https://localhost:7058",
                "http://localhost:5158",
                "https://librarymanagement-eosin-omega.vercel.app",
                "https://yuruyuruu-librarymanagement.hf.space"
            )
            .AllowAnyMethod()
            .AllowAnyHeader());
});


builder.Services.AddControllers();
builder.Services.AddAuthorization();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "Library Management API", Version = "v1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "JWT Authorization header using the Bearer scheme.",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        Scheme = "bearer",
        BearerFormat = "JWT"
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            },
            new string[] {}
        }
    });
});

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));

// Register Services
builder.Services.AddScoped<IAuthService, AuthService>();
builder.Services.AddScoped<IUserService, UserService>();
builder.Services.AddScoped<IBookService, BookService>();
builder.Services.AddScoped<ISubscriptionService, SubscriptionService>();
builder.Services.AddScoped<ICategoryService, CategoryService>();
builder.Services.AddScoped<IBorrowingService, BorrowingService>();
builder.Services.AddScoped<INotificationService, NotificationService>();
builder.Services.AddScoped<IWishlistService, WishlistService>();
builder.Services.AddScoped<IWalletService, WalletService>();
builder.Services.AddHostedService<NotificationBackgroundService>();


// Register Loyalty API Client
builder.Services.AddHttpClient<ILoyaltyService, LoyaltyService>(client =>
{
    client.BaseAddress = new Uri("http://150.95.88.91:4100");
});

// Configure JWT Authentication
var key = Encoding.ASCII.GetBytes(builder.Configuration["Jwt:Secret"] ?? "YourSuperSecretKeyForLibraryManagementSystem_AtLeast32CharsLong");
builder.Services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(key),
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        ValidAudience = builder.Configuration["Jwt:Audience"],
        ClockSkew = TimeSpan.Zero
    };
});

var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();

app.UseCors("AllowWasm");

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();