Repository: ugurkryl41/ReCapProject Branch: master Commit: a0bfb4633239 Files: 142 Total size: 158.8 KB Directory structure: gitextract_qx9n6vkf/ ├── .gitattributes ├── .gitignore ├── Business/ │ ├── Abstract/ │ │ ├── IAuthService.cs │ │ ├── IBrandService.cs │ │ ├── ICarImageService.cs │ │ ├── ICarService.cs │ │ ├── ICartService.cs │ │ ├── IColorService.cs │ │ ├── ICustomerService.cs │ │ ├── IPaymentService.cs │ │ ├── IRentalService.cs │ │ └── IUserService.cs │ ├── Business.csproj │ ├── BusinessAspects/ │ │ └── Autofac/ │ │ └── SecuredOperation.cs │ ├── Concrete/ │ │ ├── AuthManager.cs │ │ ├── BrandManager.cs │ │ ├── CarImageManager.cs │ │ ├── CarManager.cs │ │ ├── CartManager.cs │ │ ├── ColorManager.cs │ │ ├── CustomerManager.cs │ │ ├── PaymentManager.cs │ │ ├── RentalManager.cs │ │ └── UserManager.cs │ ├── Constants/ │ │ └── Messages.cs │ ├── DependencyResolvers/ │ │ └── Autofac/ │ │ └── AutofacBusinessModule.cs │ ├── Properties/ │ │ └── AssemblyInfo.cs │ ├── ValidationRules/ │ │ └── FluentValidation/ │ │ ├── BrandValidator.cs │ │ ├── CarImageValidator.cs │ │ ├── CarValidator.cs │ │ ├── ColorValidator.cs │ │ ├── CustomerValidator.cs │ │ ├── RentalValidator.cs │ │ └── UserValidator.cs │ ├── app.config │ └── packages.config ├── CarRentalQuery1.sql ├── ConsoleUI/ │ ├── ConsoleUI.csproj │ └── Program.cs ├── Core/ │ ├── Aspect/ │ │ └── Autofac/ │ │ ├── Caching/ │ │ │ ├── CacheAspect.cs │ │ │ └── CacheRemoveAspect.cs │ │ ├── Performance/ │ │ │ └── PerformanceAspect.cs │ │ ├── Transaction/ │ │ │ └── TransactionScopeAspect.cs │ │ └── Validation/ │ │ └── ValidationAspect.cs │ ├── Core.csproj │ ├── CrossCuttingConcerns/ │ │ ├── Caching/ │ │ │ ├── ICacheManager.cs │ │ │ └── Microsoft/ │ │ │ └── MemoryCacheManager.cs │ │ └── Validation/ │ │ └── ValidationTool.cs │ ├── DataAccess/ │ │ ├── EntityFramework/ │ │ │ └── EfEntityRepositoryBase.cs │ │ └── IEntityRepository.cs │ ├── DependencyResolvers/ │ │ └── CoreModule.cs │ ├── Entities/ │ │ ├── Concrete/ │ │ │ ├── OperationClaim.cs │ │ │ ├── User.cs │ │ │ └── UserOperationClaim.cs │ │ ├── IDto.cs │ │ └── IEntity.cs │ ├── Extensions/ │ │ ├── ClaimExtensions.cs │ │ ├── ClaimsPrincipalExtensions.cs │ │ ├── ErrorDetails.cs │ │ ├── ExceptionMiddleware.cs │ │ ├── ExceptionMiddlewareExtensions.cs │ │ └── ServiceCollectionExtensions.cs │ └── Utilities/ │ ├── Business/ │ │ └── BusinessRules.cs │ ├── FileHelper/ │ │ └── FileHelper.cs │ ├── Interceptors/ │ │ ├── AspectInterceptorSelector.cs │ │ ├── MethodInterception.cs │ │ └── MethodInterceptionBaseAttribute.cs │ ├── IoC/ │ │ ├── ICoreModule.cs │ │ └── ServiceTool.cs │ ├── Results/ │ │ ├── DataResult.cs │ │ ├── ErrorDataResult.cs │ │ ├── ErrorResult.cs │ │ ├── IDataResult.cs │ │ ├── IResult.cs │ │ ├── Result.cs │ │ ├── SuccessDataResult.cs │ │ └── SuccessResult.cs │ └── Security/ │ ├── Encryption/ │ │ ├── SecurityKeyHelper.cs │ │ └── SigningCredentialsHelper.cs │ ├── Hashing/ │ │ └── HashingHelper.cs │ └── Jwt/ │ ├── AccessToken.cs │ ├── ITokenHelper.cs │ ├── JwtHelper.cs │ └── TokenOptions.cs ├── DataAccess/ │ ├── Abstract/ │ │ ├── IBrandDal.cs │ │ ├── ICarDal.cs │ │ ├── ICarImageDal.cs │ │ ├── ICartDal.cs │ │ ├── IColorDal.cs │ │ ├── ICustomerDal.cs │ │ ├── IPaymentDal.cs │ │ ├── IRentalDal.cs │ │ └── IUserDal.cs │ ├── Concrete/ │ │ ├── EntityFramework/ │ │ │ ├── CarRentalContext.cs │ │ │ ├── EfBrandDal.cs │ │ │ ├── EfCarDal.cs │ │ │ ├── EfCarImageDal.cs │ │ │ ├── EfCartDal.cs │ │ │ ├── EfColorDal.cs │ │ │ ├── EfCustomerDal.cs │ │ │ ├── EfPaymentDal.cs │ │ │ ├── EfRentalDal.cs │ │ │ └── EfUserDal.cs │ │ └── InMemory/ │ │ └── InMemoryCarDal.cs │ └── DataAccess.csproj ├── Entities/ │ ├── Concrete/ │ │ ├── Brand.cs │ │ ├── Car.cs │ │ ├── CarImage.cs │ │ ├── Cart.cs │ │ ├── Color.cs │ │ ├── Customer.cs │ │ ├── Payment.cs │ │ └── Rental.cs │ ├── DTOs/ │ │ ├── CarDetailDto.cs │ │ ├── CustomerDetailDto.cs │ │ ├── RentalDetailDto.cs │ │ ├── UserForLoginDto.cs │ │ └── UserForRegisterDto.cs │ ├── Entities.csproj │ ├── Properties/ │ │ └── AssemblyInfo.cs │ └── app.config ├── README.md ├── ReCapProject.sln └── WebAPI/ ├── .config/ │ └── dotnet-tools.json ├── Controllers/ │ ├── AuthController.cs │ ├── BrandsController.cs │ ├── CarImagesController.cs │ ├── CarsController.cs │ ├── CartsController.cs │ ├── ColorsController.cs │ ├── CustomersController.cs │ ├── PaysController.cs │ ├── RentalsController.cs │ ├── UsersController.cs │ └── WeatherForecastController.cs ├── Program.cs ├── Properties/ │ └── launchSettings.json ├── Startup.cs ├── WeatherForecast.cs ├── WebAPI.csproj ├── appsettings.Development.json └── appsettings.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ ############################################################################### # Set default behavior to automatically normalize line endings. ############################################################################### * text=auto ############################################################################### # Set default behavior for command prompt diff. # # This is need for earlier builds of msysgit that does not have it on by # default for csharp files. # Note: This is only used by command line ############################################################################### #*.cs diff=csharp ############################################################################### # Set the merge driver for project and solution files # # Merging from the command prompt will add diff markers to the files if there # are conflicts (Merging from VS is not affected by the settings below, in VS # the diff markers are never inserted). Diff markers may cause the following # file extensions to fail to load in VS. An alternative would be to treat # these files as binary and thus will always conflict and require user # intervention with every merge. To do so, just uncomment the entries below ############################################################################### #*.sln merge=binary #*.csproj merge=binary #*.vbproj merge=binary #*.vcxproj merge=binary #*.vcproj merge=binary #*.dbproj merge=binary #*.fsproj merge=binary #*.lsproj merge=binary #*.wixproj merge=binary #*.modelproj merge=binary #*.sqlproj merge=binary #*.wwaproj merge=binary ############################################################################### # behavior for image files # # image files are treated as binary by default. ############################################################################### #*.jpg binary #*.png binary #*.gif binary ############################################################################### # diff behavior for common document formats # # Convert binary document formats to text before diffing them. This feature # is only available from the command line. Turn it on by uncommenting the # entries below. ############################################################################### #*.doc diff=astextplain #*.DOC diff=astextplain #*.docx diff=astextplain #*.DOCX diff=astextplain #*.dot diff=astextplain #*.DOT diff=astextplain #*.pdf diff=astextplain #*.PDF diff=astextplain #*.rtf diff=astextplain #*.RTF diff=astextplain ================================================ FILE: .gitignore ================================================ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.rsuser *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ # Visual Studio 2017 auto generated files Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUNIT *.VisualState.xml TestResult.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ # .NET Core project.lock.json project.fragment.lock.json artifacts/ # StyleCop StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c *_h.h *.ilk *.meta *.obj *.iobj *.pch *.pdb *.ipdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *_wpftmp.csproj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # Visual Studio Trace Files *.e2e # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # JustCode is a .NET coding add-in .JustCode # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # AxoCover is a Code Coverage Tool .axoCover/* !.axoCover/settings.json # Visual Studio code coverage results *.coverage *.coveragexml # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. !**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/[Pp]ackages/repositories.config # NuGet v3's project.json files produces more ignorable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !?*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.jfm *.pfx *.publishsettings orleans.codegen.cs # Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ *.rptproj.bak # SQL Server files *.mdf *.ldf *.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings *.rptproj.rsuser *- Backup*.rdl # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat node_modules/ # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # JetBrains Rider .idea/ *.sln.iml # CodeRush personal settings .cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ *.pyc # Cake - Uncomment if you are using it # tools/** # !tools/packages.config # Tabs Studio *.tss # Telerik's JustMock configuration file *.jmconfig # BizTalk build output *.btp.cs *.btm.cs *.odx.cs *.xsd.cs # OpenCover UI analysis results OpenCover/ # Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder .mfractor/ # Local History for Visual Studio .localhistory/ # BeatPulse healthcheck temp database healthchecksdb ================================================ FILE: Business/Abstract/IAuthService.cs ================================================ using Core.Entities.Concrete; using Core.Utilities.Results; using Core.Utilities.Security.Jwt; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface IAuthService { IDataResult Register(UserForRegisterDto userForRegisterDto); IDataResult Login(UserForLoginDto userForLoginDto); IResult UserExists(string email); IDataResult CreateAccessToken(User user); } } ================================================ FILE: Business/Abstract/IBrandService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface IBrandService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(Brand brand); IResult Update(Brand brand); IResult Delete(Brand brand); } } ================================================ FILE: Business/Abstract/ICarImageService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface ICarImageService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(CarImage carImage,IFormFile file); IResult Update(CarImage carImage, IFormFile file); IResult Delete(CarImage carImage); IDataResult> GetImagesByCarId(int id); IResult TransactionalOperation(CarImage carImage, IFormFile file); } } ================================================ FILE: Business/Abstract/ICarService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface ICarService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(Car car); IResult Update(Car car); IResult Delete(Car car); IDataResult GetCarDetail(int id); IDataResult> GetCarsByBrandId(int id); IDataResult> GetCarsByColorId(int id); IDataResult> GetCarDetails(); IDataResult> GetCarDetailsByBrandColor(int brandid,int colorid); IDataResult> GetCarDetailsByCarId(int id); IDataResult> GetCarDetailsByBrandId(int id); IDataResult> GetCarDetailsByColorId(int id); } } ================================================ FILE: Business/Abstract/ICartService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface ICartService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(Cart cart); IResult Update(Cart cart); IResult Delete(Cart cart); IDataResult> GetAllByCustomerId(int customerId); } } ================================================ FILE: Business/Abstract/IColorService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface IColorService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(Color color); IResult Update(Color color); IResult Delete(Color color); } } ================================================ FILE: Business/Abstract/ICustomerService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface ICustomerService { IDataResult> GetAll(); IDataResult Get(int id); IDataResult GetbyUser(int id); IResult Add(Customer customer); IResult Delete(Customer customer); IResult Update(Customer customer); IDataResult> GetCustomerDetails(); } } ================================================ FILE: Business/Abstract/IPaymentService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface IPaymentService { IResult Add(Payment payment); } } ================================================ FILE: Business/Abstract/IRentalService.cs ================================================ using Core.Utilities.Results; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface IRentalService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(Rental rental); IResult Delete(Rental rental); IResult Update(Rental rental); IResult DateCheck(Rental rental); IDataResult> GetRentalDetails(); IDataResult> GetRentalDetailsByCarId(int carId); } } ================================================ FILE: Business/Abstract/IUserService.cs ================================================ using Core.Entities.Concrete; using Core.Utilities.Results; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Abstract { public interface IUserService { IDataResult> GetAll(); IDataResult Get(int id); IResult Add(User user); IResult Delete(User user); IResult Update(User user); IDataResult> GetClaims(User user); IDataResult GetByMail(string email); } } ================================================ FILE: Business/Business.csproj ================================================  Debug AnyCPU {710A9967-AB8D-42BF-ACC4-51E19AD024F1} Library Properties Business Business v4.7.2 512 true true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 ..\packages\Autofac.6.1.0\lib\netstandard2.0\Autofac.dll ..\packages\Autofac.Extensions.DependencyInjection.7.1.0\lib\netstandard2.0\Autofac.Extensions.DependencyInjection.dll ..\packages\Autofac.Extras.DynamicProxy.6.0.0\lib\netstandard2.0\Autofac.Extras.DynamicProxy.dll ..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll ..\packages\FluentValidation.9.5.1\lib\net461\FluentValidation.dll ..\packages\Microsoft.AspNetCore.Http.2.2.2\lib\netstandard2.0\Microsoft.AspNetCore.Http.dll ..\packages\Microsoft.AspNetCore.Http.Abstractions.2.2.0\lib\netstandard2.0\Microsoft.AspNetCore.Http.Abstractions.dll ..\packages\Microsoft.AspNetCore.Http.Features.5.0.0\lib\net461\Microsoft.AspNetCore.Http.Features.dll ..\packages\Microsoft.AspNetCore.WebUtilities.2.2.0\lib\netstandard2.0\Microsoft.AspNetCore.WebUtilities.dll ..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.1\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll ..\packages\Microsoft.Extensions.DependencyInjection.3.1.12\lib\net461\Microsoft.Extensions.DependencyInjection.dll ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.12\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll ..\packages\Microsoft.Extensions.ObjectPool.2.2.0\lib\netstandard2.0\Microsoft.Extensions.ObjectPool.dll ..\packages\Microsoft.Extensions.Options.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Options.dll ..\packages\Microsoft.Extensions.Primitives.5.0.0\lib\net461\Microsoft.Extensions.Primitives.dll ..\packages\Microsoft.Net.Http.Headers.2.2.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll ..\packages\System.ComponentModel.Annotations.4.5.0\lib\net461\System.ComponentModel.Annotations.dll ..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll ..\packages\System.IO.Pipelines.5.0.1\lib\net461\System.IO.Pipelines.dll ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll ..\packages\System.Text.Encodings.Web.4.5.0\lib\netstandard2.0\System.Text.Encodings.Web.dll ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll {185e58ed-316c-45f6-8472-03592bb71a21} Core {dfa505e2-14b4-462a-8dda-09eeffad1018} DataAccess {d8f5692b-bd1d-47cf-8b64-45317038c94e} Entities ================================================ FILE: Business/BusinessAspects/Autofac/SecuredOperation.cs ================================================ using Business.Constants; using Castle.DynamicProxy; using Core.Utilities.Interceptors; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Core.Extensions; using Core.Utilities.IoC; namespace Business.BusinessAspects.Autofac { public class SecuredOperation:MethodInterception { private string[] _roles; private IHttpContextAccessor _httpContextAccessor; public SecuredOperation(string roles) { _roles = roles.Split(','); _httpContextAccessor = ServiceTool.ServiceProvider.GetService(); } protected override void OnBefore(IInvocation invocation) { var roleClaims = _httpContextAccessor.HttpContext.User.ClaimRoles(); foreach (var role in _roles) { if (roleClaims.Contains(role)) { return; } } throw new Exception(Messages.AuthorizationDenied); } } } ================================================ FILE: Business/Concrete/AuthManager.cs ================================================ using Business.Abstract; using Business.Constants; using Core.Entities.Concrete; using Core.Utilities.Results; using Core.Utilities.Security.Hashing; using Core.Utilities.Security.Jwt; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class AuthManager : IAuthService { private IUserService _userService; private ITokenHelper _tokenHelper; public AuthManager(IUserService userService, ITokenHelper tokenHelper) { _userService = userService; _tokenHelper = tokenHelper; } public IDataResult CreateAccessToken(User user) { var claims = _userService.GetClaims(user).Data; var accessToken = _tokenHelper.CreateToken(user, claims); return new SuccessDataResult(accessToken, Messages.AccessTokenCreated); } public IDataResult Login(UserForLoginDto userForLoginDto) { var userToCheck = _userService.GetByMail(userForLoginDto.Email).Data; if (userToCheck == null) { return new ErrorDataResult("Kullanıcı yok"); } if (!HashingHelper.VerifyPasswordHash(userForLoginDto.Password, userToCheck.PasswordHash, userToCheck.PasswordSalt)) { return new ErrorDataResult("Parola hatası"); } return new SuccessDataResult(userToCheck, Messages.SuccessfulLogin); } public IDataResult Register(UserForRegisterDto userForRegisterDto) { byte[] passwordHash, passwordSalt; HashingHelper.CreatePasswordHash(userForRegisterDto.Password, out passwordHash, out passwordSalt); var user = new User { Email = userForRegisterDto.Email, FirstName = userForRegisterDto.FirstName, LastName = userForRegisterDto.LastName, PasswordHash = passwordHash, PasswordSalt = passwordSalt, Status = true, Findeks = 200, }; _userService.Add(user); return new SuccessDataResult(user, Messages.UserRegistered); } public IResult UserExists(string email) { if (_userService.GetByMail(email).Data != null) { return new ErrorResult(Messages.UserAlreadyExists); } return new SuccessResult(); } } } ================================================ FILE: Business/Concrete/BrandManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Validation; using Core.CrossCuttingConcerns.Validation; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class BrandManager : IBrandService { IBrandDal _brandDal; public BrandManager(IBrandDal brandDal) { _brandDal = brandDal; } [SecuredOperation("brand.add,Admin", Priority = 1)] [ValidationAspect(typeof(BrandValidator))] public IResult Add(Brand brand) { _brandDal.Add(brand); return new SuccessResult(); } [SecuredOperation("brand.delete,Admin", Priority = 1)] public IResult Delete(Brand brand) { _brandDal.Delete(brand); return new SuccessResult(); } public IDataResult Get(int Id) { return new SuccessDataResult( _brandDal.Get(p=>p.Id == Id)); } public IDataResult> GetAll() { return new SuccessDataResult>(_brandDal.GetAll()); } [SecuredOperation("brand.update,Admin", Priority = 1)] [ValidationAspect(typeof(BrandValidator))] public IResult Update(Brand brand) { _brandDal.Update(brand); return new SuccessResult(); } } } ================================================ FILE: Business/Concrete/CarImageManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.Constants; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Caching; using Core.Aspect.Autofac.Performance; using Core.Aspect.Autofac.Transaction; using Core.Aspect.Autofac.Validation; using Core.Utilities.Business; using Core.Utilities.FileHelper; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; namespace Business.Concrete { public class CarImageManager : ICarImageService { ICarImageDal _carImageDal; public CarImageManager(ICarImageDal carImageDal) { _carImageDal = carImageDal; } [SecuredOperation("carimages.add,Admin", Priority = 1)] [ValidationAspect(typeof(CarImageValidator))] [CacheRemoveAspect("ICarImageService.Get")] public IResult Add(CarImage carImage, IFormFile file) { IResult result = BusinessRules.Run( CheckIfImageLimit(carImage.CarId) ); if (result != null) { return result; } carImage.ImagePath = FileHelper.AddAsync(file); _carImageDal.Add(carImage); return new SuccessResult(); } [SecuredOperation("carimages.update", Priority = 1)] [ValidationAspect(typeof(CarImageValidator))] [CacheRemoveAspect("ICarImageService.Get")] public IResult Update(CarImage carImage, IFormFile file) { var oldpath = $@"{Environment.CurrentDirectory}\wwwroot{_carImageDal.Get(p => p.Id == carImage.Id).ImagePath}"; carImage.ImagePath = FileHelper.UpdateAsync(oldpath, file); _carImageDal.Update(carImage); return new SuccessResult(); } [SecuredOperation("carimages.delete", Priority = 1)] [CacheRemoveAspect("ICarImageService.Get")] public IResult Delete(CarImage carImage) { var oldpath = $@"{Environment.CurrentDirectory}\wwwroot{_carImageDal.Get(p => p.Id == carImage.Id).ImagePath}"; FileHelper.DeleteAsync(oldpath); _carImageDal.Delete(carImage); return new SuccessResult(); } public IDataResult Get(int Id) { return new SuccessDataResult(_carImageDal.Get(p => p.Id == Id)); } [PerformanceAspect(5)] public IDataResult> GetAll() { //Thread.Sleep(6000); return new SuccessDataResult>(_carImageDal.GetAll()); } [CacheAspect(duration: 10)] public IDataResult> GetImagesByCarId(int CarId) { var result = _carImageDal.GetAll(c => c.CarId == CarId).Any(); if (!result) { List carimage = new List(); carimage.Add(new CarImage { CarId = CarId, ImagePath = @"\Images\default1.jpg" }); return new SuccessDataResult>(carimage); } return new SuccessDataResult>(_carImageDal.GetAll(p => p.CarId == CarId)); } private IResult CheckIfImageLimit(int CarId) { var carImagecount = _carImageDal.GetAll(p => p.CarId == CarId).Count; if (carImagecount >= 5) { return new ErrorResult(Messages.FailAddedImageLimit); } return new SuccessResult(); } [TransactionScopeAspect] public IResult TransactionalOperation(CarImage carImage, IFormFile file) { Add(carImage, file); Update(carImage, file); return new SuccessResult(Messages.CarImageUpdated); } } } ================================================ FILE: Business/Concrete/CarManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.Constants; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Validation; using Core.CrossCuttingConcerns.Validation; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class CarManager : ICarService { ICarDal _carDal; IBrandDal _brandDal; IColorDal _colorDal; public CarManager(ICarDal carDal, IBrandDal brandDal, IColorDal colorDal) { _carDal = carDal; _brandDal = brandDal; _colorDal = colorDal; } [SecuredOperation("car.add", Priority = 1)] [ValidationAspect(typeof(CarValidator))] public IResult Add(Car car) { _carDal.Add(car); return new SuccessResult(Messages.CarAdded); } [SecuredOperation("car.delete", Priority = 1)] public IResult Delete(Car car) { _carDal.Delete(car); return new SuccessResult(Messages.CarDeleted); } [SecuredOperation("car.update", Priority = 1)] [ValidationAspect(typeof(CarValidator))] public IResult Update(Car car) { _carDal.Update(car); return new SuccessResult(Messages.CarUpdated); } public IDataResult Get(int Id) { return new SuccessDataResult(_carDal.Get(p => p.Id == Id)); } public IDataResult> GetAll() { return new SuccessDataResult>(_carDal.GetAll()); } public IDataResult> GetCarsByBrandId(int Id) { return new SuccessDataResult>(_carDal.GetAll(p => p.BrandId == Id)); } public IDataResult> GetCarsByColorId(int Id) { return new SuccessDataResult>(_carDal.GetAll(p => p.ColorId == Id)); } public IDataResult> GetCarDetails() { return new SuccessDataResult>(_carDal.GetCarDetails()); } public IDataResult> GetCarDetailsByBrandId(int id) { return new SuccessDataResult>(_carDal.GetCarDetails().Where(p => p.BrandName == _brandDal.Get(t => t.Id == id).BrandName).ToList()); } public IDataResult> GetCarDetailsByColorId(int id) { return new SuccessDataResult>(_carDal.GetCarDetails().Where(p => p.ColorName == _colorDal.Get(t => t.Id == id).ColorName).ToList()); } public IDataResult> GetCarDetailsByCarId(int id) { return new SuccessDataResult>(_carDal.GetCarDetails().Where(p => p.Id == id).ToList()); } public IDataResult> GetCarDetailsByBrandColor(int brandid, int colorid) { return new SuccessDataResult>(_carDal.GetCarDetails() .Where(p => p.BrandName == _brandDal.Get(t => t.Id == brandid).BrandName) .Where(k => k.ColorName == _colorDal.Get(s => s.Id == colorid).ColorName).ToList()); } public IDataResult GetCarDetail(int id) { return new SuccessDataResult(_carDal.GetCarDetails().Where(p => p.Id == id).ToList().First()); } } } ================================================ FILE: Business/Concrete/CartManager.cs ================================================ using Business.Abstract; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class CartManager : ICartService { ICartDal _cartDal; public CartManager(ICartDal cartDal) { _cartDal = cartDal; } public IResult Add(Cart cart) { _cartDal.Add(cart); return new SuccessResult("Kart Ekleme Başarılı.."); } public IResult Delete(Cart cart) { _cartDal.Delete(cart); return new SuccessResult("Kart Silme Başarılı.."); } public IDataResult Get(int id) { var result = _cartDal.Get(p => p.Id == id); return new SuccessDataResult(result); } public IDataResult> GetAll() { return new SuccessDataResult>(_cartDal.GetAll().ToList()); } public IDataResult> GetAllByCustomerId(int customerId) { var result = _cartDal.GetAll(p => p.CustomerId == customerId); return new SuccessDataResult>(result); } public IResult Update(Cart cart) { _cartDal.Update(cart); return new SuccessResult("Kart Güncelleme Başarılı.."); } } } ================================================ FILE: Business/Concrete/ColorManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Validation; using Core.CrossCuttingConcerns.Validation; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class ColorManager : IColorService { IColorDal _colorDal; public ColorManager(IColorDal colorDal) { _colorDal = colorDal; } [SecuredOperation("color.add", Priority = 1)] [ValidationAspect(typeof(ColorValidator))] public IResult Add(Color color) { _colorDal.Add(color); return new SuccessResult(); } [SecuredOperation("color.delete", Priority = 1)] public IResult Delete(Color color) { _colorDal.Delete(color); return new SuccessResult(); } public IDataResult Get(int Id) { return new SuccessDataResult(_colorDal.Get(p=>p.Id==Id)); } public IDataResult> GetAll() { return new SuccessDataResult>(_colorDal.GetAll()); } [SecuredOperation("color.update", Priority = 1)] [ValidationAspect(typeof(ColorValidator))] public IResult Update(Color color) { _colorDal.Update(color); return new SuccessResult(); } } } ================================================ FILE: Business/Concrete/CustomerManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Validation; using Core.CrossCuttingConcerns.Validation; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class CustomerManager:ICustomerService { ICustomerDal _customerDal; public CustomerManager(ICustomerDal customerDal) { _customerDal = customerDal; } //[SecuredOperation("customer.add", Priority = 1)] [ValidationAspect(typeof(CustomerValidator))] public IResult Add(Customer customer) { _customerDal.Add(customer); return new SuccessResult(); } //[SecuredOperation("customer.delete", Priority = 1)] public IResult Delete(Customer customer) { _customerDal.Delete(customer); return new SuccessResult(); } public IDataResult Get(int Id) { return new SuccessDataResult(_customerDal.Get(p => p.Id == Id)); } public IDataResult> GetAll() { return new SuccessDataResult>(_customerDal.GetAll()); } public IDataResult GetbyUser(int id) { return new SuccessDataResult(_customerDal.Get(p => p.UserId == id)); } public IDataResult> GetCustomerDetails() { return new SuccessDataResult>(_customerDal.GetCustomerDetails()); } //[SecuredOperation("customer.update", Priority = 1)] [ValidationAspect(typeof(CustomerValidator))] public IResult Update(Customer customer) { _customerDal.Update(customer); return new SuccessResult(); } } } ================================================ FILE: Business/Concrete/PaymentManager.cs ================================================ using Business.Abstract; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class PaymentManager : IPaymentService { IPaymentDal _paymentDal; public PaymentManager(IPaymentDal paymentDal) { _paymentDal = paymentDal; } public IResult Add(Payment payment) { _paymentDal.Add(payment); return new SuccessResult(); } } } ================================================ FILE: Business/Concrete/RentalManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.Constants; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Validation; using Core.CrossCuttingConcerns.Validation; using Core.Utilities.Business; using Core.Utilities.Results; using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class RentalManager : IRentalService { IRentalDal _rentalDal; ICarDal _carDal; public RentalManager(IRentalDal rentalDal, ICarDal carDal) { _rentalDal = rentalDal; _carDal = carDal; } //[SecuredOperation("rental.add", Priority = 1)] [ValidationAspect(typeof(RentalValidator))] public IResult Add(Rental rental) { IResult result = BusinessRules.Run( CheckIfCar(rental) ); if (result != null) { return result; } _rentalDal.Add(rental); return new SuccessResult(Messages.CarRental); } public IResult DateCheck(Rental rental) { var result = _rentalDal.GetAll().Where(p => p.CarId == rental.CarId && p.ReturnDate > rental.ReturnDate).ToList(); if( result.Count != 0) { return new ErrorResult(); } return new SuccessResult(); } [SecuredOperation("rental.delete", Priority = 1)] public IResult Delete(Rental rental) { _rentalDal.Delete(rental); return new SuccessResult(); } public IDataResult Get(int id) { return new SuccessDataResult(_rentalDal.Get(p => p.Id == id)); } public IDataResult> GetAll() { return new SuccessDataResult>(_rentalDal.GetAll()); } public IDataResult> GetRentalDetails() { return new SuccessDataResult>(_rentalDal.GetRentalDetails()); } public IDataResult> GetRentalDetailsByCarId(int carId) { return new SuccessDataResult>(_rentalDal.GetRentalDetails() .Where(p=>p.CarId == carId).ToList()); } [SecuredOperation("rental.update", Priority = 1)] public IResult Update(Rental rental) { _rentalDal.Update(rental); return new SuccessResult(); } private IResult CheckIfCar(Rental rental) { var result = _rentalDal.GetAll(p => p.CarId == rental.CarId).Where(t => rental.RentDate > t.RentDate && rental.RentDate < t.ReturnDate).ToList(); if (result.Count != 0) { return new ErrorResult("Araç Kullanımda"); } return new SuccessResult(); } } } ================================================ FILE: Business/Concrete/UserManager.cs ================================================ using Business.Abstract; using Business.BusinessAspects.Autofac; using Business.ValidationRules.FluentValidation; using Core.Aspect.Autofac.Validation; using Core.CrossCuttingConcerns.Validation; using Core.Entities.Concrete; using Core.Utilities.Results; using DataAccess.Abstract; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Business.Concrete { public class UserManager : IUserService { IUserDal _userDal; public UserManager(IUserDal userDal) { _userDal = userDal; } [ValidationAspect(typeof(UserValidator))] public IResult Add(User user) { _userDal.Add(user); return new SuccessResult(); } public IResult Delete(User user) { _userDal.Delete(user); return new SuccessResult(); } public IDataResult Get(int id) { return new SuccessDataResult(_userDal.Get(p=>p.Id == id)); } public IDataResult> GetAll() { return new SuccessDataResult>(_userDal.GetAll()); } public IDataResult GetByMail(string email) { return new SuccessDataResult(_userDal.Get(p=>p.Email == email)); } public IDataResult> GetClaims(User user) { return new SuccessDataResult>(_userDal.GetClaims(user)); } public IResult Update(User user) { _userDal.Update(user); return new SuccessResult(); } } } ================================================ FILE: Business/Constants/Messages.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.Constants { public static class Messages { public static string CarAdded = "Araba bilgileri eklendi"; public static string CarUpdated = "Araba bilgileri güncellendi"; public static string CarDeleted = "Araba bilgileri silindi"; public static string CarInvalidName = "İsim geçersiz"; public static string ImagesAdded="resim eklendi"; public static string FailAddedImageLimit="Resim limitine erişildi!"; public static string CarRental="Araç Kiralandı"; public static string SuccessfulLogin = "Sisteme giriş başarılı"; public static string UserAlreadyExists = "Bu kullanıcı zaten mevcut"; public static string UserRegistered = "Kullanıcı başarıyla kaydedildi"; public static string AccessTokenCreated = "Access token başarıyla oluşturuldu"; public static string AuthorizationDenied = "Yetkiniz yok"; public static string ProductNameAlreadyExists = "Ürün ismi zaten mevcut"; public static string CarImageUpdated="Araba resmi güncellendi"; } } ================================================ FILE: Business/DependencyResolvers/Autofac/AutofacBusinessModule.cs ================================================ using Autofac; using Autofac.Extras.DynamicProxy; using Business.Abstract; using Business.Concrete; using Castle.DynamicProxy; using Core.Utilities.Interceptors; using Core.Utilities.Security.Jwt; using DataAccess.Abstract; using DataAccess.Concrete.EntityFramework; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.DependencyResolvers.Autofac { public class AutofacBusinessModule:Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); var assembly = System.Reflection.Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces() .EnableInterfaceInterceptors(new ProxyGenerationOptions() { Selector = new AspectInterceptorSelector() }).SingleInstance(); } } } ================================================ FILE: Business/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Bir bütünleştirilmiş koda ilişkin Genel Bilgiler aşağıdaki öznitelikler kümesiyle // denetlenir. Bütünleştirilmiş kod ile ilişkili bilgileri değiştirmek için // bu öznitelik değerlerini değiştirin. [assembly: AssemblyTitle("Business")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Business")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // ComVisible özniteliğinin false olarak ayarlanması bu bütünleştirilmiş koddaki türleri // COM bileşenleri için görünmez yapar. Bu bütünleştirilmiş koddaki bir türe // erişmeniz gerekirse ComVisible özniteliğini o türde true olarak ayarlayın. [assembly: ComVisible(false)] // Bu proje COM'un kullanımına sunulursa, aşağıdaki GUID tür kitaplığının kimliği içindir [assembly: Guid("710a9967-ab8d-42bf-acc4-51e19ad024f1")] // Bir derlemenin sürüm bilgileri aşağıdaki dört değerden oluşur: // // Ana Sürüm // İkincil Sürüm // Yapı Numarası // Düzeltme // // Tüm değerleri belirtebilir veya varsayılan Derleme ve Düzeltme Numaralarını kullanmak için // aşağıda gösterildiği gibi '*' kullanabilirsiniz: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Business/ValidationRules/FluentValidation/BrandValidator.cs ================================================ using Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class BrandValidator:AbstractValidator { public BrandValidator() { RuleFor(p => p.BrandName).NotEmpty(); RuleFor(p => p.BrandName).MinimumLength(3); RuleFor(p => p.BrandName).NotNull(); } } } ================================================ FILE: Business/ValidationRules/FluentValidation/CarImageValidator.cs ================================================ using Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class CarImageValidator : AbstractValidator { public CarImageValidator() { RuleFor(p => p.CarId).NotEmpty(); } } } ================================================ FILE: Business/ValidationRules/FluentValidation/CarValidator.cs ================================================ using Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class CarValidator : AbstractValidator { public CarValidator() { RuleFor(p => p.Description).MinimumLength(2).WithMessage("Description must be at least 2 characters"); RuleFor(p => p.Description).NotEmpty(); RuleFor(p => p.Description).NotNull(); RuleFor(p => p.DailyPrice).GreaterThan(0); RuleFor(p => p.DailyPrice).NotEmpty(); RuleFor(p => p.DailyPrice).GreaterThanOrEqualTo(100).When(p => p.BrandId == 1); RuleFor(p => p.ModelYear).LessThan(DateTime.Now.Year); RuleFor(p => p.ModelYear).NotEmpty(); RuleFor(p => p.BrandId).GreaterThan(0); RuleFor(p => p.BrandId).NotEmpty(); RuleFor(p => p.ColorId).GreaterThan(0); RuleFor(p => p.ColorId).NotEmpty(); //RuleFor(p => p.Description).Must(StartWithA).When(p=>p.Description!=null).WithMessage("Description Must start with the letter A"); } private bool StartWithA(string arg) { return arg.StartsWith("A"); } } } ================================================ FILE: Business/ValidationRules/FluentValidation/ColorValidator.cs ================================================ using Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class ColorValidator:AbstractValidator { public ColorValidator() { RuleFor(p => p.ColorName).NotEmpty(); RuleFor(p => p.ColorName).NotNull(); RuleFor(p => p.ColorName).MinimumLength(3); } } } ================================================ FILE: Business/ValidationRules/FluentValidation/CustomerValidator.cs ================================================ using Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class CustomerValidator : AbstractValidator { public CustomerValidator() { RuleFor(p => p.UserId).GreaterThan(0); RuleFor(p => p.UserId).NotEmpty(); RuleFor(p => p.CompanyName).NotNull(); RuleFor(p => p.CompanyName).NotEmpty(); RuleFor(p => p.CompanyName).MinimumLength(2); } } } ================================================ FILE: Business/ValidationRules/FluentValidation/RentalValidator.cs ================================================ using Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class RentalValidator:AbstractValidator { public RentalValidator() { RuleFor(p => p.CarId).GreaterThan(0); RuleFor(p => p.CarId).NotEmpty(); RuleFor(p => p.CustomerId).GreaterThan(0); RuleFor(p => p.CustomerId).NotEmpty(); RuleFor(p => p.RentDate).Equals(DateTime.Now); RuleFor(p => p.RentDate).NotEmpty(); RuleFor(p => p.ReturnDate).GreaterThan(DateTime.Now); RuleFor(p => p.ReturnDate).NotEmpty(); } } } ================================================ FILE: Business/ValidationRules/FluentValidation/UserValidator.cs ================================================ using Core.Entities.Concrete; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Business.ValidationRules.FluentValidation { public class UserValidator : AbstractValidator { public UserValidator() { RuleFor(p => p.FirstName).NotNull(); RuleFor(p => p.FirstName).NotEmpty(); RuleFor(p => p.LastName).NotNull(); RuleFor(p => p.LastName).NotEmpty(); RuleFor(p => p.Email).Must(MailCheck).When(p=>p.Email != null).WithMessage("IsValid Mail"); RuleFor(p => p.Email).NotEmpty(); RuleFor(p => p.Email).NotNull(); } private bool MailCheck(string arg) { return arg.Contains("@"); } } } ================================================ FILE: Business/app.config ================================================  ================================================ FILE: Business/packages.config ================================================  ================================================ FILE: CarRentalQuery1.sql ================================================ CREATE TABLE [dbo].[Colors] ( [Id] INT IDENTITY (1, 1) NOT NULL, [ColorName] VARCHAR (20) NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[Brands] ( [Id] INT IDENTITY (1, 1) NOT NULL, [BrandName] VARCHAR (50) NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[Cars] ( [Id] INT IDENTITY (1, 1) NOT NULL, [BrandId] INT NULL, [ColorId] INT NULL, [ModelYear] INT NULL, [DailyPrice] MONEY NULL, [Description] VARCHAR (50) NULL, CONSTRAINT [PK_Cars] PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_Cars] FOREIGN KEY ([BrandId]) REFERENCES [dbo].[Brands] ([Id]), CONSTRAINT [FK_Cars2] FOREIGN KEY ([ColorId]) REFERENCES [dbo].[Colors] ([Id]) ); CREATE TABLE [dbo].[Users] ( [Id] INT IDENTITY (1, 1) NOT NULL, [FirstName] VARCHAR (50) NULL, [LastName] VARCHAR (50) NULL, [Email] VARCHAR (50) NULL, [PasswordSalt] VARBINARY (500) NULL, [PasswordHash] VARBINARY (500) NULL, [Status] BIT NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[Customers] ( [Id] INT IDENTITY (1, 1) NOT NULL, [UserId] INT NULL, [CompanyName] VARCHAR (50) NULL, PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[Users] ([Id]) ); CREATE TABLE [dbo].[Rentals] ( [Id] INT IDENTITY (1, 1) NOT NULL, [CarId] INT NULL, [CustomerId] INT NULL, [RentDate] DATETIME NULL, [ReturnDate] DATETIME NULL, PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_Rentals_Cars] FOREIGN KEY ([CarId]) REFERENCES [dbo].[Cars] ([Id]), CONSTRAINT [FK_Rentals_Customers] FOREIGN KEY ([CustomerId]) REFERENCES [dbo].[Customers] ([Id]) ); CREATE TABLE [dbo].[CarImages] ( [Id] INT IDENTITY (1, 1) NOT NULL, [CarId] INT NULL, [ImagePath] NVARCHAR (MAX) NULL, [Date] DATETIME NULL, PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_CarImages_Cars] FOREIGN KEY ([CarId]) REFERENCES [dbo].[Cars] ([Id]) ); CREATE TABLE [dbo].[OperationClaims] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (250) NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[UserOperationClaims] ( [Id] INT IDENTITY (1, 1) NOT NULL, [UserId] INT NOT NULL, [OperationClaimId] INT NOT NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); ================================================ FILE: ConsoleUI/ConsoleUI.csproj ================================================ Exe netcoreapp3.1 ================================================ FILE: ConsoleUI/Program.cs ================================================ using Business.Concrete; using DataAccess.Concrete.EntityFramework; using DataAccess.Concrete.InMemory; using Entities.Concrete; using System; namespace ConsoleUI { class Program { static void Main(string[] args) { //RentalManager rentalManager = new RentalManager(new EfRentalDal()); //var rentcar = new Rental {CarId=4,CustomerId=2,RentDate=DateTime.Now,ReturnDate=DateTime.Now.AddDays(2) }; //Console.WriteLine(rentalManager.Add(rentcar).Message); //foreach (var rent in rentalManager.GetAll().Data) //{ // Console.WriteLine("Id:{0} CarId={1} CustomerId:{2} RentDate:{3} ReturnDate:{4}",rent.Id,rent.CarId,rent.CustomerId,rent.RentDate,rent.ReturnDate); //} /*foreach (var rentalDetail in rentalManager.GetRentalDetails().Data) { Console.WriteLine("Id: {0} CarName: {1} BrandName: {2} ColorName: {3} CompanyName: {4} FirstName: {5} LastName: {6} RentDate: {7} ReturnDate: {8} ", rentalDetail.Id, rentalDetail.CarName,rentalDetail.BrandName,rentalDetail.ColorName,rentalDetail.CompanyName,rentalDetail.FirstName,rentalDetail.LastName, rentalDetail.RentDate.ToString("MM/dd/yyyy"), rentalDetail.ReturnDate.ToString("MM/dd/yyyy")); }*/ //DateTime.Now.ToString("MM/dd/yyyy") } } } ================================================ FILE: Core/Aspect/Autofac/Caching/CacheAspect.cs ================================================ using Castle.DynamicProxy; using Core.CrossCuttingConcerns.Caching; using Core.Utilities.Interceptors; using Core.Utilities.IoC; using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.DependencyInjection; using System.Linq; namespace Core.Aspect.Autofac.Caching { public class CacheAspect:MethodInterception { private int _duration; private ICacheManager _cacheManager; public CacheAspect(int duration=60) { _duration = duration; _cacheManager = ServiceTool.ServiceProvider.GetService(); } public override void Intercept(IInvocation invocation) { var methodName = string.Format($"{invocation.Method.ReflectedType.FullName}.{invocation.Method.Name}"); var arguments = invocation.Arguments.ToList(); var key = $"{methodName}({string.Join(",", arguments.Select(x => x?.ToString() ?? ""))})"; if (_cacheManager.IsAdd(key)) { invocation.ReturnValue = _cacheManager.Get(key); return; } invocation.Proceed(); _cacheManager.Add(key, invocation.ReturnValue, _duration); } } } ================================================ FILE: Core/Aspect/Autofac/Caching/CacheRemoveAspect.cs ================================================ using Castle.DynamicProxy; using Core.CrossCuttingConcerns.Caching; using Core.Utilities.Interceptors; using Core.Utilities.IoC; using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.DependencyInjection; namespace Core.Aspect.Autofac.Caching { public class CacheRemoveAspect:MethodInterception { private string _pattern; private ICacheManager _cacheManager; public CacheRemoveAspect(string pattern) { _pattern = pattern; _cacheManager = ServiceTool.ServiceProvider.GetService(); } protected override void OnSuccess(IInvocation invocation) { _cacheManager.RemoveByPattern(_pattern); } } } ================================================ FILE: Core/Aspect/Autofac/Performance/PerformanceAspect.cs ================================================ using Core.Utilities.Interceptors; using Core.Utilities.IoC; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using Microsoft.Extensions.DependencyInjection; using Castle.DynamicProxy; namespace Core.Aspect.Autofac.Performance { public class PerformanceAspect:MethodInterception { private int _interval; private Stopwatch _stopwatch; public PerformanceAspect(int interval) { _interval = interval; _stopwatch = ServiceTool.ServiceProvider.GetService(); } protected override void OnBefore(IInvocation invocation) { _stopwatch.Start(); } protected override void OnAfter(IInvocation invocation) { if (_stopwatch.Elapsed.TotalSeconds > _interval) { Debug.WriteLine($"Performance : {invocation.Method.DeclaringType.FullName}.{invocation.Method.Name}-->{_stopwatch.Elapsed.TotalSeconds}"); } _stopwatch.Reset(); } } } ================================================ FILE: Core/Aspect/Autofac/Transaction/TransactionScopeAspect.cs ================================================ using Castle.DynamicProxy; using Core.Utilities.Interceptors; using System; using System.Collections.Generic; using System.Text; using System.Transactions; namespace Core.Aspect.Autofac.Transaction { public class TransactionScopeAspect:MethodInterception { public override void Intercept(IInvocation invocation) { using (TransactionScope transactionScope = new TransactionScope()) { try { invocation.Proceed(); transactionScope.Complete(); } catch (System.Exception e) { transactionScope.Dispose(); throw; } } } } } ================================================ FILE: Core/Aspect/Autofac/Validation/ValidationAspect.cs ================================================ using Castle.DynamicProxy; using Core.CrossCuttingConcerns.Validation; using Core.Utilities.Interceptors; using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Core.Aspect.Autofac.Validation { public class ValidationAspect:MethodInterception { private Type _validatorType; public ValidationAspect(Type validatorType) { if (!typeof(IValidator).IsAssignableFrom(validatorType)) { throw new System.Exception("Bu bir doğrulama sınıfı değil"); } _validatorType = validatorType; } protected override void OnBefore(IInvocation invocation) { var validator = (IValidator)Activator.CreateInstance(_validatorType); var entityType = _validatorType.BaseType.GetGenericArguments()[0]; var entities = invocation.Arguments.Where(t => t.GetType() == entityType); foreach (var entity in entities) { ValidationTool.Validate(validator, entity); } } } } ================================================ FILE: Core/Core.csproj ================================================ netstandard2.0 ================================================ FILE: Core/CrossCuttingConcerns/Caching/ICacheManager.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.CrossCuttingConcerns.Caching { public interface ICacheManager { T Get(string key); object Get(string key); void Add(string key, object value, int duration); bool IsAdd(string key); void Remove(string key); void RemoveByPattern(string pattern); } } ================================================ FILE: Core/CrossCuttingConcerns/Caching/Microsoft/MemoryCacheManager.cs ================================================ using Core.Utilities.IoC; using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.DependencyInjection; using System.Text.RegularExpressions; using System.Linq; namespace Core.CrossCuttingConcerns.Caching.Microsoft { public class MemoryCacheManager : ICacheManager { IMemoryCache _memoryCache; public MemoryCacheManager() { _memoryCache = ServiceTool.ServiceProvider.GetService(); } public void Add(string key, object value, int duration) { _memoryCache.Set(key, value, TimeSpan.FromMinutes(duration)); } public T Get(string key) { return _memoryCache.Get(key); } public object Get(string key) { return _memoryCache.Get(key); } public bool IsAdd(string key) { return _memoryCache.TryGetValue(key, out _); } public void Remove(string key) { _memoryCache.Remove(key); } public void RemoveByPattern(string pattern) { var cacheEntriesCollectionDefinition = typeof(MemoryCache).GetProperty("EntriesCollection", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); var cacheEntriesCollection = cacheEntriesCollectionDefinition.GetValue(_memoryCache) as dynamic; List cacheCollectionValues = new List(); foreach (var cacheItem in cacheEntriesCollection) { ICacheEntry cacheItemValue = cacheItem.GetType().GetProperty("Value").GetValue(cacheItem, null); cacheCollectionValues.Add(cacheItemValue); } var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase); var keysToRemove = cacheCollectionValues.Where(d => regex.IsMatch(d.Key.ToString())).Select(d => d.Key).ToList(); foreach (var key in keysToRemove) { _memoryCache.Remove(key); } } } } ================================================ FILE: Core/CrossCuttingConcerns/Validation/ValidationTool.cs ================================================ using FluentValidation; using System; using System.Collections.Generic; using System.Text; namespace Core.CrossCuttingConcerns.Validation { public static class ValidationTool { public static void Validate(IValidator validator, object entity) { var context = new ValidationContext(entity); var result = validator.Validate(context); if (!result.IsValid) { throw new ValidationException(result.Errors); } } } } ================================================ FILE: Core/DataAccess/EntityFramework/EfEntityRepositoryBase.cs ================================================ using Core.Entities; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace Core.DataAccess.EntityFramework { public class EfEntityRepositoryBase:IEntityRepository where TEntity:class,IEntity,new() where TContext:DbContext,new() { public void Add(TEntity entity) { using (TContext context = new TContext()) { var addedEntity = context.Entry(entity); addedEntity.State = EntityState.Added; context.SaveChanges(); } } public void Delete(TEntity entity) { using (TContext context = new TContext()) { var deletedEntity = context.Entry(entity); deletedEntity.State = EntityState.Deleted; context.SaveChanges(); } } public TEntity Get(Expression> filter) { using (TContext context = new TContext()) { return context.Set().SingleOrDefault(filter); } } public List GetAll(Expression> filter = null) { using (TContext context = new TContext()) { return filter == null ? context.Set().ToList() : context.Set().Where(filter).ToList(); } } public void Update(TEntity entity) { using (TContext context = new TContext()) { var updatedEntity = context.Entry(entity); updatedEntity.State = EntityState.Modified; context.SaveChanges(); } } } } ================================================ FILE: Core/DataAccess/IEntityRepository.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Core.DataAccess { public interface IEntityRepository where T:class,IEntity,new() { List GetAll(Expression> filter=null); T Get(Expression> filter); void Add(T entity); void Update(T entity); void Delete(T entity); } } ================================================ FILE: Core/DependencyResolvers/CoreModule.cs ================================================ using Core.CrossCuttingConcerns.Caching; using Core.CrossCuttingConcerns.Caching.Microsoft; using Core.Utilities.IoC; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; namespace Core.DependencyResolvers { public class CoreModule : ICoreModule { public void Load(IServiceCollection serviceCollection) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddMemoryCache(); serviceCollection.AddSingleton(); } } } ================================================ FILE: Core/Entities/Concrete/OperationClaim.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Entities.Concrete { public class OperationClaim:IEntity { public int Id { get; set; } public string Name { get; set; } } } ================================================ FILE: Core/Entities/Concrete/User.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Core.Entities.Concrete { public class User:IEntity { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public byte[] PasswordSalt { get; set; } public byte[] PasswordHash { get; set; } public bool Status { get; set; } public short Findeks { get; set; } } } ================================================ FILE: Core/Entities/Concrete/UserOperationClaim.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Entities.Concrete { public class UserOperationClaim:IEntity { public int Id { get; set; } public int UserId { get; set; } public int OperationClaimId { get; set; } } } ================================================ FILE: Core/Entities/IDto.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Entities { public interface IDto { } } ================================================ FILE: Core/Entities/IEntity.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Core.Entities { public interface IEntity { } } ================================================ FILE: Core/Extensions/ClaimExtensions.cs ================================================ using Microsoft.IdentityModel.JsonWebTokens; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text; namespace Core.Extensions { public static class ClaimExtensions { public static void AddEmail(this ICollection claims, string email) { claims.Add(new Claim(JwtRegisteredClaimNames.Email, email)); } public static void AddName(this ICollection claims, string name) { claims.Add(new Claim(ClaimTypes.Name, name)); } public static void AddNameIdentifier(this ICollection claims, string nameIdentifier) { claims.Add(new Claim(ClaimTypes.NameIdentifier, nameIdentifier)); } public static void AddRoles(this ICollection claims, string[] roles) { roles.ToList().ForEach(role => claims.Add(new Claim(ClaimTypes.Role, role))); } } } ================================================ FILE: Core/Extensions/ClaimsPrincipalExtensions.cs ================================================ using System.Collections.Generic; using System.Linq; using System.Security.Claims; namespace Core.Extensions { public static class ClaimsPrincipalExtensions { public static List Claims(this ClaimsPrincipal claimsPrincipal, string claimType) { var result = claimsPrincipal?.FindAll(claimType)?.Select(x => x.Value).ToList(); return result; } public static List ClaimRoles(this ClaimsPrincipal claimsPrincipal) { return claimsPrincipal?.Claims(ClaimTypes.Role); } } } ================================================ FILE: Core/Extensions/ErrorDetails.cs ================================================ using FluentValidation.Results; using Newtonsoft.Json; using System.Collections.Generic; namespace Core.Extensions { public class ErrorDetails { public string Message { get; set; } public int StatusCode { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); } } public class ValidationErrorDetails:ErrorDetails { public IEnumerable ValidationErrors; } } ================================================ FILE: Core/Extensions/ExceptionMiddleware.cs ================================================ using FluentValidation; using FluentValidation.Results; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Net; using System.Text; using System.Threading.Tasks; namespace Core.Extensions { public class ExceptionMiddleware { private RequestDelegate _next; public ExceptionMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext httpContext) { try { await _next(httpContext); } catch (Exception e) { await HandleExceptionAsync(httpContext, e); } } private Task HandleExceptionAsync(HttpContext httpContext, Exception e) { httpContext.Response.ContentType = "application/json"; httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; string message = "Internal Server Error"; IEnumerable errors; if (e.GetType() == typeof(ValidationException)) { message = e.Message; errors = ((ValidationException)e).Errors; httpContext.Response.StatusCode = 400; return httpContext.Response.WriteAsync(new ValidationErrorDetails { StatusCode = 400, Message = message, ValidationErrors = errors }.ToString()); } return httpContext.Response.WriteAsync(new ErrorDetails { StatusCode = httpContext.Response.StatusCode, Message = message }.ToString()); } } } ================================================ FILE: Core/Extensions/ExceptionMiddlewareExtensions.cs ================================================ using Microsoft.AspNetCore.Builder; using System; using System.Collections.Generic; using System.Text; namespace Core.Extensions { public static class ExceptionMiddlewareExtensions { public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app) { app.UseMiddleware(); } } } ================================================ FILE: Core/Extensions/ServiceCollectionExtensions.cs ================================================ using Core.Utilities.IoC; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; namespace Core.Extensions { public static class ServiceCollectionExtensions { public static IServiceCollection AddDependencyResolvers( this IServiceCollection serviceCollection, ICoreModule[] modules) { foreach (var module in modules) { module.Load(serviceCollection); } return ServiceTool.Create(serviceCollection); } } } ================================================ FILE: Core/Utilities/Business/BusinessRules.cs ================================================ using Core.Utilities.Results; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Business { public class BusinessRules { public static IResult Run(params IResult[] logics) { foreach (var logic in logics) { if (!logic.Success) { return logic; } } return null; } } } ================================================ FILE: Core/Utilities/FileHelper/FileHelper.cs ================================================ using Core.Utilities.Results; using Microsoft.AspNetCore.Http; using System; using System.IO; namespace Core.Utilities.FileHelper { public class FileHelper { public static string AddAsync(IFormFile file) { var result = newPath(file); try { var sourcepath = Path.GetTempFileName(); using (var stream = new FileStream(sourcepath, FileMode.Create)) { file.CopyTo(stream); } File.Move(sourcepath, result.newPath); } catch (Exception exception) { return exception.Message; } return result.Path2; } public static string UpdateAsync(string sourcePath, IFormFile file) { var result = newPath(file); try { using (var stream = new FileStream(result.newPath, FileMode.Create)) { file.CopyTo(stream); } File.Delete(sourcePath); } catch (Exception excepiton) { return excepiton.Message; } return result.Path2; } public static IResult DeleteAsync(string path) { try { File.Delete(path); } catch (Exception exception) { return new ErrorResult(exception.Message); } return new SuccessResult(); } public static (string newPath, string Path2) newPath(IFormFile file) { FileInfo ff = new FileInfo(file.FileName); string fileExtension = ff.Extension; var creatingUniqueFilename = Guid.NewGuid().ToString("N") + fileExtension; string result = $@"{Environment.CurrentDirectory + @"\wwwroot\Images"}\{creatingUniqueFilename}"; return (result, $"\\Images\\{creatingUniqueFilename}"); } } } ================================================ FILE: Core/Utilities/Interceptors/AspectInterceptorSelector.cs ================================================ using Castle.DynamicProxy; using Core.Aspect.Autofac.Performance; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace Core.Utilities.Interceptors { public class AspectInterceptorSelector : IInterceptorSelector { public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors) { var classAttributes = type.GetCustomAttributes (true).ToList(); var methodAttributes = type.GetMethod(method.Name) .GetCustomAttributes(true); classAttributes.AddRange(methodAttributes); classAttributes.Add(new PerformanceAspect(5)); return classAttributes.OrderBy(x => x.Priority).ToArray(); } } } ================================================ FILE: Core/Utilities/Interceptors/MethodInterception.cs ================================================ using Castle.DynamicProxy; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Interceptors { public abstract class MethodInterception: MethodInterceptionBaseAttribute { protected virtual void OnBefore(IInvocation invocation) { } protected virtual void OnAfter(IInvocation invocation) { } protected virtual void OnException(IInvocation invocation, System.Exception e) { } protected virtual void OnSuccess(IInvocation invocation) { } public override void Intercept(IInvocation invocation) { var isSuccess = true; OnBefore(invocation); try { invocation.Proceed(); } catch (Exception e) { isSuccess = false; OnException(invocation, e); throw; } finally { if (isSuccess) { OnSuccess(invocation); } } OnAfter(invocation); } } } ================================================ FILE: Core/Utilities/Interceptors/MethodInterceptionBaseAttribute.cs ================================================ using Castle.DynamicProxy; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Interceptors { [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple =true,Inherited =true)] public abstract class MethodInterceptionBaseAttribute : Attribute, IInterceptor { public int Priority { get; set; } public virtual void Intercept(IInvocation invocation) { } } } ================================================ FILE: Core/Utilities/IoC/ICoreModule.cs ================================================ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.IoC { public interface ICoreModule { void Load(IServiceCollection serviceCollection); } } ================================================ FILE: Core/Utilities/IoC/ServiceTool.cs ================================================ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.IoC { public static class ServiceTool { public static IServiceProvider ServiceProvider { get; private set; } public static IServiceCollection Create(IServiceCollection services) { ServiceProvider = services.BuildServiceProvider(); return services; } } } ================================================ FILE: Core/Utilities/Results/DataResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public class DataResult : Result, IDataResult { public DataResult(T data,bool success,string message):base(success,message) { Data = data; } public DataResult(T data,bool success):base(success) { Data = data; } public T Data { get; } } } ================================================ FILE: Core/Utilities/Results/ErrorDataResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public class ErrorDataResult:DataResult { public ErrorDataResult(T data,string message):base(data,false,message) { } public ErrorDataResult(T data):base(data,false) { } public ErrorDataResult(string message):base(default,false) { } public ErrorDataResult():base(default,false) { } } } ================================================ FILE: Core/Utilities/Results/ErrorResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public class ErrorResult:Result { public ErrorResult(string message):base(false,message) { } public ErrorResult():base(false) { } } } ================================================ FILE: Core/Utilities/Results/IDataResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public interface IDataResult:IResult { T Data { get; } } } ================================================ FILE: Core/Utilities/Results/IResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public interface IResult { bool Success { get; } string Message { get; } } } ================================================ FILE: Core/Utilities/Results/Result.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public class Result : IResult { public Result(bool success,string message):this(success) { Message = message; } public Result(bool success) { Success = success; } public bool Success { get; } public string Message { get; } } } ================================================ FILE: Core/Utilities/Results/SuccessDataResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public class SuccessDataResult:DataResult { public SuccessDataResult(T data, string message):base(data,true,message) { } public SuccessDataResult(T data):base(data,true) { } public SuccessDataResult(string message):base(default,true,message) { } public SuccessDataResult():base(default,true) { } } } ================================================ FILE: Core/Utilities/Results/SuccessResult.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Results { public class SuccessResult:Result { public SuccessResult(string message):base(true,message) { } public SuccessResult():base(true) { } } } ================================================ FILE: Core/Utilities/Security/Encryption/SecurityKeyHelper.cs ================================================ using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Security.Encryption { public class SecurityKeyHelper { public static SecurityKey CreateSecurityKey(string securityKey) { return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey)); } } } ================================================ FILE: Core/Utilities/Security/Encryption/SigningCredentialsHelper.cs ================================================ using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Security.Encryption { public class SigningCredentialsHelper { public static SigningCredentials CreateSigningCredentials(SecurityKey securityKey) { return new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha512Signature); } } } ================================================ FILE: Core/Utilities/Security/Hashing/HashingHelper.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Security.Hashing { public class HashingHelper { public static void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt) { using (var hmac = new System.Security.Cryptography.HMACSHA512()) { passwordSalt = hmac.Key; passwordHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(password)); } } public static bool VerifyPasswordHash(string password, byte[] passwordHash, byte[] passwordSalt) { using (var hmac = new System.Security.Cryptography.HMACSHA512(passwordSalt)) { var computedHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(password)); for (int i = 0; i < computedHash.Length; i++) { if (computedHash[i] != passwordHash[i]) { return false; } } return true; } } } } ================================================ FILE: Core/Utilities/Security/Jwt/AccessToken.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Security.Jwt { public class AccessToken { public string Token { get; set; } public DateTime Expiration { get; set; } } } ================================================ FILE: Core/Utilities/Security/Jwt/ITokenHelper.cs ================================================ using Core.Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace Core.Utilities.Security.Jwt { public interface ITokenHelper { AccessToken CreateToken(User user, List operationClaims); } } ================================================ FILE: Core/Utilities/Security/Jwt/JwtHelper.cs ================================================ using Core.Entities.Concrete; using Core.Utilities.Security.Encryption; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Text; using System.Security.Claims; using Core.Extensions; using System.Linq; namespace Core.Utilities.Security.Jwt { public class JwtHelper : ITokenHelper { public IConfiguration Configuration { get; } private TokenOptions _tokenOptions; private DateTime _accessTokenExpiration; public JwtHelper(IConfiguration configuration) { Configuration = configuration; _tokenOptions = Configuration.GetSection("TokenOptions").Get(); } public AccessToken CreateToken(User user, List operationClaims) { _accessTokenExpiration = DateTime.Now.AddMinutes(_tokenOptions.AccessTokenExpiration); var securityKey = SecurityKeyHelper.CreateSecurityKey(_tokenOptions.SecurityKey); var signingCredentials = SigningCredentialsHelper.CreateSigningCredentials(securityKey); var jwt = CreateJwtSecurityToken(_tokenOptions, user, signingCredentials, operationClaims); var jwtSecurityTokenHandler = new JwtSecurityTokenHandler(); var token = jwtSecurityTokenHandler.WriteToken(jwt); return new AccessToken { Token = token, Expiration = _accessTokenExpiration }; } private JwtSecurityToken CreateJwtSecurityToken(TokenOptions tokenOptions, User user, SigningCredentials signingCredentials, List operationClaims) { var jwt = new JwtSecurityToken( issuer: tokenOptions.Issuer, audience: tokenOptions.Audience, expires: _accessTokenExpiration, notBefore: DateTime.Now, claims: SetClaims(user, operationClaims), signingCredentials: signingCredentials ); return jwt; } private IEnumerable SetClaims(User user, List operationClaims) { var claims = new List(); claims.AddNameIdentifier(user.Id.ToString()); claims.AddEmail(user.Email); claims.AddName($"{user.FirstName} {user.LastName}"); claims.AddRoles(operationClaims.Select(c => c.Name).ToArray()); return claims; } } } ================================================ FILE: Core/Utilities/Security/Jwt/TokenOptions.cs ================================================ namespace Core.Utilities.Security.Jwt { public class TokenOptions { public string Audience { get; set; } public string Issuer { get; set; } public int AccessTokenExpiration { get; set; } public string SecurityKey { get; set; } } } ================================================ FILE: DataAccess/Abstract/IBrandDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface IBrandDal:IEntityRepository { } } ================================================ FILE: DataAccess/Abstract/ICarDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DataAccess.Abstract { public interface ICarDal:IEntityRepository { List GetCarDetails(); } } ================================================ FILE: DataAccess/Abstract/ICarImageDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface ICarImageDal:IEntityRepository { } } ================================================ FILE: DataAccess/Abstract/ICartDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface ICartDal: IEntityRepository { } } ================================================ FILE: DataAccess/Abstract/IColorDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface IColorDal:IEntityRepository { } } ================================================ FILE: DataAccess/Abstract/ICustomerDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface ICustomerDal:IEntityRepository { List GetCustomerDetails(); } } ================================================ FILE: DataAccess/Abstract/IPaymentDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface IPaymentDal:IEntityRepository { } } ================================================ FILE: DataAccess/Abstract/IRentalDal.cs ================================================ using Core.DataAccess; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface IRentalDal:IEntityRepository { List GetRentalDetails(); } } ================================================ FILE: DataAccess/Abstract/IUserDal.cs ================================================ using Core.DataAccess; using Core.Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Abstract { public interface IUserDal:IEntityRepository { List GetClaims(User user); } } ================================================ FILE: DataAccess/Concrete/EntityFramework/CarRentalContext.cs ================================================ using Core.Entities.Concrete; using Entities.Concrete; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DataAccess.Concrete.EntityFramework { public class CarRentalContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=CarRental;Trusted_Connection=true;"); } public DbSet Cars { get; set; } public DbSet Brands { get; set; } public DbSet Colors { get; set; } public DbSet Users { get; set; } public DbSet Customers { get; set; } public DbSet Rentals { get; set; } public DbSet CarImages { get; set; } public DbSet OperationClaims { get; set; } public DbSet UserOperationClaims { get; set; } public DbSet Payments { get; set; } public DbSet Carts { get; set; } } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfBrandDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace DataAccess.Concrete.EntityFramework { public class EfBrandDal : EfEntityRepositoryBase, IBrandDal { } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfCarDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace DataAccess.Concrete.EntityFramework { public class EfCarDal : EfEntityRepositoryBase, ICarDal { public List GetCarDetails() { using (var context = new CarRentalContext()) { var result = from c in context.Cars join b in context.Brands on c.BrandId equals b.Id join co in context.Colors on c.ColorId equals co.Id select new CarDetailDto { Id=c.Id,BrandName = b.BrandName, ColorName = co.ColorName,ModelYear=c.ModelYear,DailyPrice = c.DailyPrice,Description=c.Description,Findeks=c.Findeks }; return result.ToList(); } } } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfCarImageDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Concrete.EntityFramework { public class EfCarImageDal:EfEntityRepositoryBase,ICarImageDal { } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfCartDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Concrete.EntityFramework { public class EfCartDal: EfEntityRepositoryBase, ICartDal { } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfColorDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace DataAccess.Concrete.EntityFramework { public class EfColorDal : EfEntityRepositoryBase,IColorDal { } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfCustomerDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace DataAccess.Concrete.EntityFramework { public class EfCustomerDal : EfEntityRepositoryBase, ICustomerDal { public List GetCustomerDetails() { using (var context = new CarRentalContext()) { var result = from c in context.Customers join u in context.Users on c.UserId equals u.Id select new CustomerDetailDto { Id = c.Id, FirstName = u.FirstName, LastName = u.LastName, Email = u.Email, Status = u.Status, CompanyName = c.CompanyName }; return result.ToList(); } } } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfPaymentDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using System; using System.Collections.Generic; using System.Text; namespace DataAccess.Concrete.EntityFramework { public class EfPaymentDal: EfEntityRepositoryBase, IPaymentDal { } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfRentalDal.cs ================================================ using Core.DataAccess.EntityFramework; using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Linq.Expressions; namespace DataAccess.Concrete.EntityFramework { public class EfRentalDal : EfEntityRepositoryBase, IRentalDal { public List GetRentalDetails() { using (var context = new CarRentalContext()) { var result = from rent in context.Rentals join car in context.Cars on rent.CarId equals car.Id join brand in context.Brands on car.BrandId equals brand.Id join color in context.Colors on car.ColorId equals color.Id join cus in context.Customers on rent.CustomerId equals cus.Id join user in context.Users on cus.UserId equals user.Id select new RentalDetailDto { Id = rent.Id, CarId = car.Id, CarName = car.Description, BrandName = brand.BrandName, ColorName = color.ColorName, CompanyName = cus.CompanyName, FirstName = user.FirstName, LastName = user.LastName, RentDate = rent.RentDate, ReturnDate = rent.ReturnDate, }; return result.ToList(); } } } } ================================================ FILE: DataAccess/Concrete/EntityFramework/EfUserDal.cs ================================================ using Core.DataAccess.EntityFramework; using Core.Entities.Concrete; using DataAccess.Abstract; using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace DataAccess.Concrete.EntityFramework { public class EfUserDal : EfEntityRepositoryBase, IUserDal { public List GetClaims(User user) { using (var context = new CarRentalContext()) { var result = from operationClaim in context.OperationClaims join userOperationClaim in context.UserOperationClaims on operationClaim.Id equals userOperationClaim.OperationClaimId where userOperationClaim.UserId == user.Id select new OperationClaim { Id = operationClaim.Id, Name = operationClaim.Name }; return result.ToList(); } } } } ================================================ FILE: DataAccess/Concrete/InMemory/InMemoryCarDal.cs ================================================ using DataAccess.Abstract; using Entities.Concrete; using Entities.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace DataAccess.Concrete.InMemory { public class InMemoryCarDal : ICarDal { List _cars; public InMemoryCarDal() { _cars = new List { new Car{Id=0,BrandId=2,ColorId=33,ModelYear=2014,DailyPrice=56929,Description="Info." }, new Car{Id=1,BrandId=2,ColorId=15,ModelYear=2020,DailyPrice=96723,Description="Info." }, new Car{Id=2,BrandId=2,ColorId=78,ModelYear=1994,DailyPrice=26173,Description="Info." }, }; } public void Add(Car car) { _cars.Add(car); } public void Delete(Car car) { Car deletedToCar = null; deletedToCar = _cars.SingleOrDefault(p => p.Id == car.Id); _cars.Remove(deletedToCar); } public Car Get(Expression> filter) { throw new NotImplementedException(); } public Car Get(int id) { return _cars.SingleOrDefault(p => p.Id == id); } public List GetAll(Expression> filter = null) { return _cars.ToList(); } public List GetAll() { return _cars.ToList(); } public List GetCarDetails() { throw new NotImplementedException(); } public void Update(Car car) { Car updatedToCar = null; updatedToCar = _cars.SingleOrDefault(p => p.Id == car.Id); updatedToCar.Id = car.Id; updatedToCar.BrandId = car.BrandId; updatedToCar.ColorId = car.ColorId; updatedToCar.ModelYear = car.ModelYear; updatedToCar.DailyPrice = car.DailyPrice; updatedToCar.Description = car.Description; } } } ================================================ FILE: DataAccess/DataAccess.csproj ================================================ netstandard2.0 ================================================ FILE: Entities/Concrete/Brand.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Brand:IEntity { public int Id { get; set; } public string BrandName { get; set; } } } ================================================ FILE: Entities/Concrete/Car.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Car: IEntity { public int Id { get; set; } public int BrandId { get; set; } public int ColorId { get; set; } public int ModelYear { get; set; } public decimal DailyPrice { get; set; } public string Description { get; set; } public short Findeks { get; set; } } } ================================================ FILE: Entities/Concrete/CarImage.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class CarImage:IEntity { public CarImage() { Date = DateTime.Now; } public int Id { get; set; } public int CarId { get; set; } public string ImagePath { get; set; } public DateTime Date { get; set; } } } ================================================ FILE: Entities/Concrete/Cart.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Cart: IEntity { public int Id { get; set; } public int CustomerId { get; set; } public string CartName { get; set; } public string CartNumber { get; set; } public string CartDate { get; set; } public short CartCvv { get; set; } } } ================================================ FILE: Entities/Concrete/Color.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Color:IEntity { public int Id { get; set; } public string ColorName { get; set; } } } ================================================ FILE: Entities/Concrete/Customer.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Customer:IEntity { public int Id { get; set; } public int UserId { get; set; } public string CompanyName { get; set; } } } ================================================ FILE: Entities/Concrete/Payment.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Payment:IEntity { public int Id { get; set; } public int CarId { get; set; } public int CustomerId { get; set; } public string CartName { get; set; } public string CartNumber { get; set; } public string CartDate { get; set; } public short CartCvv { get; set; } public decimal TotalPrice { get; set; } public DateTime PaymentDate { get; set; } } } ================================================ FILE: Entities/Concrete/Rental.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.Concrete { public class Rental:IEntity { public int Id { get; set; } public int CarId { get; set; } public int CustomerId { get; set; } public DateTime RentDate { get; set; } public DateTime ReturnDate { get; set; } } } ================================================ FILE: Entities/DTOs/CarDetailDto.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.DTOs { public class CarDetailDto:IDto { public int Id { get; set; } public string BrandName { get; set; } public string ColorName { get; set; } public int ModelYear { get; set; } public decimal DailyPrice { get; set; } public string Description { get; set; } public short Findeks { get; set; } } } ================================================ FILE: Entities/DTOs/CustomerDetailDto.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.DTOs { public class CustomerDetailDto:IDto { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public Boolean Status { get; set; } public string CompanyName { get; set; } } } ================================================ FILE: Entities/DTOs/RentalDetailDto.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.DTOs { public class RentalDetailDto:IDto { public int Id { get; set; } public int CarId { get; set; } public string CarName { get; set; } public string BrandName { get; set; } public string ColorName { get; set; } public string CompanyName { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime RentDate { get; set; } public DateTime ReturnDate { get; set; } } } ================================================ FILE: Entities/DTOs/UserForLoginDto.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.DTOs { public class UserForLoginDto:IDto { public string Email { get; set; } public string Password { get; set; } } } ================================================ FILE: Entities/DTOs/UserForRegisterDto.cs ================================================ using Core.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Entities.DTOs { public class UserForRegisterDto:IDto { public string Email { get; set; } public string Password { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } } ================================================ FILE: Entities/Entities.csproj ================================================  Debug AnyCPU {D8F5692B-BD1D-47CF-8B64-45317038C94E} Library Properties Entities Entities v4.7.2 512 true true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 {185e58ed-316c-45f6-8472-03592bb71a21} Core ================================================ FILE: Entities/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Bir bütünleştirilmiş koda ilişkin Genel Bilgiler aşağıdaki öznitelikler kümesiyle // denetlenir. Bütünleştirilmiş kod ile ilişkili bilgileri değiştirmek için // bu öznitelik değerlerini değiştirin. [assembly: AssemblyTitle("Entities")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Entities")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // ComVisible özniteliğinin false olarak ayarlanması bu bütünleştirilmiş koddaki türleri // COM bileşenleri için görünmez yapar. Bu bütünleştirilmiş koddaki bir türe // erişmeniz gerekirse ComVisible özniteliğini o türde true olarak ayarlayın. [assembly: ComVisible(false)] // Bu proje COM'un kullanımına sunulursa, aşağıdaki GUID tür kitaplığının kimliği içindir [assembly: Guid("d8f5692b-bd1d-47cf-8b64-45317038c94e")] // Bir derlemenin sürüm bilgileri aşağıdaki dört değerden oluşur: // // Ana Sürüm // İkincil Sürüm // Yapı Numarası // Düzeltme // // Tüm değerleri belirtebilir veya varsayılan Derleme ve Düzeltme Numaralarını kullanmak için // aşağıda gösterildiği gibi '*' kullanabilirsiniz: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Entities/app.config ================================================  ================================================ FILE: README.md ================================================ ## Welcome to My Car Rental Project ### The project was developed in accordance with SOLID principles, corporate software architecture, AOP, and software development principles. * Developed on the .Net Core 3.1 platform. * Cross Cutting Concerns were developed using the Autofac library with interceptors. * Performance * Transaction * Validation * Caching * Developed using Entity Framework ORM. * AOP (Aspect-Oriented Programming) was used to handle Cross Cutting Concerns in a modular way. * Exception Middleware was developed for centralized error handling. * Claim mechanism was used to provide more flexible role-based authorization. * JWT (JSON Web Token) authentication was integrated. * Fluent Validation was used to implement validation processes. * IoC (Inversion Of Control) was applied to create loosely coupled objects. * REST and RESTful Web Services were used for server-client communication. ### C# Backend Layers * Core: A general layer designed to make tools reusable across other projects. * Entities: The layer where database tables are mapped to objects. * DataAccess: The layer responsible for database operations. * Business: The layer where business logic is implemented * WebAPI: The layer that facilitates server-client communication via the RESTful (Representational State Transfer) HTTP protocol. ================================================ FILE: ReCapProject.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.31005.135 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Entities", "Entities\Entities.csproj", "{D8F5692B-BD1D-47CF-8B64-45317038C94E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Business", "Business\Business.csproj", "{710A9967-AB8D-42BF-ACC4-51E19AD024F1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleUI", "ConsoleUI\ConsoleUI.csproj", "{80F94BC3-9DE5-48FA-9093-A5E2F412A505}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataAccess", "DataAccess\DataAccess.csproj", "{DFA505E2-14B4-462A-8DDA-09EEFFAD1018}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "Core\Core.csproj", "{185E58ED-316C-45F6-8472-03592BB71A21}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebAPI", "WebAPI\WebAPI.csproj", "{87C0F5A3-05B6-4D63-8F35-3C893F74E741}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {D8F5692B-BD1D-47CF-8B64-45317038C94E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D8F5692B-BD1D-47CF-8B64-45317038C94E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D8F5692B-BD1D-47CF-8B64-45317038C94E}.Release|Any CPU.ActiveCfg = Release|Any CPU {D8F5692B-BD1D-47CF-8B64-45317038C94E}.Release|Any CPU.Build.0 = Release|Any CPU {710A9967-AB8D-42BF-ACC4-51E19AD024F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {710A9967-AB8D-42BF-ACC4-51E19AD024F1}.Debug|Any CPU.Build.0 = Debug|Any CPU {710A9967-AB8D-42BF-ACC4-51E19AD024F1}.Release|Any CPU.ActiveCfg = Release|Any CPU {710A9967-AB8D-42BF-ACC4-51E19AD024F1}.Release|Any CPU.Build.0 = Release|Any CPU {80F94BC3-9DE5-48FA-9093-A5E2F412A505}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80F94BC3-9DE5-48FA-9093-A5E2F412A505}.Debug|Any CPU.Build.0 = Debug|Any CPU {80F94BC3-9DE5-48FA-9093-A5E2F412A505}.Release|Any CPU.ActiveCfg = Release|Any CPU {80F94BC3-9DE5-48FA-9093-A5E2F412A505}.Release|Any CPU.Build.0 = Release|Any CPU {DFA505E2-14B4-462A-8DDA-09EEFFAD1018}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DFA505E2-14B4-462A-8DDA-09EEFFAD1018}.Debug|Any CPU.Build.0 = Debug|Any CPU {DFA505E2-14B4-462A-8DDA-09EEFFAD1018}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFA505E2-14B4-462A-8DDA-09EEFFAD1018}.Release|Any CPU.Build.0 = Release|Any CPU {185E58ED-316C-45F6-8472-03592BB71A21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {185E58ED-316C-45F6-8472-03592BB71A21}.Debug|Any CPU.Build.0 = Debug|Any CPU {185E58ED-316C-45F6-8472-03592BB71A21}.Release|Any CPU.ActiveCfg = Release|Any CPU {185E58ED-316C-45F6-8472-03592BB71A21}.Release|Any CPU.Build.0 = Release|Any CPU {87C0F5A3-05B6-4D63-8F35-3C893F74E741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {87C0F5A3-05B6-4D63-8F35-3C893F74E741}.Debug|Any CPU.Build.0 = Debug|Any CPU {87C0F5A3-05B6-4D63-8F35-3C893F74E741}.Release|Any CPU.ActiveCfg = Release|Any CPU {87C0F5A3-05B6-4D63-8F35-3C893F74E741}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BBD63571-3102-4665-8C98-0A4DD1579EC7} EndGlobalSection EndGlobal ================================================ FILE: WebAPI/.config/dotnet-tools.json ================================================ { "version": 1, "isRoot": true, "tools": { "dotnet-ef": { "version": "5.0.4", "commands": [ "dotnet-ef" ] } } } ================================================ FILE: WebAPI/Controllers/AuthController.cs ================================================ using Business.Abstract; using Entities.DTOs; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class AuthController : ControllerBase { private IAuthService _authService; public AuthController(IAuthService authService) { _authService = authService; } [HttpPost("login")] public ActionResult Login(UserForLoginDto userForLoginDto) { var userToLogin = _authService.Login(userForLoginDto); if (!userToLogin.Success) { return BadRequest(userToLogin.Message); } var result = _authService.CreateAccessToken(userToLogin.Data); if (result.Success) { return Ok(result); } return BadRequest(result.Message); } [HttpPost("register")] public ActionResult Register(UserForRegisterDto userForRegisterDto) { var userExists = _authService.UserExists(userForRegisterDto.Email); if (!userExists.Success) { return BadRequest(userExists); } var registerResult = _authService.Register(userForRegisterDto); var result = _authService.CreateAccessToken(registerResult.Data); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/BrandsController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class BrandsController : ControllerBase { IBrandService _brandService; public BrandsController(IBrandService brandService) { _brandService = brandService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _brandService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById(int id) { var result = _brandService.Get(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult Add(Brand brand) { var result = _brandService.Add(brand); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete(Brand brand) { var result = _brandService.Delete(brand); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update(Brand brand) { var result = _brandService.Update(brand); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/CarImagesController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.IO; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class CarImagesController : ControllerBase { ICarImageService _carImageService; public CarImagesController(ICarImageService carImageService) { _carImageService = carImageService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _carImageService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById([FromForm(Name = ("Id"))] int Id) { var result = _carImageService.Get(Id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getimagesbycaridform")] public IActionResult GetImagesByCarId([FromForm(Name = ("CarId"))] int CarId) { var result = _carImageService.GetImagesByCarId(CarId); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getimagesbycarid")] public IActionResult GetImagesByCarId2(int id) { var result = _carImageService.GetImagesByCarId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult AddAsync([FromForm(Name = ("Image"))] IFormFile file, [FromForm] CarImage carImage) { var result = _carImageService.Add(carImage,file); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update([FromForm(Name = ("Image"))] IFormFile file, [FromForm] CarImage carImage) { var result = _carImageService.Update(carImage, file); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete([FromForm(Name =("Id"))] int Id) { var carImage = _carImageService.Get(Id).Data; var result = _carImageService.Delete(carImage); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("transaction")] public IActionResult TransactionTest([FromForm(Name = ("Image"))] IFormFile file, [FromForm] CarImage carImage) { var result = _carImageService.TransactionalOperation(carImage, file); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/CarsController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class CarsController : ControllerBase { ICarService _carService; public CarsController(ICarService carService) { _carService = carService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _carService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById(int id) { var result = _carService.Get(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbycarid")] public IActionResult GetByCarId(int id) { var result = _carService.GetCarDetail(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcarsbybrandid")] public IActionResult GetCarsByBrandId(int id) { var result = _carService.GetCarsByBrandId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcarsbycolorid")] public IActionResult GetCarsByColorId(int id) { var result = _carService.GetCarsByColorId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult Add(Car car) { var result = _carService.Add(car); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete(Car car) { var result = _carService.Delete(car); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update(Car car) { var result = _carService.Update(car); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcardetails")] public IActionResult GetCarsDetails() { var result = _carService.GetCarDetails(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcardetailsbycarid")] public IActionResult GetCarsDetailsByCarId(int id) { var result = _carService.GetCarDetailsByCarId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcardetailsbybrandcolor")] public IActionResult GetCarDetailsByBrandColor(int brandid,int colorid) { var result = _carService.GetCarDetailsByBrandColor(brandid,colorid); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcardetailsbybrandid")] public IActionResult GetCarDetailsByBrandId(int id) { var result = _carService.GetCarDetailsByBrandId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getcardetailsbycolorid")] public IActionResult GetCarDetailsByColorId(int id) { var result = _carService.GetCarDetailsByColorId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/CartsController.cs ================================================ using Business.Abstract; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class CartsController : ControllerBase { ICartService _cartService; public CartsController(ICartService cartService) { _cartService = cartService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _cartService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getallbyid")] public IActionResult GetAll(int id) { var result = _cartService.GetAllByCustomerId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/ColorsController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class ColorsController : ControllerBase { IColorService _colorService; public ColorsController(IColorService colorService) { _colorService = colorService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _colorService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById(int id) { var result = _colorService.Get(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult Add(Color color) { var result = _colorService.Add(color); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete(Color color) { var result = _colorService.Delete(color); if(result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update(Color color) { var result = _colorService.Update(color); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/CustomersController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class CustomersController : ControllerBase { ICustomerService _customerService; public CustomersController(ICustomerService customerService) { _customerService = customerService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _customerService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getalldetails")] public IActionResult GetCustomerDetails() { var result = _customerService.GetCustomerDetails(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById(int id) { var result = _customerService.Get(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyuserid")] public IActionResult GetByUserId(int id) { var result = _customerService.GetbyUser(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult Add(Customer customer) { var result = _customerService.Add(customer); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete(Customer customer) { var result = _customerService.Delete(customer); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update(Customer customer) { var result = _customerService.Update(customer); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/PaysController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class PaysController : ControllerBase { IPaymentService _paymentService; public PaysController(IPaymentService paymentService) { _paymentService = paymentService; } [HttpPost("add")] public IActionResult Add(Payment payment) { var result = _paymentService.Add(payment); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/RentalsController.cs ================================================ using Business.Abstract; using Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class RentalsController : ControllerBase { IRentalService _rentalService; public RentalsController(IRentalService rentalService) { _rentalService = rentalService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _rentalService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getrentaldetails")] public IActionResult GetRentalDetails() { var result = _rentalService.GetRentalDetails(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getrentaldetailsbycarid")] public IActionResult GetRentalDetailsByCarId(int id) { var result = _rentalService.GetRentalDetailsByCarId(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById(int id) { var result = _rentalService.Get(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult Add(Rental rental) { //rental.ReturnDate = DateTime.Now.AddDays(2).AddHours(3); var result = _rentalService.Add(rental); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete(Rental rental) { var result = _rentalService.Delete(rental); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update(Rental rental) { var result = _rentalService.Update(rental); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("datecheck")] public IActionResult datecheck(Rental rental) { var result = _rentalService.DateCheck(rental); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/UsersController.cs ================================================ using Business.Abstract; using Core.Entities.Concrete; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { IUserService _userService; public UsersController(IUserService userService) { _userService = userService; } [HttpGet("getall")] public IActionResult GetAll() { var result = _userService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpGet("getbyid")] public IActionResult GetById(int id) { var result = _userService.Get(id); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("add")] public IActionResult Add(User user) { var result = _userService.Add(user); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("delete")] public IActionResult Delete(User user) { var result = _userService.Delete(user); if (result.Success) { return Ok(result); } return BadRequest(result); } [HttpPost("update")] public IActionResult Update(User user) { var result = _userService.Update(user); if (result.Success) { return Ok(result); } return BadRequest(result); } } } ================================================ FILE: WebAPI/Controllers/WeatherForecastController.cs ================================================ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger _logger; public WeatherForecastController(ILogger logger) { _logger = logger; } [HttpGet] public IEnumerable Get() { var rng = new Random(); return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }) .ToArray(); } } } ================================================ FILE: WebAPI/Program.cs ================================================ using Autofac; using Autofac.Extensions.DependencyInjection; using Business.DependencyResolvers.Autofac; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureContainer(builder => { builder.RegisterModule(new AutofacBusinessModule()); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); } } ================================================ FILE: WebAPI/Properties/launchSettings.json ================================================ { "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:55343", "sslPort": 44399 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "weatherforecast", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "WebAPI": { "commandName": "Project", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } } ================================================ FILE: WebAPI/Startup.cs ================================================ using Business.Abstract; using Business.Concrete; using Core.DependencyResolvers; using Core.Extensions; using Core.Utilities.IoC; using Core.Utilities.Security.Encryption; using Core.Utilities.Security.Jwt; using DataAccess.Abstract; using DataAccess.Concrete.EntityFramework; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebAPI { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddCors(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); //services.AddSingleton(); services.AddSingleton(); var tokenOptions = Configuration.GetSection("TokenOptions").Get(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidIssuer = tokenOptions.Issuer, ValidAudience = tokenOptions.Audience, ValidateIssuerSigningKey = true, IssuerSigningKey = SecurityKeyHelper.CreateSecurityKey(tokenOptions.SecurityKey) }; }); services.AddDependencyResolvers( new ICoreModule[] { new CoreModule() }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.ConfigureCustomExceptionMiddleware(); app.UseCors(builder=>builder.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyOrigin()); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseStaticFiles(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } } ================================================ FILE: WebAPI/WeatherForecast.cs ================================================ using System; namespace WebAPI { public class WeatherForecast { public DateTime Date { get; set; } public int TemperatureC { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); public string Summary { get; set; } } } ================================================ FILE: WebAPI/WebAPI.csproj ================================================ netcoreapp3.1 ================================================ FILE: WebAPI/appsettings.Development.json ================================================ { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } } } ================================================ FILE: WebAPI/appsettings.json ================================================ { "TokenOptions": { "Audience": "ugur@ugur.com", "Issuer": "ugur@ugur.com", "AccessTokenExpiration": 10, "SecurityKey": "mysupersecretkeymysupersecretkey" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }