This is the final project for Volvo .NET Academy
This application was created to extract travel news content from different sources to improve user experience by searching for unusual attractions and articles related to regions. Users can choose a region and find some attractions and articles. Users can rate regions based on their own experience or opinions about country, culture, and other useful factors.
There are main 4 models: Attraction, Article, Region, Review Admin can perform all CRUD operations with Attraction, Article, and Region and delete Reviews
- Admin can perform all CRUD operations with Attraction, Article, and Region and delete Reviews
- The User (no matter is authenticated or not) can see only Articles (higher or equal to MinPositivityRate set by Admin and stored in the Configuration table in the DB), Attractions, Regions, or Reviews
- User can also add their review assigned to a specific region (do you recommend region or not based on experience in a surrounding area)
- Finding articles Articles are fetched with the use of NewsApi and/or from the list of RSS configured in appsettings.json (it is skipped for regionName).
- Check if doesn't exist in the DB and take 60 (MAX_NUMBER) random articles
- Rate articles with ChatGptApi (model=gpt-4o)
- If something goes wrong with ChatGptApi, try to assign and rate articles by keywords matching algorithm
- If no errors try to store selected articles in the DB
- Get cities for region
- Use cities that are set for all regions (with geonames API) Take some cities to get attractions (search for attractions in a specific radius of the city (Foursquare Places Api))
- Store in the DB
Authentication is performed with ASP .Net Identity (AspNetUsers and Roles) You can restore your password and you must confirm your email after registration to use your rights Authorization was implemented with JWT Tokens. If you log in you'll receive your token to perform all tasks.
Frontend part is fully written in JS with React using the component library Material UI
communicate through ASP.NET API

- Serilog to display important information in a console and in a Log folder
- AutoMapper and DtoClasses for more flexible integration with the DB and nice-looking API models
- Swagger UI
- xUnit and Moq for testing services
appsettings.json
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Error",
"System": "Error"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "logs/log-.log",
"rollingInterval": "Day"
}
}
]
},
"ConnectionStrings": {
"TripAppDb": "ConnectionString"
},
"Jwt": {
"Key": "JwtKey",
"Issuer": "TripPlanner.com"
},
"AdminSettings": {
"Email": "admin@admin.com",
"Password": "Admin123!"
},
"Foursquare": {
"Key": "Foursquare Api Key for fetching attractions"
},
"RssFeeds": {
"Links": [
"https://1000daysoftravel.godaddysites.com/f.atom",
"https://feeds.feedburner.com/breakingtravelnews",
"https://feeds.bbci.co.uk/news/world/rss.xml",
"https://feeds.bbci.co.uk/news/world/europe/rss.xml",
"https://www.aljazeera.com/xml/rss/all.xml",
"http://rss.cnn.com/rss/edition_world.rss"
// Add other relevant RSS feed URLs here
]
},
"Ports": {
"Client": "https://localhost:5173",
"Server": "https://localhost:7279"
},
"NewsApi": {
"Key": "Key for fetching news from api"
},
"OpenAI": {
"Key": "key for ChatGptApi",
"Model": "gpt-4o"
},
"ProjectPath": "PATH_TO\\repos\\TripPlanner\\TripPlanner.Server",
"AllowedHosts": "*"
}
