├── .editorconfig ├── .gitattributes ├── test ├── YazilimAcademy.ABPRaffleApp.TestBase │ ├── appsettings.json │ ├── YazilimAcademy.ABPRaffleApp.TestBase.abppkg │ ├── ABPRaffleAppTestConsts.cs │ ├── ABPRaffleAppTestDataBuilder.cs │ ├── Security │ │ └── FakeCurrentPrincipalAccessor.cs │ ├── ABPRaffleAppTestBaseModule.cs │ ├── appsettings.secrets.json │ ├── YazilimAcademy.ABPRaffleApp.TestBase.csproj │ └── ABPRaffleAppTestBase.cs ├── YazilimAcademy.ABPRaffleApp.Domain.Tests │ ├── YazilimAcademy.ABPRaffleApp.Domain.Tests.abppkg │ ├── ABPRaffleAppDomainTestModule.cs │ ├── ABPRaffleAppDomainTestBase.cs │ ├── YazilimAcademy.ABPRaffleApp.Domain.Tests.csproj │ └── Samples │ │ └── SampleDomainTests.cs ├── YazilimAcademy.ABPRaffleApp.Application.Tests │ ├── YazilimAcademy.ABPRaffleApp.Application.Tests.abppkg │ ├── ABPRaffleAppApplicationTestBase.cs │ ├── ABPRaffleAppApplicationTestModule.cs │ ├── YazilimAcademy.ABPRaffleApp.Application.Tests.csproj │ ├── Samples │ │ └── SampleAppServiceTests.cs │ └── Books │ │ └── BookAppService_Tests .cs ├── YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests │ ├── YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests.abppkg │ ├── EntityFrameworkCore │ │ ├── ABPRaffleAppEntityFrameworkCoreFixture.cs │ │ ├── ABPRaffleAppEntityFrameworkCoreTestBase.cs │ │ ├── ABPRaffleAppEntityFrameworkCoreCollection.cs │ │ ├── ABPRaffleAppEntityFrameworkCoreCollectionFixtureBase.cs │ │ ├── Domains │ │ │ └── EfCoreSampleDomainTests.cs │ │ ├── Applications │ │ │ ├── EfCoreSampleAppServiceTests.cs │ │ │ └── Books │ │ │ │ └── EfCoreBookAppService_Tests.cs │ │ ├── Samples │ │ │ └── SampleRepositoryTests.cs │ │ └── ABPRaffleAppEntityFrameworkCoreTestModule.cs │ └── YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests.csproj └── YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp │ ├── YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp.abppkg │ ├── appsettings.json │ ├── ABPRaffleAppConsoleApiClientModule.cs │ ├── Program.cs │ ├── YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp.csproj │ ├── ClientDemoService.cs │ └── appsettings.secrets.json ├── src ├── YazilimAcademy.ABPRaffleApp.HttpApi.Host │ ├── appsettings.Development.json │ ├── YazilimAcademy.ABPRaffleApp.HttpApi.Host.abppkg │ ├── abp.resourcemapping.js │ ├── wwwroot │ │ ├── images │ │ │ ├── favicon │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── mstile-150x150.png │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── android-chrome-192x192.png │ │ │ │ ├── android-chrome-256x256.png │ │ │ │ ├── browserconfig.xml │ │ │ │ └── site.webmanifest │ │ │ ├── logo │ │ │ │ └── lepton │ │ │ │ │ ├── logo-dark.png │ │ │ │ │ └── logo-light.png │ │ │ └── clients │ │ │ │ ├── angular.svg │ │ │ │ ├── blazor.svg │ │ │ │ └── aspnetcore.svg │ │ └── global-styles.css │ ├── Dockerfile │ ├── package.json │ ├── Pages │ │ ├── _ViewImports.cshtml │ │ └── Index.cshtml.cs │ ├── ABPRaffleAppBrandingProvider.cs │ ├── web.config │ ├── appsettings.json │ ├── Properties │ │ └── launchSettings.json │ ├── HealthChecks │ │ └── ABPRaffleAppDatabaseCheck.cs │ ├── appsettings.secrets.json │ └── Program.cs ├── YazilimAcademy.ABPRaffleApp.DbMigrator │ ├── YazilimAcademy.ABPRaffleApp.DbMigrator.abppkg │ ├── Dockerfile │ ├── ABPRaffleAppDbMigratorModule.cs │ ├── appsettings.json │ ├── Program.cs │ ├── appsettings.secrets.json │ ├── DbMigratorHostedService.cs │ └── YazilimAcademy.ABPRaffleApp.DbMigrator.csproj ├── YazilimAcademy.ABPRaffleApp.Blazor.Client │ ├── wwwroot │ │ ├── appsettings.Development.json │ │ ├── favicon.ico │ │ ├── icon-192.png │ │ ├── icon-512.png │ │ ├── images │ │ │ ├── favicon │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── mstile-150x150.png │ │ │ │ ├── android-chrome-192x192.png │ │ │ │ ├── android-chrome-256x256.png │ │ │ │ ├── browserconfig.xml │ │ │ │ └── site.webmanifest │ │ │ └── getting-started │ │ │ │ ├── bg-01.png │ │ │ │ ├── book.png │ │ │ │ ├── img-blog.png │ │ │ │ ├── img-community.png │ │ │ │ ├── img-support.png │ │ │ │ ├── x-white.svg │ │ │ │ ├── stack-overflow.svg │ │ │ │ ├── youtube.svg │ │ │ │ └── discord.svg │ │ ├── service-worker.js │ │ ├── manifest.json │ │ ├── confetti.js │ │ ├── appsettings.json │ │ ├── main.css │ │ ├── appsettings.secrets.json │ │ └── service-worker.published.js │ ├── YazilimAcademy.ABPRaffleApp.Blazor.Client.abppkg │ ├── Pages │ │ ├── Index.razor.cs │ │ ├── CookiePolicy.razor.cs │ │ ├── PrivacyPolicy.razor.cs │ │ ├── Index.razor.css │ │ ├── HostDashboard.razor │ │ └── HostDashboard.razor.cs │ ├── Navigation │ │ └── ABPRaffleAppMenus.cs │ ├── ABPRaffleAppComponentBase.cs │ ├── ABPRaffleAppBlazorAutoMapperProfile.cs │ ├── ABPRaffleAppBundleContributor.cs │ ├── Program.cs │ ├── _Imports.razor │ ├── ABPRaffleAppBrandingProvider.cs │ ├── Components │ │ └── Layout │ │ │ └── LeptonXFooter.razor │ ├── Routes.razor │ └── YazilimAcademy.ABPRaffleApp.Blazor.Client.csproj ├── YazilimAcademy.ABPRaffleApp.Domain │ ├── YazilimAcademy.ABPRaffleApp.Domain.abppkg │ ├── Data │ │ ├── IABPRaffleAppDbSchemaMigrator.cs │ │ └── NullABPRaffleAppDbSchemaMigrator.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Settings │ │ ├── ABPRaffleAppSettings.cs │ │ └── ABPRaffleAppSettingDefinitionProvider.cs │ ├── Books │ │ └── Book.cs │ ├── ABPRaffleAppConsts.cs │ ├── Raffles │ │ ├── RaffleResult.cs │ │ └── Participant.cs │ ├── BookStoreDataSeederContributor.cs │ └── YazilimAcademy.ABPRaffleApp.Domain.csproj ├── YazilimAcademy.ABPRaffleApp.HttpApi │ ├── YazilimAcademy.ABPRaffleApp.HttpApi.abppkg │ ├── Models │ │ └── Test │ │ │ └── TestModel.cs │ ├── Controllers │ │ ├── ABPRaffleAppController.cs │ │ ├── GoogleDrives │ │ │ └── GoogleDriveController.cs │ │ ├── Books │ │ │ └── BookController.cs │ │ └── Raffles │ │ │ └── RaffleController.cs │ ├── YazilimAcademy.ABPRaffleApp.HttpApi.csproj │ └── ABPRaffleAppHttpApiModule.cs ├── YazilimAcademy.ABPRaffleApp.Blazor │ ├── YazilimAcademy.ABPRaffleApp.Blazor.abppkg │ ├── Dockerfile │ ├── _Imports.razor │ ├── YazilimAcademy.ABPRaffleApp.Blazor.csproj │ ├── Properties │ │ └── launchSettings.json │ ├── Program.cs │ └── Components │ │ └── App.razor ├── YazilimAcademy.ABPRaffleApp.Application │ ├── YazilimAcademy.ABPRaffleApp.Application.abppkg │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── ABPRaffleAppAppService.cs │ ├── Books │ │ └── BookAppService.cs │ ├── ABPRaffleAppApplicationAutoMapperProfile.cs │ ├── ABPRaffleAppApplicationModule.cs │ └── YazilimAcademy.ABPRaffleApp.Application.csproj ├── YazilimAcademy.ABPRaffleApp.Domain.Shared │ ├── YazilimAcademy.ABPRaffleApp.Domain.Shared.abppkg │ ├── ABPRaffleAppDomainErrorCodes.cs │ ├── Localization │ │ ├── ABPRaffleAppResource.cs │ │ └── ABPRaffleApp │ │ │ ├── zh-Hans.json │ │ │ ├── sv.json │ │ │ ├── ar.json │ │ │ ├── hi.json │ │ │ ├── fi.json │ │ │ ├── tr.json │ │ │ ├── it.json │ │ │ ├── sk.json │ │ │ ├── sl.json │ │ │ ├── de-DE.json │ │ │ ├── pt-BR.json │ │ │ ├── es.json │ │ │ ├── hu.json │ │ │ ├── hr.json │ │ │ ├── ru.json │ │ │ └── fr.json │ ├── Raffles │ │ ├── ParticipantConsts.cs │ │ └── RaffleConsts.cs │ ├── Books │ │ └── BookType.cs │ ├── MultiTenancy │ │ └── MultiTenancyConsts.cs │ ├── ABPRaffleAppGlobalFeatureConfigurator.cs │ ├── Shared │ │ └── Email.cs │ ├── YazilimAcademy.ABPRaffleApp.Domain.Shared.csproj │ ├── ABPRaffleAppDomainSharedModule.cs │ └── ABPRaffleAppModuleExtensionConfigurator.cs ├── YazilimAcademy.ABPRaffleApp.EntityFrameworkCore │ ├── YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.abppkg │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── EntityFrameworkCore │ │ ├── EntityFrameworkCoreABPRaffleAppDbSchemaMigrator.cs │ │ ├── Configurations │ │ │ ├── RaffleConfiguration.cs │ │ │ ├── RaffleResultConfiguration.cs │ │ │ └── ParticipantConfiguration.cs │ │ ├── ABPRaffleAppDbContextFactory.cs │ │ ├── ABPRaffleAppEfCoreEntityExtensionMappings.cs │ │ └── ABPRaffleAppEntityFrameworkCoreModule.cs │ └── YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.csproj ├── YazilimAcademy.ABPRaffleApp.HttpApi.Client │ ├── YazilimAcademy.ABPRaffleApp.HttpApi.Client.abppkg │ ├── ABPRaffleAppHttpApiClientModule.cs │ └── YazilimAcademy.ABPRaffleApp.HttpApi.Client.csproj └── YazilimAcademy.ABPRaffleApp.Application.Contracts │ ├── YazilimAcademy.ABPRaffleApp.Application.Contracts.abppkg │ ├── GoogleDrive │ ├── SpreadsheetDto.cs │ └── IGoogleDriveAppService.cs │ ├── Books │ ├── BookDto .cs │ ├── IBookAppService.cs │ └── CreateUpdateBookDto.cs │ ├── Raffles │ ├── ParticipantDto.cs │ ├── DrawResultDto.cs │ ├── RaffleDto.cs │ ├── CreateUpdateParticipantDto.cs │ ├── IParticipantAppService.cs │ ├── IRaffleAppService.cs │ └── CreateUpdateRaffleDto.cs │ ├── ABPRaffleAppDtoExtensions.cs │ ├── ABPRaffleAppApplicationContractsModule.cs │ ├── YazilimAcademy.ABPRaffleApp.Application.Contracts.csproj │ └── Permissions │ ├── ABPRaffleAppPermissions.cs │ └── ABPRaffleAppPermissionDefinitionProvider.cs ├── docs └── database-diagram.png ├── common.props ├── NuGet.Config ├── etc └── abp-studio │ └── run-profiles │ └── Default.abprun.json └── YazilimAcademy.ABPRaffleApp.abpsln /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.csproj] 2 | indent_size = 2 -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | **/wwwroot/libs/** linguist-vendored 2 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/YazilimAcademy.ABPRaffleApp.DbMigrator.abppkg: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /docs/database-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/docs/database-diagram.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/YazilimAcademy.ABPRaffleApp.Domain.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.domain" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/YazilimAcademy.ABPRaffleApp.HttpApi.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.http-api" 3 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/YazilimAcademy.ABPRaffleApp.TestBase.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.test" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/YazilimAcademy.ABPRaffleApp.Blazor.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "host.blazor-wasm" 3 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Domain.Tests/YazilimAcademy.ABPRaffleApp.Domain.Tests.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.test" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/YazilimAcademy.ABPRaffleApp.Application.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.application" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/YazilimAcademy.ABPRaffleApp.Domain.Shared.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.domain-shared" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.ef" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/YazilimAcademy.ABPRaffleApp.HttpApi.Host.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "host.http-api" 3 | } 4 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Application.Tests/YazilimAcademy.ABPRaffleApp.Application.Tests.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.test" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/YazilimAcademy.ABPRaffleApp.Blazor.Client.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.blazor-wasm-client" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Client/YazilimAcademy.ABPRaffleApp.HttpApi.Client.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.http-api-client" 3 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.test" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/YazilimAcademy.ABPRaffleApp.Application.Contracts.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.application-contracts" 3 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp.abppkg: -------------------------------------------------------------------------------- 1 | { 2 | "role": "lib.test" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Pages/Index.razor.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client.Pages; 2 | 3 | public partial class Index 4 | { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Pages/CookiePolicy.razor.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client.Pages; 2 | 3 | public partial class CookiePolicy 4 | { 5 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Pages/PrivacyPolicy.razor.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client.Pages; 2 | 3 | public partial class PrivacyPolicy 4 | { 5 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/favicon.ico -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/icon-192.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/icon-512.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | [assembly:InternalsVisibleToAttribute("YazilimAcademy.ABPRaffleApp.Application.Tests")] 3 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/abp.resourcemapping.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | aliases: { 3 | 4 | }, 5 | clean: [ 6 | 7 | ], 8 | mappings: { 9 | 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | [assembly:InternalsVisibleToAttribute("YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests")] 3 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/favicon.ico -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/favicon.ico -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/bg-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/bg-01.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/book.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/logo/lepton/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/logo/lepton/logo-dark.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/logo/lepton/logo-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/logo/lepton/logo-light.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/img-blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/img-blog.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/img-community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/img-community.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/img-support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/img-support.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/aspnet:9.0 2 | COPY bin/Release/net9.0/publish/ app/ 3 | WORKDIR /app 4 | ENV ASPNETCORE_URLS=http://+:80 5 | ENTRYPOINT ["dotnet", "YazilimAcademy.ABPRaffleApp.Blazor.dll"] -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/android-chrome-256x256.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yazilimacademy/abp-raffle-app/HEAD/src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/android-chrome-256x256.png -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/ABPRaffleAppTestConsts.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp; 2 | 3 | public static class ABPRaffleAppTestConsts 4 | { 5 | public const string CollectionDefinitionName = "ABPRaffleApp collection"; 6 | } 7 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/aspnet:9.0 2 | COPY bin/Release/net9.0/publish/ app/ 3 | WORKDIR /app 4 | ENV ASPNETCORE_URLS=http://+:80 5 | ENTRYPOINT ["dotnet", "YazilimAcademy.ABPRaffleApp.DbMigrator.dll"] -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Data/IABPRaffleAppDbSchemaMigrator.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.Data; 4 | 5 | public interface IABPRaffleAppDbSchemaMigrator 6 | { 7 | Task MigrateAsync(); 8 | } 9 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/aspnet:9.0 2 | COPY bin/Release/net9.0/publish/ app/ 3 | WORKDIR /app 4 | ENV ASPNETCORE_URLS=http://+:80 5 | ENTRYPOINT ["dotnet", "YazilimAcademy.ABPRaffleApp.HttpApi.Host.dll"] -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/ABPRaffleAppDomainErrorCodes.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp; 2 | 3 | public static class ABPRaffleAppDomainErrorCodes 4 | { 5 | /* You can add your business exception error codes here, as constants */ 6 | } 7 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | [assembly:InternalsVisibleToAttribute("YazilimAcademy.ABPRaffleApp.Domain.Tests")] 3 | [assembly:InternalsVisibleToAttribute("YazilimAcademy.ABPRaffleApp.TestBase")] 4 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "name": "my-app", 4 | "private": true, 5 | "dependencies": { 6 | "@volo/account": "~9.0.2", 7 | "@volo/abp.aspnetcore.mvc.ui.theme.leptonx": "~4.0.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 2 | @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI 3 | @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap 4 | @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleAppResource.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Localization; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.Localization; 4 | 5 | [LocalizationResourceName("ABPRaffleApp")] 6 | public class ABPRaffleAppResource 7 | { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/Models/Test/TestModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.Models.Test; 4 | 5 | public class TestModel 6 | { 7 | public string? Name { get; set; } 8 | 9 | public DateTime BirthDate { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Raffles/ParticipantConsts.cs: -------------------------------------------------------------------------------- 1 | 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 4 | 5 | public static class ParticipantConsts 6 | { 7 | public const int MaxFullNameLength = 150; 8 | public const int MaxEmailLength = 150; 9 | } 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Raffles/RaffleConsts.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 4 | 5 | public static class RaffleConsts 6 | { 7 | public const int MaxNameLength = 200; 8 | public const int MaxDescriptionLength = 2500; 9 | } 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Books/BookType.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Books; 2 | 3 | public enum BookType 4 | { 5 | Undefined, 6 | Adventure, 7 | Biography, 8 | Dystopia, 9 | Fantastic, 10 | Horror, 11 | Science, 12 | ScienceFiction, 13 | Poetry 14 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/service-worker.js: -------------------------------------------------------------------------------- 1 | // In development, always fetch from the network and do not enable offline support. 2 | // This is because caching would make development more difficult (changes would not 3 | // be reflected on the first load after each change). 4 | self.addEventListener('fetch', () => { }); 5 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Application.Tests/ABPRaffleAppApplicationTestBase.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp; 4 | 5 | public abstract class ABPRaffleAppApplicationTestBase : ABPRaffleAppTestBase 6 | where TStartupModule : IAbpModule 7 | { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Domain.Tests/ABPRaffleAppDomainTestModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp; 4 | 5 | [DependsOn( 6 | typeof(ABPRaffleAppDomainModule), 7 | typeof(ABPRaffleAppTestBaseModule) 8 | )] 9 | public class ABPRaffleAppDomainTestModule : AbpModule 10 | { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/ABPRaffleAppEntityFrameworkCoreFixture.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 4 | 5 | public class ABPRaffleAppEntityFrameworkCoreFixture : IDisposable 6 | { 7 | public void Dispose() 8 | { 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/ABPRaffleAppEntityFrameworkCoreTestBase.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 4 | 5 | public abstract class ABPRaffleAppEntityFrameworkCoreTestBase : ABPRaffleAppTestBase 6 | { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Settings/ABPRaffleAppSettings.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Settings; 2 | 3 | public static class ABPRaffleAppSettings 4 | { 5 | private const string Prefix = "ABPRaffleApp"; 6 | 7 | //Add your own setting names here. Example: 8 | //public const string MySetting1 = Prefix + ".MySetting1"; 9 | } 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffffff 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffffff 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Application.Tests/ABPRaffleAppApplicationTestModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp; 4 | 5 | [DependsOn( 6 | typeof(ABPRaffleAppApplicationModule), 7 | typeof(ABPRaffleAppDomainTestModule) 8 | )] 9 | public class ABPRaffleAppApplicationTestModule : AbpModule 10 | { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Navigation/ABPRaffleAppMenus.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client.Navigation; 2 | 3 | public class ABPRaffleAppMenus 4 | { 5 | private const string Prefix = "ABPRaffleApp"; 6 | 7 | public const string Home = Prefix + ".Home"; 8 | 9 | public const string HostDashboard = Prefix + ".HostDashboard"; 10 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/x-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Domain.Tests/ABPRaffleAppDomainTestBase.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Modularity; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp; 4 | 5 | /* Inherit from this class for your domain layer tests. */ 6 | public abstract class ABPRaffleAppDomainTestBase : ABPRaffleAppTestBase 7 | where TStartupModule : IAbpModule 8 | { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/GoogleDrive/SpreadsheetDto.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.GoogleDrive; 2 | 3 | public sealed record SpreadsheetDto 4 | { 5 | public string Id { get; set; } 6 | public string Name { get; set; } 7 | 8 | public SpreadsheetDto(string id, string name) 9 | { 10 | Id = id; 11 | Name = name; 12 | } 13 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Books/Book.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Domain.Entities.Auditing; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Books; 5 | 6 | public class Book : AuditedAggregateRoot 7 | { 8 | public string Name { get; set; } 9 | 10 | public BookType Type { get; set; } 11 | 12 | public DateTime PublishDate { get; set; } 13 | 14 | public float Price { get; set; } 15 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/ABPRaffleAppEntityFrameworkCoreCollection.cs: -------------------------------------------------------------------------------- 1 | using Xunit; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 4 | 5 | [CollectionDefinition(ABPRaffleAppTestConsts.CollectionDefinitionName)] 6 | public class ABPRaffleAppEntityFrameworkCoreCollection : ICollectionFixture 7 | { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/ABPRaffleAppEntityFrameworkCoreCollectionFixtureBase.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 2 | using Xunit; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 5 | 6 | public class ABPRaffleAppEntityFrameworkCoreCollectionFixtureBase : ICollectionFixture 7 | { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Books/BookDto .cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Application.Dtos; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Books; 5 | 6 | public class BookDto : AuditedEntityDto 7 | { 8 | public string Name { get; set; } 9 | 10 | public BookType Type { get; set; } 11 | 12 | public DateTime PublishDate { get; set; } 13 | 14 | public float Price { get; set; } 15 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/GoogleDrive/IGoogleDriveAppService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Volo.Abp.Application.Services; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp.GoogleDrive; 7 | 8 | public interface IGoogleDriveAppService : IApplicationService 9 | { 10 | Task> GetAllSpreadsheetsAsync(); 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/ParticipantDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Application.Dtos; 3 | using YazilimAcademy.ABPRaffleApp.Domain.Shared; 4 | 5 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 6 | 7 | public class ParticipantDto : AuditedEntityDto 8 | { 9 | public Guid RaffleId { get; set; } 10 | public FullName FullName { get; set; } 11 | public Email Email { get; set; } 12 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Pages/Index.razor.css: -------------------------------------------------------------------------------- 1 | /* Getting-Started */ 2 | .card-bg-image { 3 | pointer-events: none; 4 | position: absolute; 5 | width: 630px; 6 | height: auto; 7 | bottom: 0; 8 | right: 0; 9 | z-index: 1; 10 | } 11 | .starting-content { 12 | position: relative; 13 | z-index: 2; 14 | } 15 | /* Getting-Started End */ 16 | 17 | /* Write here your styles for the Index page */ -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Samples; 2 | using Xunit; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Domains; 5 | 6 | [Collection(ABPRaffleAppTestConsts.CollectionDefinitionName)] 7 | public class EfCoreSampleDomainTests : SampleDomainTests 8 | { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/ABPRaffleAppComponentBase.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Localization; 2 | using Volo.Abp.AspNetCore.Components; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client; 5 | 6 | public abstract class ABPRaffleAppComponentBase : AbpComponentBase 7 | { 8 | protected ABPRaffleAppComponentBase() 9 | { 10 | LocalizationResource = typeof(ABPRaffleAppResource); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.MultiTenancy; 2 | 3 | public static class MultiTenancyConsts 4 | { 5 | /* Enable/disable multi-tenancy easily in a single point. 6 | * If you will never need to multi-tenancy, you can remove 7 | * related modules and code parts, including this file. 8 | */ 9 | public const bool IsEnabled = false; 10 | } 11 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Samples; 2 | using Xunit; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Applications; 5 | 6 | [Collection(ABPRaffleAppTestConsts.CollectionDefinitionName)] 7 | public class EfCoreSampleAppServiceTests : SampleAppServiceTests 8 | { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/Books/EfCoreBookAppService_Tests.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Books; 2 | using Xunit; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Applications.Books; 5 | 6 | [Collection(ABPRaffleAppTestConsts.CollectionDefinitionName)] 7 | public class EfCoreBookAppService_Tests : BookAppService_Tests 8 | { 9 | 10 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/ABPRaffleAppAppService.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Localization; 2 | using Volo.Abp.Application.Services; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp; 5 | 6 | /* Inherit your application services from this class. 7 | */ 8 | public abstract class ABPRaffleAppAppService : ApplicationService 9 | { 10 | protected ABPRaffleAppAppService() 11 | { 12 | LocalizationResource = typeof(ABPRaffleAppResource); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/ABPRaffleAppDbMigratorModule.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 2 | using Volo.Abp.Autofac; 3 | using Volo.Abp.Modularity; 4 | 5 | namespace YazilimAcademy.ABPRaffleApp.DbMigrator; 6 | 7 | [DependsOn( 8 | typeof(AbpAutofacModule), 9 | typeof(ABPRaffleAppEntityFrameworkCoreModule), 10 | typeof(ABPRaffleAppApplicationContractsModule) 11 | )] 12 | public class ABPRaffleAppDbMigratorModule : AbpModule 13 | { 14 | } 15 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/Controllers/ABPRaffleAppController.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Localization; 2 | using Volo.Abp.AspNetCore.Mvc; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Controllers; 5 | 6 | /* Inherit your controllers from this class. 7 | */ 8 | public abstract class ABPRaffleAppController : AbpControllerBase 9 | { 10 | protected ABPRaffleAppController() 11 | { 12 | LocalizationResource = typeof(ABPRaffleAppResource); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Settings/ABPRaffleAppSettingDefinitionProvider.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Settings; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp.Settings; 4 | 5 | public class ABPRaffleAppSettingDefinitionProvider : SettingDefinitionProvider 6 | { 7 | public override void Define(ISettingDefinitionContext context) 8 | { 9 | //Define your own settings here. Example: 10 | //context.Add(new SettingDefinition(ABPRaffleAppSettings.MySetting1)); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "RemoteServices": { 3 | "Default": { 4 | "BaseUrl": "https://localhost:44300/" 5 | } 6 | }, 7 | "IdentityClients": { 8 | "Default": { 9 | "GrantType": "password", 10 | "ClientId": "ABPRaffleApp_App", 11 | "UserName": "admin", 12 | "UserPassword": "1q2w3E*", 13 | "Authority": "https://localhost:44301", 14 | "Scope": "ABPRaffleApp" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/ABPRaffleAppConsts.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Identity; 2 | 3 | namespace YazilimAcademy.ABPRaffleApp; 4 | 5 | public static class ABPRaffleAppConsts 6 | { 7 | public const string DbTablePrefix = "App"; 8 | public const string? DbSchema = null; 9 | public const string AdminEmailDefaultValue = IdentityDataSeedContributor.AdminEmailDefaultValue; 10 | public const string AdminPasswordDefaultValue = IdentityDataSeedContributor.AdminPasswordDefaultValue; 11 | } 12 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using static Microsoft.AspNetCore.Components.Web.RenderMode 7 | @using Microsoft.AspNetCore.Components.Web.Virtualization 8 | @using Microsoft.JSInterop 9 | @using YazilimAcademy.ABPRaffleApp.Blazor.Client.Components 10 | @using YazilimAcademy.ABPRaffleApp.Blazor.Client -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/DrawResultDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 5 | 6 | public sealed record DrawResultDto 7 | { 8 | public List Winners { get; set; } 9 | public List Backups { get; set; } 10 | 11 | public DrawResultDto(List winners, List backups) 12 | { 13 | Winners = winners; 14 | Backups = backups; 15 | } 16 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Data/NullABPRaffleAppDbSchemaMigrator.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Volo.Abp.DependencyInjection; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Data; 5 | 6 | /* This is used if database provider does't define 7 | * IABPRaffleAppDbSchemaMigrator implementation. 8 | */ 9 | public class NullABPRaffleAppDbSchemaMigrator : IABPRaffleAppDbSchemaMigrator, ITransientDependency 10 | { 11 | public Task MigrateAsync() 12 | { 13 | return Task.CompletedTask; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Books/IBookAppService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Application.Dtos; 3 | using Volo.Abp.Application.Services; 4 | 5 | namespace YazilimAcademy.ABPRaffleApp.Books; 6 | 7 | public interface IBookAppService : 8 | ICrudAppService< //Defines CRUD methods 9 | BookDto, //Used to show books 10 | Guid, //Primary key of the book entity 11 | PagedAndSortedResultRequestDto, //Used for paging/sorting 12 | CreateUpdateBookDto> //Used to create/update a book 13 | { 14 | 15 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/RaffleDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Application.Dtos; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 5 | 6 | public sealed class RaffleDto : AuditedEntityDto 7 | { 8 | public string Name { get; set; } 9 | 10 | public string Description { get; set; } 11 | 12 | public DateTimeOffset StartDate { get; set; } 13 | 14 | public DateTimeOffset EndDate { get; set; } 15 | 16 | public bool IsActive { get; set; } 17 | public int ParticipantCount { get; set; } 18 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/clients/angular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ABPRaffleApp", 3 | "short_name": "YazilimAcademy.ABPRaffleApp", 4 | "start_url": "./", 5 | "display": "standalone", 6 | "background_color": "#ffffff", 7 | "theme_color": "#03173d", 8 | "prefer_related_applications": false, 9 | "icons": [ 10 | { 11 | "src": "icon-512.png", 12 | "type": "image/png", 13 | "sizes": "512x512" 14 | }, 15 | { 16 | "src": "icon-192.png", 17 | "type": "image/png", 18 | "sizes": "192x192" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /common.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | latest 4 | 1.0.0 5 | $(NoWarn);CS1591 6 | app 7 | 8 | 9 | 10 | 11 | $(NoWarn);0436 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-256x256.png", 12 | "sizes": "256x256", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-256x256.png", 12 | "sizes": "256x256", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/CreateUpdateParticipantDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 5 | 6 | public class CreateUpdateParticipantDto 7 | { 8 | [Required] 9 | public Guid RaffleId { get; set; } 10 | 11 | [Required] 12 | [StringLength(128)] 13 | public string FirstName { get; set; } 14 | 15 | [Required] 16 | [StringLength(128)] 17 | public string LastName { get; set; } 18 | 19 | [EmailAddress] 20 | public string Email { get; set; } 21 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/IParticipantAppService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Volo.Abp.Application.Dtos; 4 | using Volo.Abp.Application.Services; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 7 | 8 | public interface IParticipantAppService : 9 | ICrudAppService< 10 | ParticipantDto, 11 | Guid, 12 | PagedAndSortedResultRequestDto, 13 | CreateUpdateParticipantDto> 14 | { 15 | Task> GetParticipantsByRaffleAsync(Guid raffleId, PagedAndSortedResultRequestDto input); 16 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/ABPRaffleAppBlazorAutoMapperProfile.cs: -------------------------------------------------------------------------------- 1 | using AutoMapper; 2 | using YazilimAcademy.ABPRaffleApp.Books; 3 | using YazilimAcademy.ABPRaffleApp.Raffles; 4 | 5 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client; 6 | 7 | public class ABPRaffleAppBlazorAutoMapperProfile : Profile 8 | { 9 | public ABPRaffleAppBlazorAutoMapperProfile() 10 | { 11 | CreateMap(); 12 | 13 | CreateMap(); 14 | 15 | //Define your AutoMapper configuration here for the Blazor project. 16 | } 17 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Books/CreateUpdateBookDto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Books; 5 | 6 | public class CreateUpdateBookDto 7 | { 8 | [Required] 9 | [StringLength(128)] 10 | public string Name { get; set; } = string.Empty; 11 | 12 | [Required] 13 | public BookType Type { get; set; } = BookType.Undefined; 14 | 15 | [Required] 16 | [DataType(DataType.Date)] 17 | public DateTime PublishDate { get; set; } = DateTime.Now; 18 | 19 | [Required] 20 | public float Price { get; set; } 21 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/YazilimAcademy.ABPRaffleApp.Blazor.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ConnectionStrings": { 3 | "Default": "Server=localhost;Port=1453;Database=ABPRaffleApp;User Id=postgres;Password=123alperhocam123;" 4 | }, 5 | "OpenIddict": { 6 | "Applications": { 7 | "ABPRaffleApp_App": { 8 | "ClientId": "ABPRaffleApp_App" }, 9 | "ABPRaffleApp_Blazor": { 10 | "ClientId": "ABPRaffleApp_Blazor", 11 | "RootUrl": "https://localhost:44312" 12 | }, 13 | "ABPRaffleApp_Swagger": { 14 | "ClientId": "ABPRaffleApp_Swagger", 15 | "RootUrl": "https://localhost:44397/" 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /NuGet.Config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/ABPRaffleAppBundleContributor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Volo.Abp.Bundling; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client; 8 | 9 | /* Add your global styles/scripts here. 10 | * See https://docs.abp.io/en/abp/latest/UI/Blazor/Global-Scripts-Styles to learn how to use it 11 | */ 12 | public class ABPRaffleAppBundleContributor : IBundleContributor 13 | { 14 | public void AddScripts(BundleContext context) 15 | { 16 | } 17 | 18 | public void AddStyles(BundleContext context) 19 | { 20 | context.Add("main.css", true); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/ABPRaffleAppBrandingProvider.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Localization; 2 | using YazilimAcademy.ABPRaffleApp.Localization; 3 | using Volo.Abp.DependencyInjection; 4 | using Volo.Abp.Ui.Branding; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp; 7 | 8 | [Dependency(ReplaceServices = true)] 9 | public class ABPRaffleAppBrandingProvider : DefaultBrandingProvider 10 | { 11 | private IStringLocalizer _localizer; 12 | 13 | public ABPRaffleAppBrandingProvider(IStringLocalizer localizer) 14 | { 15 | _localizer = localizer; 16 | } 17 | 18 | public override string AppName => _localizer["AppName"]; 19 | } 20 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/global-styles.css: -------------------------------------------------------------------------------- 1 | /* Your Global Styles */ 2 | :root .lpx-theme-dim, 3 | :root .lpx-theme-dark { 4 | --lpx-logo: url('/images/logo/leptonx/icon.svg'); 5 | --lpx-logo-icon: url('/images/logo/leptonx/icon.svg'); 6 | } 7 | 8 | :root .lpx-theme-light { 9 | --lpx-logo: url('/images/logo/leptonx/icon.svg'); 10 | --lpx-logo-icon: url('/images/logo/leptonx/icon.svg'); 11 | } 12 | 13 | :root { 14 | --lpx-theme-light-bg: url('/LeptonX/images/login-pages/login-bg-img-light.svg'); 15 | --lpx-theme-dim-bg: url('/LeptonX/images/login-pages/login-bg-img-dim.svg'); 16 | --lpx-theme-dark-bg: url('/LeptonX/images/login-pages/login-bg-img-dark.svg'); 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client; 5 | 6 | public class Program 7 | { 8 | public async static Task Main(string[] args) 9 | { 10 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 11 | 12 | var application = await builder.AddApplicationAsync(options => 13 | { 14 | options.UseAutofac(); 15 | }); 16 | 17 | var host = builder.Build(); 18 | 19 | await application.InitializeApplicationAsync(host.Services); 20 | 21 | await host.RunAsync(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using Microsoft.AspNetCore.Components.Authorization 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 7 | @using static Microsoft.AspNetCore.Components.Web.RenderMode 8 | @using Microsoft.JSInterop 9 | @using Volo.Abp.AspNetCore.Components 10 | @using Volo.Abp.AspNetCore.Components.WebAssembly 11 | @using YazilimAcademy.ABPRaffleApp.Blazor.Client 12 | @using Blazorise 13 | @using Blazorise.DataGrid 14 | @using Blazorise.Components 15 | @using Volo.Abp.BlazoriseUI 16 | @using Volo.Abp.BlazoriseUI.Components -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/confetti.js: -------------------------------------------------------------------------------- 1 | window.startConfetti = function () { 2 | var duration = 3 * 1000; 3 | var end = Date.now() + duration; 4 | 5 | // create a random style 6 | (function frame() { 7 | // launch confetti 8 | confetti({ 9 | particleCount: 3, 10 | angle: 60, 11 | spread: 55, 12 | origin: { x: 0 } 13 | }); 14 | confetti({ 15 | particleCount: 3, 16 | angle: 120, 17 | spread: 55, 18 | origin: { x: 1 } 19 | }); 20 | 21 | // keep going until time is up 22 | if (Date.now() < end) { 23 | requestAnimationFrame(frame); 24 | } 25 | }()); 26 | } 27 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/ABPRaffleAppGlobalFeatureConfigurator.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.GlobalFeatures; 2 | using Volo.Abp.Threading; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp; 5 | 6 | public static class ABPRaffleAppGlobalFeatureConfigurator 7 | { 8 | private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); 9 | 10 | public static void Configure() 11 | { 12 | OneTimeRunner.Run(() => 13 | { 14 | /* You can configure (enable/disable) global features of the used modules here. 15 | * Please refer to the documentation to learn more about the Global Features System: 16 | * https://docs.abp.io/en/abp/latest/Global-Features 17 | */ 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/IRaffleAppService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Volo.Abp.Application.Dtos; 4 | using Volo.Abp.Application.Services; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 7 | 8 | public interface IRaffleAppService : 9 | ICrudAppService< //Defines CRUD methods 10 | RaffleDto, //Used to show books 11 | Guid, //Primary key of the book entity 12 | PagedAndSortedResultRequestDto, //Used for paging/sorting 13 | CreateUpdateRaffleDto> //Used to create/update a book 14 | { 15 | Task> GetActiveRaffleAsync(PagedAndSortedResultRequestDto input); 16 | Task DrawAsync(Guid raffleId, int winnerCount = 3, int backupCount = 3); 17 | } 18 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "SelfUrl": "https://localhost:44312" 4 | }, 5 | "AuthServer": { 6 | "Authority": "https://localhost:44397", 7 | "ClientId": "ABPRaffleApp_Blazor", 8 | "ResponseType": "code" 9 | }, 10 | "RemoteServices": { 11 | "Default": { 12 | "BaseUrl": "https://localhost:44397" 13 | }, 14 | "AbpAccountPublic": { 15 | "BaseUrl": "https://localhost:44397" 16 | } 17 | }, 18 | "AbpCli": { 19 | "Bundle": { 20 | "Mode": "BundleAndMinify", /* Options: None, Bundle, BundleAndMinify */ 21 | "Name": "global", 22 | "IsBlazorWebApp": true, 23 | "Parameters": { 24 | "LeptonXTheme.Layout": "side-menu" 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "SelfUrl": "https://localhost:44397", 4 | "CorsOrigins": "https://*.ABPRaffleApp.com,https://localhost:44312", 5 | "RedirectAllowedUrls": "https://localhost:44312", 6 | "DisablePII": false, 7 | "HealthCheckUrl": "/health-status" 8 | }, 9 | "ConnectionStrings": { 10 | "Default": "Server=localhost;Port=1453;Database=ABPRaffleApp;User Id=postgres;Password=123alperhocam123;" 11 | }, 12 | "AuthServer": { 13 | "Authority": "https://localhost:44397", 14 | "RequireHttpsMetadata": true, 15 | "SwaggerClientId": "ABPRaffleApp_Swagger", 16 | "CertificatePassPhrase": "587c0a19-d458-4bef-b289-7c5ea8be0994" 17 | }, 18 | "StringEncryption": { 19 | "DefaultPassPhrase": "TC4XsCFbA1nvnUZM" 20 | }} -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Domain.Tests/YazilimAcademy.ABPRaffleApp.Domain.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /etc/abp-studio/run-profiles/Default.abprun.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": { 3 | "YazilimAcademy.ABPRaffleApp.HttpApi.Host": { 4 | "type": "dotnet-project", 5 | "launchUrl": "https://localhost:44397", 6 | "path": "../../../src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/YazilimAcademy.ABPRaffleApp.HttpApi.Host.csproj", 7 | "kubernetesService": ".*-httpapihost$", 8 | "execution": { 9 | "order": 4 10 | } 11 | }, 12 | "YazilimAcademy.ABPRaffleApp.Blazor": { 13 | "type": "dotnet-project", 14 | "launchUrl": "https://localhost:44312", 15 | "path": "../../../src/YazilimAcademy.ABPRaffleApp.Blazor/YazilimAcademy.ABPRaffleApp.Blazor.csproj", 16 | "kubernetesService": ".*-blazor$", 17 | "execution": { 18 | "order": 2 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/ABPRaffleAppBrandingProvider.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Localization; 2 | using YazilimAcademy.ABPRaffleApp.Localization; 3 | using Microsoft.Extensions.Localization; 4 | using YazilimAcademy.ABPRaffleApp.Localization; 5 | using Volo.Abp.DependencyInjection; 6 | using Volo.Abp.Ui.Branding; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client; 9 | 10 | [Dependency(ReplaceServices = true)] 11 | public class ABPRaffleAppBrandingProvider : DefaultBrandingProvider 12 | { 13 | private IStringLocalizer _localizer; 14 | 15 | public ABPRaffleAppBrandingProvider(IStringLocalizer localizer) 16 | { 17 | _localizer = localizer; 18 | } 19 | 20 | public override string AppName => _localizer["AppName"]; 21 | } 22 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "https://localhost:44397", 7 | "sslPort": 44397 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "YazilimAcademy.ABPRaffleApp.HttpApi.Host": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "applicationUrl": "https://localhost:44397", 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Application.Tests/YazilimAcademy.ABPRaffleApp.Application.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/ABPRaffleAppTestDataBuilder.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Volo.Abp.Data; 3 | using Volo.Abp.DependencyInjection; 4 | using Volo.Abp.MultiTenancy; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp; 7 | 8 | public class ABPRaffleAppTestDataSeedContributor : IDataSeedContributor, ITransientDependency 9 | { 10 | private readonly ICurrentTenant _currentTenant; 11 | 12 | public ABPRaffleAppTestDataSeedContributor(ICurrentTenant currentTenant) 13 | { 14 | _currentTenant = currentTenant; 15 | } 16 | 17 | public Task SeedAsync(DataSeedContext context) 18 | { 19 | /* Seed additional test data... */ 20 | 21 | using (_currentTenant.Change(context?.TenantId)) 22 | { 23 | return Task.CompletedTask; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Components/Layout/LeptonXFooter.razor: -------------------------------------------------------------------------------- 1 | @using Volo.Abp.DependencyInjection 2 | @using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu 3 | 4 | @inherits Footer 5 | @attribute [ExposeServices(typeof(Footer))] 6 | @attribute [Dependency(ReplaceServices = true)] 7 | 8 |
9 |
10 | 16 | 21 |
22 |
23 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Raffles/CreateUpdateRaffleDto.cs: -------------------------------------------------------------------------------- 1 | 2 | using System; 3 | using System.ComponentModel.DataAnnotations; 4 | 5 | namespace YazilimAcademy.ABPRaffleApp.Raffles; 6 | 7 | public sealed class CreateUpdateRaffleDto 8 | { 9 | [Required] 10 | [MaxLength(RaffleConsts.MaxNameLength)] 11 | public string Name { get; set; } 12 | 13 | [Required] 14 | [MaxLength(RaffleConsts.MaxDescriptionLength)] 15 | public string Description { get; set; } 16 | 17 | [Required] 18 | public string SpreadsheetId { get; set; } 19 | 20 | [Required] 21 | [DataType(DataType.DateTime)] 22 | public DateTimeOffset StartDate { get; set; } = DateTimeOffset.UtcNow; 23 | 24 | [Required] 25 | [DataType(DataType.DateTime)] 26 | public DateTimeOffset EndDate { get; set; } = DateTimeOffset.UtcNow.AddDays(7); 27 | 28 | [Required] 29 | public bool IsActive { get; set; } 30 | } 31 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/Security/FakeCurrentPrincipalAccessor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Security.Claims; 4 | using Volo.Abp.DependencyInjection; 5 | using Volo.Abp.Security.Claims; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.Security; 8 | 9 | [Dependency(ReplaceServices = true)] 10 | public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor 11 | { 12 | protected override ClaimsPrincipal GetClaimsPrincipal() 13 | { 14 | return GetPrincipal(); 15 | } 16 | 17 | private ClaimsPrincipal GetPrincipal() 18 | { 19 | return new ClaimsPrincipal(new ClaimsIdentity(new List 20 | { 21 | new Claim(AbpClaimTypes.UserId, "2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), 22 | new Claim(AbpClaimTypes.UserName, "admin"), 23 | new Claim(AbpClaimTypes.Email, "admin@abp.io") 24 | })); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/youtube.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/ABPRaffleAppDtoExtensions.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Identity; 2 | using Volo.Abp.ObjectExtending; 3 | using Volo.Abp.Threading; 4 | 5 | namespace YazilimAcademy.ABPRaffleApp; 6 | 7 | public static class ABPRaffleAppDtoExtensions 8 | { 9 | private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); 10 | 11 | public static void Configure() 12 | { 13 | OneTimeRunner.Run(() => 14 | { 15 | /* You can add extension properties to DTOs 16 | * defined in the depended modules. 17 | * 18 | * Example: 19 | * 20 | * ObjectExtensionManager.Instance 21 | * .AddOrUpdateProperty("Title"); 22 | * 23 | * See the documentation for more: 24 | * https://docs.abp.io/en/abp/latest/Object-Extensions 25 | */ 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "https://localhost:44312", 7 | "sslPort": 44312 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "YazilimAcademy.ABPRaffleApp.Blazor": { 20 | "commandName": "Project", 21 | "launchBrowser": true, 22 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 23 | "applicationUrl": "https://localhost:44312", 24 | "environmentVariables": { 25 | "ASPNETCORE_ENVIRONMENT": "Development" 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/Controllers/GoogleDrives/GoogleDriveController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | using Asp.Versioning; 4 | using Microsoft.AspNetCore.Http; 5 | using Microsoft.AspNetCore.Mvc; 6 | using Volo.Abp; 7 | using Volo.Abp.AspNetCore.Mvc; 8 | using YazilimAcademy.ABPRaffleApp.GoogleDrive; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp.Controllers.GoogleDrives 11 | { 12 | [RemoteService] 13 | [Area("app")] 14 | [ControllerName("GoogleDrive")] 15 | [Route("api/app/google-drives")] 16 | public class GoogleDriveController : AbpController 17 | { 18 | private readonly IGoogleDriveAppService _googleDriveAppService; 19 | 20 | public GoogleDriveController(IGoogleDriveAppService googleDriveAppService) 21 | { 22 | _googleDriveAppService = googleDriveAppService; 23 | } 24 | 25 | [HttpGet] 26 | 27 | public virtual Task> GetAllSpreadsheetsAsync() 28 | { 29 | return _googleDriveAppService.GetAllSpreadsheetsAsync(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/Books/BookAppService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using YazilimAcademy.ABPRaffleApp.Permissions; 3 | using Volo.Abp.Application.Dtos; 4 | using Volo.Abp.Application.Services; 5 | using Volo.Abp.Domain.Repositories; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.Books; 8 | 9 | public class BookAppService : 10 | CrudAppService< 11 | Book, //The Book entity 12 | BookDto, //Used to show books 13 | Guid, //Primary key of the book entity 14 | PagedAndSortedResultRequestDto, //Used for paging/sorting 15 | CreateUpdateBookDto>, //Used to create/update a book 16 | IBookAppService //implement the IBookAppService 17 | { 18 | public BookAppService(IRepository repository) 19 | : base(repository) 20 | { 21 | GetPolicyName = ABPRaffleAppPermissions.Books.Default; 22 | GetListPolicyName = ABPRaffleAppPermissions.Books.Default; 23 | CreatePolicyName = ABPRaffleAppPermissions.Books.Create; 24 | UpdatePolicyName = ABPRaffleAppPermissions.Books.Edit; 25 | DeletePolicyName = ABPRaffleAppPermissions.Books.Delete; 26 | } 27 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/ABPRaffleAppApplicationAutoMapperProfile.cs: -------------------------------------------------------------------------------- 1 | using AutoMapper; 2 | using Volo.Abp.AutoMapper; 3 | using YazilimAcademy.ABPRaffleApp.Books; 4 | using YazilimAcademy.ABPRaffleApp.Domain.Participants; 5 | using YazilimAcademy.ABPRaffleApp.Domain.Raffles; 6 | using YazilimAcademy.ABPRaffleApp.Domain.Shared; 7 | using YazilimAcademy.ABPRaffleApp.Raffles; 8 | 9 | namespace YazilimAcademy.ABPRaffleApp; 10 | 11 | public class ABPRaffleAppApplicationAutoMapperProfile : Profile 12 | { 13 | public ABPRaffleAppApplicationAutoMapperProfile() 14 | { 15 | CreateMap(); 16 | CreateMap(); 17 | CreateMap(); 18 | CreateMap(); 19 | CreateMap(); 20 | 21 | CreateMap() 22 | .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.FullName)); 23 | 24 | CreateMap() 25 | .ConstructUsing(src => FullName.Create($"{src.FirstName} {src.LastName}")); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/ABPRaffleAppConsoleApiClientModule.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Extensions.DependencyInjection; 3 | using Polly; 4 | using Volo.Abp.Autofac; 5 | using Volo.Abp.Http.Client; 6 | using Volo.Abp.Http.Client.IdentityModel; 7 | using Volo.Abp.Modularity; 8 | 9 | namespace YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp; 10 | 11 | [DependsOn( 12 | typeof(AbpAutofacModule), 13 | typeof(ABPRaffleAppHttpApiClientModule), 14 | typeof(AbpHttpClientIdentityModelModule) 15 | )] 16 | public class ABPRaffleAppConsoleApiClientModule : AbpModule 17 | { 18 | public override void PreConfigureServices(ServiceConfigurationContext context) 19 | { 20 | PreConfigure(options => 21 | { 22 | options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) => 23 | { 24 | clientBuilder.AddTransientHttpErrorPolicy( 25 | policyBuilder => policyBuilder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))) 26 | ); 27 | }); 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Raffles/RaffleResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Domain.Entities.Auditing; 3 | using Volo.Abp.Domain.Entities; 4 | using YazilimAcademy.ABPRaffleApp.Domain.Raffles; 5 | using YazilimAcademy.ABPRaffleApp.Domain.Participants; 6 | 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.Domain.Results 9 | { 10 | public class RaffleResult : FullAuditedEntity, IHasConcurrencyStamp 11 | { 12 | public Guid RaffleId { get; set; } 13 | public Raffle Raffle { get; set; } 14 | 15 | public Guid ParticipantId { get; set; } 16 | public Participant Participant { get; set; } 17 | 18 | public bool IsWinner { get; set; } 19 | public int Order { get; set; } 20 | 21 | public string ConcurrencyStamp { get; set; } 22 | 23 | protected RaffleResult() 24 | { 25 | } 26 | 27 | public RaffleResult(Guid id, Guid raffleId, Guid participantId, bool isWinner = false, int order = 0) 28 | : base(id) 29 | { 30 | RaffleId = raffleId; 31 | ParticipantId = participantId; 32 | IsWinner = isWinner; 33 | Order = order; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Application.Tests/Samples/SampleAppServiceTests.cs: -------------------------------------------------------------------------------- 1 | using Shouldly; 2 | using System.Threading.Tasks; 3 | using Volo.Abp.Identity; 4 | using Volo.Abp.Modularity; 5 | using Xunit; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.Samples; 8 | 9 | /* This is just an example test class. 10 | * Normally, you don't test code of the modules you are using 11 | * (like IIdentityUserAppService here). 12 | * Only test your own application services. 13 | */ 14 | public abstract class SampleAppServiceTests : ABPRaffleAppApplicationTestBase 15 | where TStartupModule : IAbpModule 16 | { 17 | private readonly IIdentityUserAppService _userAppService; 18 | 19 | protected SampleAppServiceTests() 20 | { 21 | _userAppService = GetRequiredService(); 22 | } 23 | 24 | [Fact] 25 | public async Task Initial_Data_Should_Contain_Admin_User() 26 | { 27 | //Act 28 | var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); 29 | 30 | //Assert 31 | result.TotalCount.ShouldBeGreaterThan(0); 32 | result.Items.ShouldContain(u => u.UserName == "admin"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Microsoft.Extensions.Configuration; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using Volo.Abp; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp; 8 | 9 | class Program 10 | { 11 | static async Task Main(string[] args) 12 | { 13 | using (var application = await AbpApplicationFactory.CreateAsync(options => 14 | { 15 | var builder = new ConfigurationBuilder(); 16 | builder.AddJsonFile("appsettings.json", false); 17 | builder.AddJsonFile("appsettings.secrets.json", true); 18 | options.Services.ReplaceConfiguration(builder.Build()); 19 | options.UseAutofac(); 20 | })) 21 | { 22 | await application.InitializeAsync(); 23 | 24 | var demo = application.ServiceProvider.GetRequiredService(); 25 | await demo.RunAsync(); 26 | 27 | Console.WriteLine("Press ENTER to stop application..."); 28 | Console.ReadLine(); 29 | 30 | await application.ShutdownAsync(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreABPRaffleAppDbSchemaMigrator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Microsoft.EntityFrameworkCore; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using YazilimAcademy.ABPRaffleApp.Data; 6 | using Volo.Abp.DependencyInjection; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 9 | 10 | public class EntityFrameworkCoreABPRaffleAppDbSchemaMigrator 11 | : IABPRaffleAppDbSchemaMigrator, ITransientDependency 12 | { 13 | private readonly IServiceProvider _serviceProvider; 14 | 15 | public EntityFrameworkCoreABPRaffleAppDbSchemaMigrator(IServiceProvider serviceProvider) 16 | { 17 | _serviceProvider = serviceProvider; 18 | } 19 | 20 | public async Task MigrateAsync() 21 | { 22 | /* We intentionally resolving the ABPRaffleAppDbContext 23 | * from IServiceProvider (instead of directly injecting it) 24 | * to properly get the connection string of the current tenant in the 25 | * current scope. 26 | */ 27 | 28 | await _serviceProvider 29 | .GetRequiredService() 30 | .Database 31 | .MigrateAsync(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/ABPRaffleAppApplicationContractsModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.Account; 2 | using Volo.Abp.Modularity; 3 | using Volo.Abp.PermissionManagement; 4 | using Volo.Abp.SettingManagement; 5 | using Volo.Abp.FeatureManagement; 6 | using Volo.Abp.Identity; 7 | using Volo.Abp.AuditLogging; 8 | using Volo.Abp.LanguageManagement; 9 | using Volo.Abp.Gdpr; 10 | 11 | namespace YazilimAcademy.ABPRaffleApp; 12 | 13 | [DependsOn( 14 | typeof(ABPRaffleAppDomainSharedModule), 15 | typeof(AbpFeatureManagementApplicationContractsModule), 16 | typeof(AbpSettingManagementApplicationContractsModule), 17 | typeof(AbpIdentityApplicationContractsModule), 18 | typeof(AbpAccountPublicApplicationContractsModule), 19 | typeof(AbpAccountAdminApplicationContractsModule), 20 | typeof(AbpAuditLoggingApplicationContractsModule), 21 | typeof(LanguageManagementApplicationContractsModule), 22 | typeof(AbpGdprApplicationContractsModule), 23 | typeof(AbpPermissionManagementApplicationContractsModule) 24 | )] 25 | public class ABPRaffleAppApplicationContractsModule : AbpModule 26 | { 27 | public override void PreConfigureServices(ServiceConfigurationContext context) 28 | { 29 | ABPRaffleAppDtoExtensions.Configure(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/HealthChecks/ABPRaffleAppDatabaseCheck.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using Microsoft.Extensions.Diagnostics.HealthChecks; 5 | using Volo.Abp.DependencyInjection; 6 | using Volo.Abp.Identity; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.HealthChecks; 9 | 10 | public class ABPRaffleAppDatabaseCheck : IHealthCheck, ITransientDependency 11 | { 12 | protected readonly IIdentityRoleRepository IdentityRoleRepository; 13 | 14 | public ABPRaffleAppDatabaseCheck(IIdentityRoleRepository identityRoleRepository) 15 | { 16 | IdentityRoleRepository = identityRoleRepository; 17 | } 18 | 19 | public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) 20 | { 21 | try 22 | { 23 | await IdentityRoleRepository.GetListAsync(sorting: nameof(IdentityRole.Id), maxResultCount: 1, cancellationToken: cancellationToken); 24 | 25 | return HealthCheckResult.Healthy($"Could connect to database and get record."); 26 | } 27 | catch (Exception e) 28 | { 29 | return HealthCheckResult.Unhealthy($"Error when trying to get database record. ", e); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/Configurations/RaffleConfiguration.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | using Volo.Abp.EntityFrameworkCore.Modeling; 5 | using YazilimAcademy.ABPRaffleApp.Domain.Raffles; 6 | using YazilimAcademy.ABPRaffleApp.Raffles; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Configurations; 9 | 10 | public sealed class RaffleConfiguration : IEntityTypeConfiguration 11 | { 12 | public void Configure(EntityTypeBuilder builder) 13 | { 14 | builder.ToTable(ABPRaffleAppConsts.DbTablePrefix + "Raffles", 15 | ABPRaffleAppConsts.DbSchema); 16 | 17 | builder.Property(x => x.Name) 18 | .HasMaxLength(RaffleConsts.MaxNameLength) 19 | .IsRequired(); 20 | 21 | builder.Property(x => x.Description) 22 | .HasMaxLength(RaffleConsts.MaxDescriptionLength) 23 | .IsRequired(); 24 | 25 | builder.Property(x => x.StartDate) 26 | .IsRequired(); 27 | 28 | builder.Property(x => x.EndDate) 29 | .IsRequired(); 30 | 31 | builder.Property(x => x.IsActive) 32 | .IsRequired(); 33 | 34 | builder.ConfigureByConvention(); 35 | 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/Program.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Blazor; 2 | using YazilimAcademy.ABPRaffleApp.Blazor.Client; 3 | using YazilimAcademy.ABPRaffleApp.Blazor.Components; 4 | using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp; 5 | 6 | var builder = WebApplication.CreateBuilder(args); 7 | 8 | //https://github.com/dotnet/aspnetcore/issues/52530 9 | builder.Services.Configure(options => 10 | { 11 | options.SuppressCheckForUnhandledSecurityMetadata = true; 12 | }); 13 | 14 | // Add services to the container. 15 | builder.Services.AddRazorComponents() 16 | .AddInteractiveWebAssemblyComponents(); 17 | 18 | var app = builder.Build(); 19 | 20 | // Configure the HTTP request pipeline. 21 | if (app.Environment.IsDevelopment()) 22 | { 23 | app.UseWebAssemblyDebugging(); 24 | } 25 | else 26 | { 27 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 28 | app.UseHsts(); 29 | } 30 | 31 | app.UseHttpsRedirection(); 32 | 33 | app.MapStaticAssets(); 34 | app.UseAntiforgery(); 35 | 36 | app.MapRazorComponents() 37 | .AddInteractiveWebAssemblyRenderMode() 38 | .AddAdditionalAssemblies(WebAppAdditionalAssembliesHelper.GetAssemblies()); 39 | 40 | await app.RunAsync(); -------------------------------------------------------------------------------- /YazilimAcademy.ABPRaffleApp.abpsln: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c53f59a2-29df-42b1-ace4-9b26bf73fce0", 3 | "template": "app", 4 | "versions": { 5 | "LeptonX": "4.0.3", 6 | "AbpFramework": "9.0.2", 7 | "AbpCommercial": "9.0.2", 8 | "AbpStudio": "0.9.17", 9 | "TargetDotnetFramework": "net9.0" 10 | }, 11 | "modules": { 12 | "YazilimAcademy.ABPRaffleApp": { 13 | "path": "YazilimAcademy.ABPRaffleApp.abpmdl" 14 | } 15 | }, 16 | "runProfiles": { 17 | "Default": { 18 | "path": "etc/abp-studio/run-profiles/Default.abprun.json" 19 | } 20 | }, 21 | "options": { 22 | "httpRequests": { 23 | "ignoredUrls": [ 24 | "^/metrics$" 25 | ] 26 | } 27 | }, 28 | "creatingStudioConfiguration": { 29 | "template": "app", 30 | "createdAbpStudioVersion": "0.9.17", 31 | "tiered": "false", 32 | "multiTenancy": "false", 33 | "includeTests": "true", 34 | "uiFramework": "blazor", 35 | "databaseProvider": "ef", 36 | "databaseManagementSystem": "postgresql", 37 | "separateTenantSchema": "false", 38 | "theme": "leptonx", 39 | "themeStyle": "system", 40 | "mobileFramework": "none", 41 | "progressiveWebApp": "false", 42 | "publicWebsite": "false", 43 | "optionalModules": "GDPR LanguageManagement AuditLogging", 44 | "socialLogin": "" 45 | } 46 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/Pages/Index.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Globalization; 3 | using System.Threading.Tasks; 4 | using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; 5 | using Volo.Abp.Localization; 6 | using Volo.Abp.OpenIddict.Applications; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.Pages; 9 | 10 | public class IndexModel : AbpPageModel 11 | { 12 | public List? Applications { get; protected set; } 13 | 14 | public IReadOnlyList? Languages { get; protected set; } 15 | 16 | public string? CurrentLanguage { get; protected set; } 17 | 18 | protected IOpenIddictApplicationRepository OpenIdApplicationRepository { get; } 19 | 20 | protected ILanguageProvider LanguageProvider { get; } 21 | 22 | public IndexModel(IOpenIddictApplicationRepository openIdApplicationmRepository, ILanguageProvider languageProvider) 23 | { 24 | OpenIdApplicationRepository = openIdApplicationmRepository; 25 | LanguageProvider = languageProvider; 26 | } 27 | 28 | public async Task OnGetAsync() 29 | { 30 | Applications = await OpenIdApplicationRepository.GetListAsync(); 31 | 32 | Languages = await LanguageProvider.GetLanguagesAsync(); 33 | CurrentLanguage = CultureInfo.CurrentCulture.DisplayName; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/ABPRaffleAppApplicationModule.cs: -------------------------------------------------------------------------------- 1 | using Volo.Abp.PermissionManagement; 2 | using Volo.Abp.SettingManagement; 3 | using Volo.Abp.Account; 4 | using Volo.Abp.Identity; 5 | using Volo.Abp.AutoMapper; 6 | using Volo.Abp.FeatureManagement; 7 | using Volo.Abp.Modularity; 8 | using Volo.Abp.AuditLogging; 9 | using Volo.Abp.Gdpr; 10 | using Volo.Abp.LanguageManagement; 11 | 12 | namespace YazilimAcademy.ABPRaffleApp; 13 | 14 | [DependsOn( 15 | typeof(ABPRaffleAppDomainModule), 16 | typeof(ABPRaffleAppApplicationContractsModule), 17 | typeof(AbpPermissionManagementApplicationModule), 18 | typeof(AbpFeatureManagementApplicationModule), 19 | typeof(AbpIdentityApplicationModule), 20 | typeof(AbpAccountPublicApplicationModule), 21 | typeof(AbpAccountAdminApplicationModule), 22 | typeof(AbpAuditLoggingApplicationModule), 23 | typeof(LanguageManagementApplicationModule), 24 | typeof(AbpGdprApplicationModule), 25 | typeof(AbpSettingManagementApplicationModule) 26 | )] 27 | public class ABPRaffleAppApplicationModule : AbpModule 28 | { 29 | public override void ConfigureServices(ServiceConfigurationContext context) 30 | { 31 | Configure(options => 32 | { 33 | options.AddMaps(); 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/images/getting-started/discord.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/YazilimAcademy.ABPRaffleApp.HttpApi.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/main.css: -------------------------------------------------------------------------------- 1 | /* Global styles for the ABPRaffleApp application */ 2 | 3 | 4 | :root .lpx-theme-dim, :root .lpx-theme-dark { 5 | --lpx-logo: url('/images/logo/leptonx/icon.svg'); 6 | --lpx-logo-icon: url('/images/logo/leptonx/icon.svg'); 7 | } 8 | 9 | :root .lpx-theme-light { 10 | --lpx-logo: url('/images/logo/leptonx/icon.svg'); 11 | --lpx-logo-icon: url('/images/logo/leptonx/icon.svg'); 12 | } 13 | 14 | /* 15 | loader 16 | */ 17 | .loader { 18 | position: fixed; 19 | top: 0; 20 | right: 0; 21 | left: 0; 22 | bottom: 0; 23 | width: 100vw; 24 | height: 100vh; 25 | z-index: 999; 26 | background-color: #f1f1f2; 27 | } 28 | 29 | #ApplicationContainer > div:first-child:not(:only-child) { 30 | display: none !important; 31 | } 32 | 33 | #blazor-error-ui { 34 | background: lightyellow; 35 | bottom: 0; 36 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 37 | display: none; 38 | left: 0; 39 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 40 | position: fixed; 41 | width: 100%; 42 | z-index: 1000; 43 | } 44 | 45 | #blazor-error-ui .dismiss { 46 | cursor: pointer; 47 | position: absolute; 48 | right: 0.75rem; 49 | top: 0.5rem; 50 | } 51 | 52 | /* 53 | blazorise picker workaround for https://github.com/Megabit/Blazorise/issues/4917 54 | */ 55 | .flatpickr-calendar.static { 56 | top: unset !important; 57 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Shouldly; 4 | using Volo.Abp.Domain.Repositories; 5 | using Volo.Abp.Identity; 6 | using Xunit; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Samples; 9 | 10 | /* This is just an example test class. 11 | * Normally, you don't test ABP framework code 12 | * Only test your custom repository methods. 13 | */ 14 | [Collection(ABPRaffleAppTestConsts.CollectionDefinitionName)] 15 | public class SampleRepositoryTests : ABPRaffleAppEntityFrameworkCoreTestBase 16 | { 17 | private readonly IRepository _appUserRepository; 18 | 19 | public SampleRepositoryTests() 20 | { 21 | _appUserRepository = GetRequiredService>(); 22 | } 23 | 24 | [Fact] 25 | public async Task Should_Query_AppUser() 26 | { 27 | /* Need to manually start Unit Of Work because 28 | * FirstOrDefaultAsync should be executed while db connection / context is available. 29 | */ 30 | await WithUnitOfWorkAsync(async () => 31 | { 32 | //Act 33 | var adminUser = await _appUserRepository 34 | .FirstOrDefaultAsync(u => u.UserName == "admin"); 35 | 36 | //Assert 37 | adminUser.ShouldNotBeNull(); 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/Configurations/RaffleResultConfiguration.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | using Volo.Abp.EntityFrameworkCore.Modeling; 5 | using YazilimAcademy.ABPRaffleApp.Domain.Participants; 6 | using YazilimAcademy.ABPRaffleApp.Domain.Raffles; 7 | using YazilimAcademy.ABPRaffleApp.Domain.Results; 8 | 9 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Configurations; 10 | 11 | public sealed class RaffleResultConfiguration : IEntityTypeConfiguration 12 | { 13 | public void Configure(EntityTypeBuilder builder) 14 | { 15 | builder.ToTable(ABPRaffleAppConsts.DbTablePrefix + "RaffleResults", 16 | ABPRaffleAppConsts.DbSchema); 17 | 18 | builder.ConfigureByConvention(); 19 | 20 | builder.Property(x => x.IsWinner) 21 | .IsRequired(); 22 | 23 | builder.Property(x => x.Order) 24 | .IsRequired(); 25 | 26 | builder.HasOne(rr => rr.Raffle) 27 | .WithMany(r => r.RaffleResults) 28 | .HasForeignKey(rr => rr.RaffleId) 29 | .OnDelete(DeleteBehavior.Cascade); // or Restrict/NoAction as you wish 30 | 31 | builder.HasOne(rr => rr.Participant) 32 | .WithMany(p => p.RaffleResults) // Link to the new navigation property 33 | .HasForeignKey(rr => rr.ParticipantId) 34 | .OnDelete(DeleteBehavior.Cascade); 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net9.0 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | PreserveNewest 13 | Always 14 | 15 | 16 | 17 | PreserveNewest 18 | Always 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/Raffles/Participant.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Volo.Abp.Domain.Entities.Auditing; 3 | using Volo.Abp.Domain.Entities; 4 | using YazilimAcademy.ABPRaffleApp.Domain.Raffles; 5 | using YazilimAcademy.ABPRaffleApp.Domain.Shared; 6 | using System.Text.Json.Serialization; 7 | using YazilimAcademy.ABPRaffleApp.Domain.Results; 8 | using System.Collections.Generic; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp.Domain.Participants 11 | { 12 | public class Participant : FullAuditedEntity, IHasConcurrencyStamp 13 | { 14 | // Foreign Key - Tek bir Raffle’a ait 15 | public Guid RaffleId { get; set; } 16 | [JsonIgnore] 17 | public Raffle Raffle { get; set; } 18 | 19 | // Value Object 20 | public FullName FullName { get; set; } 21 | 22 | // Başka bir iletişim bilgisi eklemek isterseniz: 23 | public Email Email { get; set; } 24 | 25 | // Concurrency 26 | public string ConcurrencyStamp { get; set; } 27 | [JsonIgnore] 28 | public ICollection RaffleResults { get; set; } = new List(); 29 | 30 | protected Participant() 31 | { 32 | // EF Core parametresiz ctor 33 | } 34 | 35 | public Participant(Guid id, Guid raffleId, FullName fullName, string email = null) 36 | : base(id) 37 | { 38 | RaffleId = raffleId; 39 | FullName = fullName; 40 | Email = email; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/YazilimAcademy.ABPRaffleApp.Application.Contracts.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/ABPRaffleAppTestBaseModule.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.DependencyInjection; 2 | using Volo.Abp; 3 | using Volo.Abp.Authorization; 4 | using Volo.Abp.Autofac; 5 | using Volo.Abp.BackgroundJobs; 6 | using Volo.Abp.Data; 7 | using Volo.Abp.Modularity; 8 | using Volo.Abp.Threading; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp; 11 | 12 | [DependsOn( 13 | typeof(AbpAutofacModule), 14 | typeof(AbpTestBaseModule), 15 | typeof(AbpAuthorizationModule), 16 | typeof(AbpBackgroundJobsAbstractionsModule) 17 | )] 18 | public class ABPRaffleAppTestBaseModule : AbpModule 19 | { 20 | public override void ConfigureServices(ServiceConfigurationContext context) 21 | { 22 | Configure(options => 23 | { 24 | options.IsJobExecutionEnabled = false; 25 | }); 26 | 27 | context.Services.AddAlwaysAllowAuthorization(); 28 | } 29 | 30 | public override void OnApplicationInitialization(ApplicationInitializationContext context) 31 | { 32 | SeedTestData(context); 33 | } 34 | 35 | private static void SeedTestData(ApplicationInitializationContext context) 36 | { 37 | AsyncHelper.RunSync(async () => 38 | { 39 | using (var scope = context.ServiceProvider.CreateScope()) 40 | { 41 | await scope.ServiceProvider 42 | .GetRequiredService() 43 | .SeedAsync(); 44 | } 45 | }); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.Extensions.DependencyInjection; 3 | using Microsoft.Extensions.Hosting; 4 | using Microsoft.Extensions.Logging; 5 | using Serilog; 6 | using Serilog.Events; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.DbMigrator; 9 | 10 | class Program 11 | { 12 | static async Task Main(string[] args) 13 | { 14 | Log.Logger = new LoggerConfiguration() 15 | .MinimumLevel.Information() 16 | .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) 17 | .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) 18 | #if DEBUG 19 | .MinimumLevel.Override("YazilimAcademy.ABPRaffleApp", LogEventLevel.Debug) 20 | #else 21 | .MinimumLevel.Override("YazilimAcademy.ABPRaffleApp", LogEventLevel.Information) 22 | #endif 23 | .Enrich.FromLogContext() 24 | .WriteTo.Async(c => c.File("Logs/logs.txt")) 25 | .WriteTo.Async(c => c.Console()) 26 | .CreateLogger(); 27 | 28 | await CreateHostBuilder(args).RunConsoleAsync(); 29 | } 30 | 31 | public static IHostBuilder CreateHostBuilder(string[] args) => 32 | Host.CreateDefaultBuilder(args) 33 | .AddAppSettingsSecretsJson() 34 | .ConfigureLogging((context, logging) => logging.ClearProviders()) 35 | .ConfigureServices((hostContext, services) => 36 | { 37 | services.AddHostedService(); 38 | }); 39 | } 40 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Shared/Email.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Text.RegularExpressions; 3 | 4 | namespace YazilimAcademy.ABPRaffleApp.Domain.Shared; 5 | 6 | public sealed record Email 7 | { 8 | private const string Pattern = @"^(?("")("".+?(? email.Value; // Email to string 38 | 39 | public static implicit operator Email(string value) => new(value); // string to Email 40 | 41 | 42 | // public static Email Create(string value) 43 | // { 44 | // if (!IsValid(value)) 45 | // throw new ArgumentException("Invalid email address"); 46 | 47 | // return new Email(value); 48 | // } 49 | 50 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Volo.Abp.DependencyInjection; 4 | using Volo.Abp.Identity; 5 | using Volo.Abp.Account; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp; 8 | 9 | public class ClientDemoService : ITransientDependency 10 | { 11 | private readonly IProfileAppService _profileAppService; 12 | private readonly IIdentityUserAppService _identityUserAppService; 13 | 14 | public ClientDemoService( 15 | IProfileAppService profileAppService, 16 | IIdentityUserAppService identityUserAppService) 17 | { 18 | _profileAppService = profileAppService; 19 | _identityUserAppService = identityUserAppService; 20 | } 21 | 22 | public async Task RunAsync() 23 | { 24 | var profileDto = await _profileAppService.GetAsync(); 25 | Console.WriteLine($"UserName : {profileDto.UserName}"); 26 | Console.WriteLine($"Email : {profileDto.Email}"); 27 | Console.WriteLine($"Name : {profileDto.Name}"); 28 | Console.WriteLine($"Surname : {profileDto.Surname}"); 29 | Console.WriteLine(); 30 | 31 | var resultDto = await _identityUserAppService.GetListAsync(new GetIdentityUsersInput()); 32 | Console.WriteLine($"Total users: {resultDto.TotalCount}"); 33 | foreach (var identityUserDto in resultDto.Items) 34 | { 35 | Console.WriteLine($"- [{identityUserDto.Id}] {identityUserDto.Name}"); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Permissions/ABPRaffleAppPermissions.cs: -------------------------------------------------------------------------------- 1 | namespace YazilimAcademy.ABPRaffleApp.Permissions; 2 | 3 | public static class ABPRaffleAppPermissions 4 | { 5 | public const string GroupName = "ABPRaffleApp"; 6 | 7 | public static class Dashboard 8 | { 9 | public const string DashboardGroup = GroupName + ".Dashboard"; 10 | public const string Host = DashboardGroup + ".Host"; 11 | public const string Tenant = DashboardGroup + ".Tenant"; 12 | } 13 | 14 | public static class Books 15 | { 16 | public const string Default = GroupName + ".Books"; 17 | public const string Create = Default + ".Create"; 18 | public const string Edit = Default + ".Edit"; 19 | public const string Delete = Default + ".Delete"; 20 | } 21 | 22 | public static class Raffles 23 | { 24 | public const string Default = GroupName + ".Raffles"; 25 | public const string Create = Default + ".Create"; 26 | public const string Edit = Default + ".Edit"; 27 | public const string Delete = Default + ".Delete"; 28 | } 29 | 30 | public static class Participants 31 | { 32 | public const string Default = GroupName + ".Participants"; 33 | public const string Create = Default + ".Create"; 34 | public const string Edit = Default + ".Edit"; 35 | public const string Delete = Default + ".Delete"; 36 | } 37 | 38 | //Add your own permission names. Example: 39 | //public const string MyPermission1 = GroupName + ".MyPermission1"; 40 | } 41 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/ABPRaffleAppDbContextFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using Microsoft.EntityFrameworkCore; 4 | using Microsoft.EntityFrameworkCore.Design; 5 | using Microsoft.Extensions.Configuration; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 8 | 9 | /* This class is needed for EF Core console commands 10 | * (like Add-Migration and Update-Database commands) */ 11 | public class ABPRaffleAppDbContextFactory : IDesignTimeDbContextFactory 12 | { 13 | public ABPRaffleAppDbContext CreateDbContext(string[] args) 14 | { 15 | // https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic 16 | AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); 17 | 18 | var configuration = BuildConfiguration(); 19 | 20 | ABPRaffleAppEfCoreEntityExtensionMappings.Configure(); 21 | 22 | var builder = new DbContextOptionsBuilder() 23 | .UseNpgsql(configuration.GetConnectionString("Default")); 24 | 25 | return new ABPRaffleAppDbContext(builder.Options); 26 | } 27 | 28 | private static IConfigurationRoot BuildConfiguration() 29 | { 30 | var builder = new ConfigurationBuilder() 31 | .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../YazilimAcademy.ABPRaffleApp.DbMigrator/")) 32 | .AddJsonFile("appsettings.json", optional: false); 33 | 34 | return builder.Build(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/appsettings.secrets.json: -------------------------------------------------------------------------------- 1 | { 2 | "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgAzAGEAMQA2ADgANABiADgALQBhAGEAZAA1AC0ANwBmAGUANAAtADUAZQA3ADAALQBkADEAZAAzAGIAOQAxAGUAMQAwAGMANgA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4AMwBhADEANgA4ADQAYgA4AC0AYQBhAGQANQAtADcAZgBlADQALQA1AGUANwAwAC0AZAAxAGQAMwBiADkAMQBlADEAMABjADYAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBZAGEAegBpAGwAaQBtACAAQQBjAGEAZABlAG0AeQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAEMAcgBlAGEAdABpAG8AbgBUAGkAbQBlACIAPgAyADAAMgA0AC0AMQAyAC0AMgAxACAAMAA5ADoANQA4ADoAMAAwADwALwBBAHQAdAByAGkAYgB1AHQAZQA+AAoAIAAgADwALwBMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAA8AFMAaQBnAG4AYQB0AHUAcgBlAD4ATQBFAFkAQwBJAFEAQwBJAHAAYwBVAE4AVABUAHEAeAAyAHEATABTAG0ATQBRAEUAcABzAGkAeABJADgANwBFAHoATQBLADcASABUADIAQgB4AEsAcABSAGwAagBRADQASQBBAEkAaABBAEsAdwBVAGcAOABHAEsAUgBHAHkANQBqAE4AawAxAHEAVQAyAC8ANAB5AHEAMwBlAEcASQBaAG4AMQBkAG8AaABFAEkATQBEADgAVQB5AHgAOQAxAFEAPAAvAFMAaQBnAG4AYQB0AHUAcgBlAD4ACgA8AC8ATABpAGMAZQBuAHMAZQA+AE0ARgBrAHcARQB3AFkASABLAG8AWgBJAHoAagAwAEMAQQBRAFkASQBLAG8AWgBJAHoAagAwAEQAQQBRAGMARABRAGcAQQBFAHkAWgBpAEcAcgA0AG0ASQBkAEEARgBBAFEAWgBBAEgARQBPADMARwBYAHUALwBRAGkAOABOADIAcQBwADAAcgAwAGEAUwBTAHoAVwB2ADgAaQB6AEkANAA0AEUAZgA5ADEAUQBtAFMAVQA0ADEAYgBVAFkASwB6ADgAbgB4AHoANABaAEwAYQBPAFUAUwAvADcAcQBtAC8AcgBJAHMAMwBYAHQAKwAyAHQAZwA9AD0AXwAxADIANAA=" 3 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/appsettings.secrets.json: -------------------------------------------------------------------------------- 1 | { 2 | "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgAzAGEAMQA2ADgANABiADgALQBhAGEAZAA1AC0ANwBmAGUANAAtADUAZQA3ADAALQBkADEAZAAzAGIAOQAxAGUAMQAwAGMANgA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4AMwBhADEANgA4ADQAYgA4AC0AYQBhAGQANQAtADcAZgBlADQALQA1AGUANwAwAC0AZAAxAGQAMwBiADkAMQBlADEAMABjADYAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBZAGEAegBpAGwAaQBtACAAQQBjAGEAZABlAG0AeQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAEMAcgBlAGEAdABpAG8AbgBUAGkAbQBlACIAPgAyADAAMgA0AC0AMQAyAC0AMgAxACAAMAA5ADoANQA4ADoAMAAwADwALwBBAHQAdAByAGkAYgB1AHQAZQA+AAoAIAAgADwALwBMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAA8AFMAaQBnAG4AYQB0AHUAcgBlAD4ATQBFAFkAQwBJAFEAQwBJAHAAYwBVAE4AVABUAHEAeAAyAHEATABTAG0ATQBRAEUAcABzAGkAeABJADgANwBFAHoATQBLADcASABUADIAQgB4AEsAcABSAGwAagBRADQASQBBAEkAaABBAEsAdwBVAGcAOABHAEsAUgBHAHkANQBqAE4AawAxAHEAVQAyAC8ANAB5AHEAMwBlAEcASQBaAG4AMQBkAG8AaABFAEkATQBEADgAVQB5AHgAOQAxAFEAPAAvAFMAaQBnAG4AYQB0AHUAcgBlAD4ACgA8AC8ATABpAGMAZQBuAHMAZQA+AE0ARgBrAHcARQB3AFkASABLAG8AWgBJAHoAagAwAEMAQQBRAFkASQBLAG8AWgBJAHoAagAwAEQAQQBRAGMARABRAGcAQQBFAHkAWgBpAEcAcgA0AG0ASQBkAEEARgBBAFEAWgBBAEgARQBPADMARwBYAHUALwBRAGkAOABOADIAcQBwADAAcgAwAGEAUwBTAHoAVwB2ADgAaQB6AEkANAA0AEUAZgA5ADEAUQBtAFMAVQA0ADEAYgBVAFkASwB6ADgAbgB4AHoANABaAEwAYQBPAFUAUwAvADcAcQBtAC8AcgBJAHMAMwBYAHQAKwAyAHQAZwA9AD0AXwAxADIANAA=" 3 | } 4 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/appsettings.secrets.json: -------------------------------------------------------------------------------- 1 | { 2 | "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgAzAGEAMQA2ADgANABiADgALQBhAGEAZAA1AC0ANwBmAGUANAAtADUAZQA3ADAALQBkADEAZAAzAGIAOQAxAGUAMQAwAGMANgA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4AMwBhADEANgA4ADQAYgA4AC0AYQBhAGQANQAtADcAZgBlADQALQA1AGUANwAwAC0AZAAxAGQAMwBiADkAMQBlADEAMABjADYAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBZAGEAegBpAGwAaQBtACAAQQBjAGEAZABlAG0AeQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAEMAcgBlAGEAdABpAG8AbgBUAGkAbQBlACIAPgAyADAAMgA0AC0AMQAyAC0AMgAxACAAMAA5ADoANQA4ADoAMAAwADwALwBBAHQAdAByAGkAYgB1AHQAZQA+AAoAIAAgADwALwBMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAA8AFMAaQBnAG4AYQB0AHUAcgBlAD4ATQBFAFkAQwBJAFEAQwBJAHAAYwBVAE4AVABUAHEAeAAyAHEATABTAG0ATQBRAEUAcABzAGkAeABJADgANwBFAHoATQBLADcASABUADIAQgB4AEsAcABSAGwAagBRADQASQBBAEkAaABBAEsAdwBVAGcAOABHAEsAUgBHAHkANQBqAE4AawAxAHEAVQAyAC8ANAB5AHEAMwBlAEcASQBaAG4AMQBkAG8AaABFAEkATQBEADgAVQB5AHgAOQAxAFEAPAAvAFMAaQBnAG4AYQB0AHUAcgBlAD4ACgA8AC8ATABpAGMAZQBuAHMAZQA+AE0ARgBrAHcARQB3AFkASABLAG8AWgBJAHoAagAwAEMAQQBRAFkASQBLAG8AWgBJAHoAagAwAEQAQQBRAGMARABRAGcAQQBFAHkAWgBpAEcAcgA0AG0ASQBkAEEARgBBAFEAWgBBAEgARQBPADMARwBYAHUALwBRAGkAOABOADIAcQBwADAAcgAwAGEAUwBTAHoAVwB2ADgAaQB6AEkANAA0AEUAZgA5ADEAUQBtAFMAVQA0ADEAYgBVAFkASwB6ADgAbgB4AHoANABaAEwAYQBPAFUAUwAvADcAcQBtAC8AcgBJAHMAMwBYAHQAKwAyAHQAZwA9AD0AXwAxADIANAA=" 3 | } 4 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/ABPRaffleAppHttpApiModule.cs: -------------------------------------------------------------------------------- 1 | using Localization.Resources.AbpUi; 2 | using YazilimAcademy.ABPRaffleApp.Localization; 3 | using Volo.Abp.Account; 4 | using Volo.Abp.SettingManagement; 5 | using Volo.Abp.FeatureManagement; 6 | using Volo.Abp.Identity; 7 | using Volo.Abp.Modularity; 8 | using Volo.Abp.PermissionManagement.HttpApi; 9 | using Volo.Abp.Localization; 10 | using Volo.Abp.AuditLogging; 11 | using Volo.Abp.LanguageManagement; 12 | using Volo.Abp.Gdpr; 13 | 14 | namespace YazilimAcademy.ABPRaffleApp; 15 | 16 | [DependsOn( 17 | typeof(ABPRaffleAppApplicationContractsModule), 18 | typeof(AbpPermissionManagementHttpApiModule), 19 | typeof(AbpSettingManagementHttpApiModule), 20 | typeof(AbpIdentityHttpApiModule), 21 | typeof(AbpAccountAdminHttpApiModule), 22 | typeof(AbpAuditLoggingHttpApiModule), 23 | typeof(LanguageManagementHttpApiModule), 24 | typeof(AbpGdprHttpApiModule), 25 | typeof(AbpAccountPublicHttpApiModule), 26 | typeof(AbpFeatureManagementHttpApiModule) 27 | )] 28 | public class ABPRaffleAppHttpApiModule : AbpModule 29 | { 30 | public override void ConfigureServices(ServiceConfigurationContext context) 31 | { 32 | ConfigureLocalization(); 33 | } 34 | 35 | private void ConfigureLocalization() 36 | { 37 | Configure(options => 38 | { 39 | options.Resources 40 | .Get() 41 | .AddBaseTypes( 42 | typeof(AbpUiResource) 43 | ); 44 | }); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/zh-Hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "zh-Hans", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "首页", 6 | "Menu:ContactUs": "联系我们", 7 | "Menu:ArticleSample": "文章示例", 8 | "Home": "首页", 9 | "Welcome": "欢迎", 10 | "LongWelcomeMessage": "欢迎使用本应用程序。这是一个基于 ABP 框架的启动项目。欲了解更多信息,请访问", 11 | "Date": "日期", 12 | "Permission:Dashboard": "仪表板", 13 | "Menu:Dashboard": "仪表板", 14 | "Menu:HomePage": "主页", 15 | "Dashboard": "仪表板", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Client Id", 18 | "ExternalProvider:Google:ClientSecret": "Client Secret", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Client Id", 21 | "ExternalProvider:Microsoft:ClientSecret": "Client Secret", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", 25 | "NewsletterHeader": "订阅时事通讯!", 26 | "NewsletterInfo": "了解最新动态。", 27 | "NewsletterPreference_Default": "默认通讯", 28 | "NewsletterPrivacyAcceptMessage": "我接受隐私政策。", 29 | "Language": "语言", 30 | "Search": "搜索", 31 | "LoadMore": "加载更多", 32 | "Settings": "设置", 33 | "Theme": "主题", 34 | "DeviceTheme": "设备主题", 35 | "Dark": "Dark", 36 | "Light": "Light", 37 | "Unspecified": "System", 38 | "SeeAllUsers": "查看所有用户", 39 | "TakePhoto": "拍摄照片", 40 | "ChoosePhoto": "选择照片" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/appsettings.secrets.json: -------------------------------------------------------------------------------- 1 | { 2 | "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgAzAGEAMQA2ADgANABiADgALQBhAGEAZAA1AC0ANwBmAGUANAAtADUAZQA3ADAALQBkADEAZAAzAGIAOQAxAGUAMQAwAGMANgA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4AMwBhADEANgA4ADQAYgA4AC0AYQBhAGQANQAtADcAZgBlADQALQA1AGUANwAwAC0AZAAxAGQAMwBiADkAMQBlADEAMABjADYAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBZAGEAegBpAGwAaQBtACAAQQBjAGEAZABlAG0AeQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAEMAcgBlAGEAdABpAG8AbgBUAGkAbQBlACIAPgAyADAAMgA0AC0AMQAyAC0AMgAxACAAMAA5ADoANQA4ADoAMAAwADwALwBBAHQAdAByAGkAYgB1AHQAZQA+AAoAIAAgADwALwBMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAA8AFMAaQBnAG4AYQB0AHUAcgBlAD4ATQBFAFkAQwBJAFEAQwBJAHAAYwBVAE4AVABUAHEAeAAyAHEATABTAG0ATQBRAEUAcABzAGkAeABJADgANwBFAHoATQBLADcASABUADIAQgB4AEsAcABSAGwAagBRADQASQBBAEkAaABBAEsAdwBVAGcAOABHAEsAUgBHAHkANQBqAE4AawAxAHEAVQAyAC8ANAB5AHEAMwBlAEcASQBaAG4AMQBkAG8AaABFAEkATQBEADgAVQB5AHgAOQAxAFEAPAAvAFMAaQBnAG4AYQB0AHUAcgBlAD4ACgA8AC8ATABpAGMAZQBuAHMAZQA+AE0ARgBrAHcARQB3AFkASABLAG8AWgBJAHoAagAwAEMAQQBRAFkASQBLAG8AWgBJAHoAagAwAEQAQQBRAGMARABRAGcAQQBFAHkAWgBpAEcAcgA0AG0ASQBkAEEARgBBAFEAWgBBAEgARQBPADMARwBYAHUALwBRAGkAOABOADIAcQBwADAAcgAwAGEAUwBTAHoAVwB2ADgAaQB6AEkANAA0AEUAZgA5ADEAUQBtAFMAVQA0ADEAYgBVAFkASwB6ADgAbgB4AHoANABaAEwAYQBPAFUAUwAvADcAcQBtAC8AcgBJAHMAMwBYAHQAKwAyAHQAZwA9AD0AXwAxADIANAA=" 3 | } 4 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/BookStoreDataSeederContributor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using YazilimAcademy.ABPRaffleApp.Books; 4 | using Volo.Abp.Data; 5 | using Volo.Abp.DependencyInjection; 6 | using Volo.Abp.Domain.Repositories; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp; 9 | 10 | public class ABPRaffleAppDataSeederContributor 11 | : IDataSeedContributor, ITransientDependency 12 | { 13 | private readonly IRepository _bookRepository; 14 | 15 | public ABPRaffleAppDataSeederContributor(IRepository bookRepository) 16 | { 17 | _bookRepository = bookRepository; 18 | } 19 | 20 | public async Task SeedAsync(DataSeedContext context) 21 | { 22 | if (await _bookRepository.GetCountAsync() <= 0) 23 | { 24 | await _bookRepository.InsertAsync( 25 | new Book 26 | { 27 | Name = "1984", 28 | Type = BookType.Dystopia, 29 | PublishDate = new DateTime(1949, 6, 8), 30 | Price = 19.84f 31 | }, 32 | autoSave: true 33 | ); 34 | 35 | await _bookRepository.InsertAsync( 36 | new Book 37 | { 38 | Name = "The Hitchhiker's Guide to the Galaxy", 39 | Type = BookType.ScienceFiction, 40 | PublishDate = new DateTime(1995, 9, 27), 41 | Price = 42.0f 42 | }, 43 | autoSave: true 44 | ); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json: -------------------------------------------------------------------------------- 1 | { 2 | "AbpLicenseCode": "PABMAGkAYwBlAG4AcwBlAD4ACgAgACAAPABJAGQAPgAzAGEAMQA2ADgANABiADgALQBhAGEAZAA1AC0ANwBmAGUANAAtADUAZQA3ADAALQBkADEAZAAzAGIAOQAxAGUAMQAwAGMANgA8AC8ASQBkAD4ACgAgACAAPABMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAE8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAEkAZAAiAD4AMwBhADEANgA4ADQAYgA4AC0AYQBhAGQANQAtADcAZgBlADQALQA1AGUANwAwAC0AZAAxAGQAMwBiADkAMQBlADEAMABjADYAPAAvAEEAdAB0AHIAaQBiAHUAdABlAD4ACgAgACAAIAAgADwAQQB0AHQAcgBpAGIAdQB0AGUAIABuAGEAbQBlAD0AIgBPAHIAZwBhAG4AaQB6AGEAdABpAG8AbgBOAGEAbQBlACIAPgBZAGEAegBpAGwAaQBtACAAQQBjAGEAZABlAG0AeQA8AC8AQQB0AHQAcgBpAGIAdQB0AGUAPgAKACAAIAAgACAAPABBAHQAdAByAGkAYgB1AHQAZQAgAG4AYQBtAGUAPQAiAEMAcgBlAGEAdABpAG8AbgBUAGkAbQBlACIAPgAyADAAMgA0AC0AMQAyAC0AMgAxACAAMAA5ADoANQA4ADoAMAAwADwALwBBAHQAdAByAGkAYgB1AHQAZQA+AAoAIAAgADwALwBMAGkAYwBlAG4AcwBlAEEAdAB0AHIAaQBiAHUAdABlAHMAPgAKACAAIAA8AFMAaQBnAG4AYQB0AHUAcgBlAD4ATQBFAFkAQwBJAFEAQwBJAHAAYwBVAE4AVABUAHEAeAAyAHEATABTAG0ATQBRAEUAcABzAGkAeABJADgANwBFAHoATQBLADcASABUADIAQgB4AEsAcABSAGwAagBRADQASQBBAEkAaABBAEsAdwBVAGcAOABHAEsAUgBHAHkANQBqAE4AawAxAHEAVQAyAC8ANAB5AHEAMwBlAEcASQBaAG4AMQBkAG8AaABFAEkATQBEADgAVQB5AHgAOQAxAFEAPAAvAFMAaQBnAG4AYQB0AHUAcgBlAD4ACgA8AC8ATABpAGMAZQBuAHMAZQA+AE0ARgBrAHcARQB3AFkASABLAG8AWgBJAHoAagAwAEMAQQBRAFkASQBLAG8AWgBJAHoAagAwAEQAQQBRAGMARABRAGcAQQBFAHkAWgBpAEcAcgA0AG0ASQBkAEEARgBBAFEAWgBBAEgARQBPADMARwBYAHUALwBRAGkAOABOADIAcQBwADAAcgAwAGEAUwBTAHoAVwB2ADgAaQB6AEkANAA0AEUAZgA5ADEAUQBtAFMAVQA0ADEAYgBVAFkASwB6ADgAbgB4AHoANABaAEwAYQBPAFUAUwAvADcAcQBtAC8AcgBJAHMAMwBYAHQAKwAyAHQAZwA9AD0AXwAxADIANAA=" 3 | } 4 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Client/ABPRaffleAppHttpApiClientModule.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.DependencyInjection; 2 | using Volo.Abp.Account; 3 | using Volo.Abp.Modularity; 4 | using Volo.Abp.PermissionManagement; 5 | using Volo.Abp.SettingManagement; 6 | using Volo.Abp.VirtualFileSystem; 7 | using Volo.Abp.FeatureManagement; 8 | using Volo.Abp.Identity; 9 | using Volo.Abp.AuditLogging; 10 | using Volo.Abp.LanguageManagement; 11 | using Volo.Abp.Gdpr; 12 | 13 | namespace YazilimAcademy.ABPRaffleApp; 14 | 15 | [DependsOn( 16 | typeof(ABPRaffleAppApplicationContractsModule), 17 | typeof(AbpPermissionManagementHttpApiClientModule), 18 | typeof(AbpFeatureManagementHttpApiClientModule), 19 | typeof(AbpIdentityHttpApiClientModule), 20 | typeof(AbpAccountAdminHttpApiClientModule), 21 | typeof(AbpAccountPublicHttpApiClientModule), 22 | typeof(AbpAuditLoggingHttpApiClientModule), 23 | typeof(LanguageManagementHttpApiClientModule), 24 | typeof(AbpGdprHttpApiClientModule), 25 | typeof(AbpSettingManagementHttpApiClientModule) 26 | )] 27 | public class ABPRaffleAppHttpApiClientModule : AbpModule 28 | { 29 | public const string RemoteServiceName = "Default"; 30 | 31 | public override void ConfigureServices(ServiceConfigurationContext context) 32 | { 33 | context.Services.AddHttpClientProxies( 34 | typeof(ABPRaffleAppApplicationContractsModule).Assembly, 35 | RemoteServiceName 36 | ); 37 | 38 | Configure(options => 39 | { 40 | options.FileSets.AddEmbedded(); 41 | }); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Client/YazilimAcademy.ABPRaffleApp.HttpApi.Client.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application/YazilimAcademy.ABPRaffleApp.Application.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "Culture": "sv", 3 | "Texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:ContactUs": "Kontakta oss", 6 | "Menu:ArticleSample": "Artikelexempel", 7 | "Home": "Hem", 8 | "Date": "Datum", 9 | "Permission:Dashboard": "Dashboard", 10 | "Menu:Dashboard": "Dashboard", 11 | "Menu:HomePage": "Hemsida", 12 | "Dashboard": "Dashboard", 13 | "ExternalProvider:Google": "Google", 14 | "ExternalProvider:Google:ClientId": "Klient-ID", 15 | "ExternalProvider:Google:ClientSecret": "Klienthemlighet", 16 | "ExternalProvider:Microsoft": "Microsoft", 17 | "ExternalProvider:Microsoft:ClientId": "Klient-ID", 18 | "ExternalProvider:Microsoft:ClientSecret": "Klienthemlighet", 19 | "ExternalProvider:Twitter": "Twitter (X)", 20 | "ExternalProvider:Twitter:ConsumerKey": "Konsumentnyckel", 21 | "ExternalProvider:Twitter:ConsumerSecret": "Konsumenthemlighet", 22 | "NewsletterHeader": "Prenumerera på nyhetsbrevet!", 23 | "NewsletterInfo": "Få information om de senaste händelserna.", 24 | "NewsletterPreference_Default": "Standardnyhetsbrev", 25 | "NewsletterPrivacyAcceptMessage": "Jag accepterar Sekretesspolicy.", 26 | "Language": "Språk", 27 | "Search": "Söka", 28 | "LoadMore": "Ladda mer", 29 | "Settings": "Inställningar", 30 | "Theme": "Tema", 31 | "DeviceTheme": "Enhetstema", 32 | "Dark": "Mörk", 33 | "Light": "Ljus", 34 | "Unspecified": "System", 35 | "SeeAllUsers": "Se Alla användare", 36 | "TakePhoto": "Ta foto", 37 | "ChoosePhoto": "Välj Foto", 38 | "Menu:Home": "Hem", 39 | "LongWelcomeMessage": "Välkommen till ansökan. ", 40 | "Welcome": "Välkomna" 41 | } 42 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/clients/blazor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Domain.Tests/Samples/SampleDomainTests.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Shouldly; 3 | using Volo.Abp.Identity; 4 | using Volo.Abp.Modularity; 5 | using Xunit; 6 | 7 | namespace YazilimAcademy.ABPRaffleApp.Samples; 8 | 9 | /* This is just an example test class. 10 | * Normally, you don't test code of the modules you are using 11 | * (like IdentityUserManager here). 12 | * Only test your own domain services. 13 | */ 14 | public abstract class SampleDomainTests : ABPRaffleAppDomainTestBase 15 | where TStartupModule : IAbpModule 16 | { 17 | private readonly IIdentityUserRepository _identityUserRepository; 18 | private readonly IdentityUserManager _identityUserManager; 19 | 20 | protected SampleDomainTests() 21 | { 22 | _identityUserRepository = GetRequiredService(); 23 | _identityUserManager = GetRequiredService(); 24 | } 25 | 26 | [Fact] 27 | public async Task Should_Set_Email_Of_A_User() 28 | { 29 | IdentityUser adminUser; 30 | 31 | /* Need to manually start Unit Of Work because 32 | * FirstOrDefaultAsync should be executed while db connection / context is available. 33 | */ 34 | await WithUnitOfWorkAsync(async () => 35 | { 36 | adminUser = await _identityUserRepository 37 | .FindByNormalizedUserNameAsync("ADMIN"); 38 | 39 | await _identityUserManager.SetEmailAsync(adminUser, "newemail@abp.io"); 40 | await _identityUserRepository.UpdateAsync(adminUser); 41 | }); 42 | 43 | adminUser = await _identityUserRepository.FindByNormalizedUserNameAsync("ADMIN"); 44 | adminUser.Email.ShouldBe("newemail@abp.io"); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain/YazilimAcademy.ABPRaffleApp.Domain.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/Controllers/Books/BookController.cs: -------------------------------------------------------------------------------- 1 | using Asp.Versioning; 2 | using System; 3 | using System.Threading.Tasks; 4 | using YazilimAcademy.ABPRaffleApp.Books; 5 | using Microsoft.AspNetCore.Mvc; 6 | using Volo.Abp; 7 | using Volo.Abp.AspNetCore.Mvc; 8 | using Volo.Abp.Application.Dtos; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp.Controllers.Books 11 | { 12 | [RemoteService] 13 | [Area("app")] 14 | [ControllerName("Book")] 15 | [Route("api/app/books")] 16 | 17 | public class BookController : AbpController 18 | { 19 | protected IBookAppService _booksAppService; 20 | 21 | public BookController(IBookAppService booksAppService) 22 | { 23 | _booksAppService = booksAppService; 24 | } 25 | 26 | [HttpGet] 27 | public virtual Task> GetListAsync(PagedAndSortedResultRequestDto input) 28 | { 29 | return _booksAppService.GetListAsync(input); 30 | } 31 | 32 | [HttpGet] 33 | [Route("{id}")] 34 | public virtual Task GetAsync(Guid id) 35 | { 36 | return _booksAppService.GetAsync(id); 37 | } 38 | 39 | [HttpPost] 40 | public virtual Task CreateAsync(CreateUpdateBookDto input) 41 | { 42 | return _booksAppService.CreateAsync(input); 43 | } 44 | 45 | [HttpPut] 46 | [Route("{id}")] 47 | public virtual Task UpdateAsync(Guid id, CreateUpdateBookDto input) 48 | { 49 | return _booksAppService.UpdateAsync(id, input); 50 | } 51 | 52 | [HttpDelete] 53 | [Route("{id}")] 54 | public virtual Task DeleteAsync(Guid id) 55 | { 56 | return _booksAppService.DeleteAsync(id); 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "ar", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "منزل، بيت", 6 | "Menu:ContactUs": "اتصل بنا", 7 | "Menu:ArticleSample": "عينة المادة", 8 | "Home": "منزل، بيت", 9 | "Welcome": "مرحبا", 10 | "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء التشغيل يعتمد على إطار عمل برنامج ABP. لمزيد من المعلومات قم بزيارة", 11 | "Date": "تاريخ", 12 | "Permission:Dashboard": "لوحة القيادة", 13 | "Menu:Dashboard": "لوحة القيادة", 14 | "Menu:HomePage": "الصفحة الرئيسية", 15 | "Dashboard": "لوحة القيادة", 16 | "ExternalProvider:Google": "جوجل", 17 | "ExternalProvider:Google:ClientId": "معرف العميل", 18 | "ExternalProvider:Google:ClientSecret": "سر العميل", 19 | "ExternalProvider:Microsoft": "مايكروسوفت", 20 | "ExternalProvider:Microsoft:ClientId": "معرف العميل", 21 | "ExternalProvider:Microsoft:ClientSecret": "سر العميل", 22 | "ExternalProvider:Twitter": "تويتر", 23 | "ExternalProvider:Twitter:ConsumerKey": "مفتاح المستهلك", 24 | "ExternalProvider:Twitter:ConsumerSecret": "سر المستهلك", 25 | "NewsletterHeader": "اشترك في النشرة الإخبارية!", 26 | "NewsletterInfo": "احصل على معلومات حول آخر الأحداث.", 27 | "NewsletterPreference_Default": "النشرة الإخبارية الافتراضية", 28 | "NewsletterPrivacyAcceptMessage": "أوافق على سياسة الخصوصية .", 29 | "Language": "لغة", 30 | "Search": "يبحث", 31 | "LoadMore": "تحميل المزيد", 32 | "Settings": "إعدادات", 33 | "Theme": "سمة", 34 | "DeviceTheme": "موضوع الجهاز", 35 | "Dark": "مظلم", 36 | "Light": "ضوء", 37 | "Unspecified": "نظام", 38 | "SeeAllUsers": "رؤية كافة المستخدمين", 39 | "TakePhoto": "تصوير", 40 | "ChoosePhoto": "اختر صورة" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/hi.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "hi", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "घर", 6 | "Menu:ContactUs": "संपर्क करें", 7 | "Menu:ArticleSample": "आलेख नमूना", 8 | "Home": "घर", 9 | "Welcome": "स्वागत हे", 10 | "LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए पर जाएँ।", 11 | "Date": "दिनांक", 12 | "Permission:Dashboard": "डैशबोर्ड", 13 | "Menu:Dashboard": "डैशबोर्ड", 14 | "Menu:HomePage": "मुख पृष्ठ", 15 | "Dashboard": "डैशबोर्ड", 16 | "ExternalProvider:Google": "गूगल", 17 | "ExternalProvider:Google:ClientId": "ग्राहक ID", 18 | "ExternalProvider:Google:ClientSecret": "ग्राहक गुप्त", 19 | "ExternalProvider:Microsoft": "माइक्रोसॉफ्ट", 20 | "ExternalProvider:Microsoft:ClientId": "ग्राहक ID", 21 | "ExternalProvider:Microsoft:ClientSecret": "ग्राहक गुप्त", 22 | "ExternalProvider:Twitter": "ट्विटर", 23 | "ExternalProvider:Twitter:ConsumerKey": "उपभोक्ता कुंजी", 24 | "ExternalProvider:Twitter:ConsumerSecret": "उपभोक्ता रहस्य", 25 | "NewsletterHeader": "न्यूज़लेटर की सदस्यता लें!", 26 | "NewsletterInfo": "नवीनतम घटनाओं के बारे में जानकारी प्राप्त करें।", 27 | "NewsletterPreference_Default": "डिफ़ॉल्ट न्यूज़लैटर", 28 | "NewsletterPrivacyAcceptMessage": "मैं गोपनीयता नीति स्वीकार करता हूं।", 29 | "Language": "भाषा", 30 | "Search": "खोज", 31 | "LoadMore": "और लोड करें", 32 | "Settings": "समायोजन", 33 | "Theme": "विषय", 34 | "DeviceTheme": "डिवाइस थीम", 35 | "Dark": "अँधेरा", 36 | "Light": "रोशनी", 37 | "Unspecified": "प्रणाली", 38 | "SeeAllUsers": "सभी उपयोगकर्ता देखें", 39 | "TakePhoto": "फोटो लो", 40 | "ChoosePhoto": "तस्विर का चयन करो" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/DbMigratorHostedService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | using Microsoft.Extensions.Configuration; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using Microsoft.Extensions.Hosting; 6 | using YazilimAcademy.ABPRaffleApp.Data; 7 | using Serilog; 8 | using Volo.Abp; 9 | using Volo.Abp.Data; 10 | 11 | namespace YazilimAcademy.ABPRaffleApp.DbMigrator; 12 | 13 | public class DbMigratorHostedService : IHostedService 14 | { 15 | private readonly IHostApplicationLifetime _hostApplicationLifetime; 16 | private readonly IConfiguration _configuration; 17 | 18 | public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, IConfiguration configuration) 19 | { 20 | _hostApplicationLifetime = hostApplicationLifetime; 21 | _configuration = configuration; 22 | } 23 | 24 | public async Task StartAsync(CancellationToken cancellationToken) 25 | { 26 | using (var application = await AbpApplicationFactory.CreateAsync(options => 27 | { 28 | options.Services.ReplaceConfiguration(_configuration); 29 | options.UseAutofac(); 30 | options.Services.AddLogging(c => c.AddSerilog()); 31 | options.AddDataMigrationEnvironment(); 32 | })) 33 | { 34 | await application.InitializeAsync(); 35 | 36 | await application 37 | .ServiceProvider 38 | .GetRequiredService() 39 | .MigrateAsync(); 40 | 41 | await application.ShutdownAsync(); 42 | 43 | _hostApplicationLifetime.StopApplication(); 44 | } 45 | } 46 | 47 | public Task StopAsync(CancellationToken cancellationToken) 48 | { 49 | return Task.CompletedTask; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "fi", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Koti", 6 | "Menu:ContactUs": "Ota meihin yhteyttä", 7 | "Menu:ArticleSample": "Artikkelinäyte", 8 | "Home": "Koti", 9 | "Welcome": "Tervetuloa", 10 | "LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa", 11 | "Date": "Päivämäärä", 12 | "Permission:Dashboard": "Kojelauta", 13 | "Menu:Dashboard": "Kojelauta", 14 | "Menu:HomePage": "Kotisivu", 15 | "Dashboard": "Kojelauta", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Asiakastunnus", 18 | "ExternalProvider:Google:ClientSecret": "Asiakkaan salaisuus", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Asiakastunnus", 21 | "ExternalProvider:Microsoft:ClientSecret": "Asiakkaan salaisuus", 22 | "ExternalProvider:Twitter": "Viserrys", 23 | "ExternalProvider:Twitter:ConsumerKey": "Kuluttaja-avain", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Kuluttajan salaisuus", 25 | "NewsletterHeader": "Tilaa uutiskirje!", 26 | "NewsletterInfo": "Hanki tietoa viimeisimmistä tapahtumista.", 27 | "NewsletterPreference_Default": "Oletusuutiskirje", 28 | "NewsletterPrivacyAcceptMessage": "Hyväksyn tietosuojakäytännön .", 29 | "Language": "Kieli", 30 | "Search": "Hae", 31 | "LoadMore": "Lataa lisää", 32 | "Settings": "asetukset", 33 | "Theme": "Teema", 34 | "DeviceTheme": "Laitteen teema", 35 | "Dark": "Tumma", 36 | "Light": "Kevyt", 37 | "Unspecified": "Järjestelmä", 38 | "SeeAllUsers": "Katso Kaikki käyttäjät", 39 | "TakePhoto": "Ota valokuva", 40 | "ChoosePhoto": "Valitse Valokuva" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "tr", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Ana sayfa", 6 | "Menu:ContactUs": "Bize Ulaşın", 7 | "Menu:ArticleSample": "Yazı Örneği", 8 | "Home": "Ana sayfa", 9 | "Welcome": "Hoşgeldiniz", 10 | "LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için ziyaret edebilirsiniz", 11 | "Date": "Tarih", 12 | "Permission:Dashboard": "Genel görünüm", 13 | "Menu:Dashboard": "Genel görünüm", 14 | "Menu:HomePage": "ana sayfa", 15 | "Dashboard": "Genel görünüm", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Client ID", 18 | "ExternalProvider:Google:ClientSecret": "Client Secret", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Client ID", 21 | "ExternalProvider:Microsoft:ClientSecret": "Client Secret", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", 25 | "NewsletterHeader": "Bültene abone olun!", 26 | "NewsletterInfo": "Son gelişmeler hakkında bilgi alın.", 27 | "NewsletterPreference_Default": "Varsayılan Bülten", 28 | "NewsletterPrivacyAcceptMessage": "Gizlilik Politikası'nı kabul ediyorum.", 29 | "Language": "Dil", 30 | "Search": "Ara", 31 | "LoadMore": "Daha fazla yükle", 32 | "Settings": "Ayarlar", 33 | "Theme": "Tema", 34 | "DeviceTheme": "Cihaz Teması", 35 | "Dark": "Koyu", 36 | "Light": "Açık", 37 | "Unspecified": "Sistem", 38 | "SeeAllUsers": "Tüm Kullanıcıları Gör", 39 | "TakePhoto": "Fotoğraf Çek", 40 | "ChoosePhoto": "Fotoğraf Seç" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "it", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Home", 6 | "Menu:ContactUs": "Contattaci", 7 | "Menu:ArticleSample": "Esempio di articolo", 8 | "Home": "Home", 9 | "Welcome": "Benvenuto", 10 | "LongWelcomeMessage": "Benvenuto nell'applicazione. Questo è un progetto di avvio basato sul framework ABP. Per maggiori informazioni visita", 11 | "Date": "Data", 12 | "Permission:Dashboard": "Cruscotto", 13 | "Menu:Dashboard": "Cruscotto", 14 | "Menu:HomePage": "Pagina iniziale", 15 | "Dashboard": "Cruscotto", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Client ID", 18 | "ExternalProvider:Google:ClientSecret": "Client Secret", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Client ID", 21 | "ExternalProvider:Microsoft:ClientSecret": "Client Secret", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", 25 | "NewsletterHeader": "Iscriviti alla newsletter!", 26 | "NewsletterInfo": "Ottieni informazioni sugli ultimi avvenimenti.", 27 | "NewsletterPreference_Default": "Newsletter predefinita", 28 | "NewsletterPrivacyAcceptMessage": "Accetto la Informativa sulla privacy.", 29 | "Language": "Lingua", 30 | "Search": "Ricerca", 31 | "LoadMore": "Carica altro", 32 | "Settings": "Impostazioni", 33 | "Theme": "Tema", 34 | "DeviceTheme": "Tema del dispositivo", 35 | "Dark": "Buio", 36 | "Light": "Leggero", 37 | "Unspecified": "Sistema", 38 | "SeeAllUsers": "Visualizza tutti gli utenti", 39 | "TakePhoto": "Fare foto", 40 | "ChoosePhoto": "Scegli la foto" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "sk", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Domov", 6 | "Menu:ContactUs": "Kontaktujte nás", 7 | "Menu:ArticleSample": "Ukážka článku", 8 | "Home": "Domov", 9 | "Welcome": "Vitajte", 10 | "LongWelcomeMessage": "Vitajte v aplikácii. Toto je štartovací projekt založený na ABP frameworku. Viac informácií nájdete na stránke", 11 | "Date": "Dátum", 12 | "Permission:Dashboard": "Dashboard", 13 | "Menu:Dashboard": "Dashboard", 14 | "Menu:HomePage": "Domovská stránka", 15 | "Dashboard": "Dashboard", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Client ID", 18 | "ExternalProvider:Google:ClientSecret": "Client Secret", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Client ID", 21 | "ExternalProvider:Microsoft:ClientSecret": "Client Secret", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Consumer Key", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", 25 | "NewsletterHeader": "Prihláste sa na odber noviniek!", 26 | "NewsletterInfo": "Získajte informácie o najnovšiom dianí.", 27 | "NewsletterPreference_Default": "Predvolený odber noviniek", 28 | "NewsletterPrivacyAcceptMessage": "Súhlasím so Zásadami ochrany osobných údajov.", 29 | "Language": "Jazyk", 30 | "Search": "Vyhľadávanie", 31 | "LoadMore": "Načítať viac", 32 | "Settings": "nastavenie", 33 | "Theme": "Téma", 34 | "DeviceTheme": "Téma zariadenia", 35 | "Dark": "Tmavý", 36 | "Light": "Svetlo", 37 | "Unspecified": "Systém", 38 | "SeeAllUsers": "Pozrite si Všetci používatelia", 39 | "TakePhoto": "Odfoť", 40 | "ChoosePhoto": "Vyberte fotografiu" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/sl.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "sl", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Domov", 6 | "Menu:ContactUs": "Kontaktiraj nas", 7 | "Menu:ArticleSample": "Vzorec članka", 8 | "Home": "Domov", 9 | "Welcome": "Dobrodošli", 10 | "LongWelcomeMessage": "Dobrodošli v aplikaciji. To je osnovni projekt, ki temelji na razvojnem okolju ABP. Za več informacij obiščite", 11 | "Date": "datum", 12 | "Permission:Dashboard": "Nadzorna plošča", 13 | "Menu:Dashboard": "Nadzorna plošča", 14 | "Menu:HomePage": "Domača stran", 15 | "Dashboard": "Nadzorna plošča", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "ID stranke", 18 | "ExternalProvider:Google:ClientSecret": "Skrivnost stranke", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "ID stranke", 21 | "ExternalProvider:Microsoft:ClientSecret": "Skrivnost stranke", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Potrošniški ključ", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Potrošnikova skrivnost", 25 | "NewsletterHeader": "Naročite se na novice!", 26 | "NewsletterInfo": "Pridobite informacije o najnovejših dogodkih.", 27 | "NewsletterPreference_Default": "Privzeto glasilo", 28 | "NewsletterPrivacyAcceptMessage": "Sprejemam pravilnik o zasebnosti.", 29 | "Language": "Jezik", 30 | "Search": "Iskanje", 31 | "LoadMore": "Naloži več", 32 | "Settings": "nastavitve", 33 | "Theme": "Tema", 34 | "DeviceTheme": "Tema naprave", 35 | "Dark": "Temno", 36 | "Light": "Svetloba", 37 | "Unspecified": "Sistem", 38 | "SeeAllUsers": "Glejte Vsi uporabniki", 39 | "TakePhoto": "Posnemi fotografijo", 40 | "ChoosePhoto": "Izberite fotografijo" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.DbMigrator/YazilimAcademy.ABPRaffleApp.DbMigrator.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Exe 7 | net9.0 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | PreserveNewest 37 | Always 38 | 39 | 40 | 41 | PreserveNewest 42 | Always 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/de-DE.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "de-DE", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Home", 6 | "Menu:ContactUs": "Kontaktiere uns", 7 | "Menu:ArticleSample": "Artikelmuster", 8 | "Home": "Home", 9 | "Welcome": "Willkommen", 10 | "LongWelcomeMessage": "Willkommen in der Anwendung. Dies ist ein Startup-Projekt basierend auf dem ABP-Framework. Weitere Informationen finden Sie unter", 11 | "Date": "Datum", 12 | "Permission:Dashboard": "Dashboard", 13 | "Menu:Dashboard": "Dashboard", 14 | "Menu:HomePage": "Startseite", 15 | "Dashboard": "Dashboard", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Kunden ID", 18 | "ExternalProvider:Google:ClientSecret": "Client-Geheimnis", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Kunden ID", 21 | "ExternalProvider:Microsoft:ClientSecret": "Client-Geheimnis", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Verbraucherschlüssel", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Verbrauchergeheimnis", 25 | "NewsletterHeader": "Abonnieren Sie den Newsletter!", 26 | "NewsletterInfo": "Informieren Sie sich über aktuelle Ereignisse.", 27 | "NewsletterPreference_Default": "Standard-Newsletter", 28 | "NewsletterPrivacyAcceptMessage": "Ich akzeptiere die Datenschutzerklärung.", 29 | "Language": "Sprache", 30 | "Search": "Suchen", 31 | "LoadMore": "Mehr laden", 32 | "Settings": "Einstellungen", 33 | "Theme": "Thema", 34 | "DeviceTheme": "Gerätethema", 35 | "Dark": "Dunkel", 36 | "Light": "Licht", 37 | "Unspecified": "System", 38 | "SeeAllUsers": "Alle Benutzer anzeigen", 39 | "TakePhoto": "Foto machen", 40 | "ChoosePhoto": "Wähle ein Foto aus" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "pt-BR", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Principal", 6 | "Menu:ContactUs": "Entre em contato conosco", 7 | "Menu:ArticleSample": "Amostra de Artigo", 8 | "Home": "Casa", 9 | "Welcome": "Seja bem-vindo!", 10 | "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite", 11 | "Date": "Data", 12 | "Permission:Dashboard": "Painel", 13 | "Menu:Dashboard": "Painel", 14 | "Menu:HomePage": "Pagina inicial", 15 | "Dashboard": "Painel", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "ID do Cliente", 18 | "ExternalProvider:Google:ClientSecret": "Segredo do cliente", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "ID do Cliente", 21 | "ExternalProvider:Microsoft:ClientSecret": "Segredo do cliente", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Chave do consumidor", 24 | "ExternalProvider:Twitter:ConsumerSecret": "consumidor secreto", 25 | "NewsletterHeader": "Assine a newsletter!", 26 | "NewsletterInfo": "Obtenha informações sobre os últimos acontecimentos.", 27 | "NewsletterPreference_Default": "Boletim informativo padrão", 28 | "NewsletterPrivacyAcceptMessage": "Eu aceito a Política de Privacidade .", 29 | "Language": "Linguagem", 30 | "Search": "Procurar", 31 | "LoadMore": "Carregue mais", 32 | "Settings": "Configurações", 33 | "Theme": "Tema", 34 | "DeviceTheme": "Tema do dispositivo", 35 | "Dark": "Escuro", 36 | "Light": "Luz", 37 | "Unspecified": "Sistema", 38 | "SeeAllUsers": "Ver todos os usuários", 39 | "TakePhoto": "Tirar fotos", 40 | "ChoosePhoto": "Escolher Foto" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "es", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Hogar", 6 | "Menu:ContactUs": "Contáctenos", 7 | "Menu:ArticleSample": "Muestra de artículo", 8 | "Home": "Hogar", 9 | "Welcome": "Bienvenido", 10 | "LongWelcomeMessage": "Bienvenido a la aplicacion. Este es un proyecto de inicio basado en el marco ABP. Para obtener mas informacion, visite", 11 | "Date": "Fecha", 12 | "Permission:Dashboard": "Panel de control", 13 | "Menu:Dashboard": "Panel de control", 14 | "Menu:HomePage": "Página de inicio", 15 | "Dashboard": "Panel de control", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "ID de cliente", 18 | "ExternalProvider:Google:ClientSecret": "Client Secret", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "ID de cliente", 21 | "ExternalProvider:Microsoft:ClientSecret": "Client Secret", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Clave de consumidor", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret", 25 | "NewsletterHeader": "Suscríbete a la newsletter!", 26 | "NewsletterInfo": "Obtenga información sobre los últimos acontecimientos.", 27 | "NewsletterPreference_Default": "Boletín de noticias predeterminado", 28 | "NewsletterPrivacyAcceptMessage": "Acepto la Política de privacidad .", 29 | "Language": "Idioma", 30 | "Search": "Buscar", 31 | "LoadMore": "Carga más", 32 | "Settings": "Ajustes", 33 | "Theme": "Tema", 34 | "DeviceTheme": "Tema del dispositivo", 35 | "Dark": "Oscuro", 36 | "Light": "Luz", 37 | "Unspecified": "Sistema", 38 | "SeeAllUsers": "Ver todos los usuarios", 39 | "TakePhoto": "Tomar foto", 40 | "ChoosePhoto": "Escoge una foto" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "hu", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Kezdőlap", 6 | "Menu:ContactUs": "Lépjen kapcsolatba velünk", 7 | "Menu:ArticleSample": "Cikkminta", 8 | "Home": "Kezdőlap", 9 | "Welcome": "Üdvözöljük", 10 | "LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információért látogasson el az oldalra", 11 | "Date": "dátum", 12 | "Permission:Dashboard": "Irányítópult", 13 | "Menu:Dashboard": "Irányítópult", 14 | "Menu:HomePage": "Kezdőlap", 15 | "Dashboard": "Irányítópult", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "Ügyfélazonosító", 18 | "ExternalProvider:Google:ClientSecret": "Ügyfél titkos kulcs", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "Ügyfélazonosító", 21 | "ExternalProvider:Microsoft:ClientSecret": "Ügyfél titkos kulcs", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "Fogyasztói kulcs", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Fogyasztói titkos kulcs", 25 | "NewsletterHeader": "Iratkozz fel a hírlevélre!", 26 | "NewsletterInfo": "Tájékozódjon a legfrissebb eseményekről.", 27 | "NewsletterPreference_Default": "Alapértelmezett hírlevél", 28 | "NewsletterPrivacyAcceptMessage": "Elfogadom az Adatvédelmi szabályzatot .", 29 | "Language": "Nyelv", 30 | "Search": "Keresés", 31 | "LoadMore": "Load More", 32 | "Settings": "Beállítások", 33 | "Theme": "Téma", 34 | "DeviceTheme": "Eszköz téma", 35 | "Dark": "Sötét", 36 | "Light": "Fény", 37 | "Unspecified": "Rendszer", 38 | "SeeAllUsers": "Lásd: Összes felhasználó", 39 | "TakePhoto": "Fotót készíteni", 40 | "ChoosePhoto": "Válassz képet" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/hr.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "hr", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Dom", 6 | "Menu:ContactUs": "Kontaktirajte nas", 7 | "Menu:ArticleSample": "Uzorak članka", 8 | "Home": "Dom", 9 | "Welcome": "Dobrodošli", 10 | "LongWelcomeMessage": "Dobrodošli u aplikaciju. Ovo je startup projekt temeljen na ABP okviru. Za više informacija posjetite", 11 | "Date": "Datum", 12 | "Permission:Dashboard": "Nadzorna ploča", 13 | "Menu:Dashboard": "Nadzorna ploča", 14 | "Menu:HomePage": "Početna stranica", 15 | "Dashboard": "Nadzorna ploča", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "ID klijenta", 18 | "ExternalProvider:Google:ClientSecret": "Tajna klijenta", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "ID klijenta", 21 | "ExternalProvider:Microsoft:ClientSecret": "Tajna klijenta", 22 | "ExternalProvider:Twitter": "Cvrkut", 23 | "ExternalProvider:Twitter:ConsumerKey": "Ključ potrošača", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Potrošačka tajna", 25 | "NewsletterHeader": "Pretplatite se na newsletter!", 26 | "NewsletterInfo": "Dobijte informacije o najnovijim događanjima.", 27 | "NewsletterPreference_Default": "Zadani bilten", 28 | "NewsletterPrivacyAcceptMessage": "Prihvaćam Politiku privatnosti .", 29 | "Language": "Jezik", 30 | "Search": "traži", 31 | "LoadMore": "Učitaj više", 32 | "Settings": "postavke", 33 | "Theme": "Tema", 34 | "DeviceTheme": "Tema uređaja", 35 | "Dark": "tamno", 36 | "Light": "Svjetlo", 37 | "Unspecified": "Sustav", 38 | "SeeAllUsers": "Vidi sve korisnike", 39 | "TakePhoto": "Uslikaj", 40 | "ChoosePhoto": "Odaberite fotografiju" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/YazilimAcademy.ABPRaffleApp.Domain.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | true 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "ru", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Дома", 6 | "Menu:ContactUs": "Связаться с нами", 7 | "Menu:ArticleSample": "Образец статьи", 8 | "Home": "Дома", 9 | "Welcome": "Добро пожаловать", 10 | "LongWelcomeMessage": "Добро пожаловать в приложение. Это стартап-проект, основанный на структуре ABP. Для получения дополнительной информации посетите сайт", 11 | "Date": "датировать", 12 | "Permission:Dashboard": "Панель приборов", 13 | "Menu:Dashboard": "Панель приборов", 14 | "Menu:HomePage": "Домашняя страница", 15 | "Dashboard": "Панель приборов", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "ID клиента", 18 | "ExternalProvider:Google:ClientSecret": "Секрет клиента", 19 | "ExternalProvider:Microsoft": "Майкрософт", 20 | "ExternalProvider:Microsoft:ClientId": "ID клиента", 21 | "ExternalProvider:Microsoft:ClientSecret": "Секрет клиента", 22 | "ExternalProvider:Twitter": "Твиттер", 23 | "ExternalProvider:Twitter:ConsumerKey": "Потребительский ключ", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Потребительский секрет", 25 | "NewsletterHeader": "Подпишитесь на рассылку!", 26 | "NewsletterInfo": "Получайте информацию о последних событиях.", 27 | "NewsletterPreference_Default": "Информационный бюллетень по умолчанию", 28 | "NewsletterPrivacyAcceptMessage": "Я принимаю Политику конфиденциальности.", 29 | "Language": "Язык", 30 | "Search": "Поиск", 31 | "LoadMore": "Загрузи больше", 32 | "Settings": "Настройки", 33 | "Theme": "Тема", 34 | "DeviceTheme": "Тема устройства", 35 | "Dark": "Темный", 36 | "Light": "Свет", 37 | "Unspecified": "Система", 38 | "SeeAllUsers": "Просмотреть всех пользователей", 39 | "TakePhoto": "Сделать фотографию", 40 | "ChoosePhoto": "Выбрать фото" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/ABPRaffleAppEfCoreEntityExtensionMappings.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using Volo.Abp.Identity; 3 | using Volo.Abp.ObjectExtending; 4 | using Volo.Abp.Threading; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 7 | 8 | public static class ABPRaffleAppEfCoreEntityExtensionMappings 9 | { 10 | private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); 11 | 12 | public static void Configure() 13 | { 14 | ABPRaffleAppGlobalFeatureConfigurator.Configure(); 15 | ABPRaffleAppModuleExtensionConfigurator.Configure(); 16 | 17 | OneTimeRunner.Run(() => 18 | { 19 | /* You can configure extra properties for the 20 | * entities defined in the modules used by your application. 21 | * 22 | * This class can be used to map these extra properties to table fields in the database. 23 | * 24 | * USE THIS CLASS ONLY TO CONFIGURE EF CORE RELATED MAPPING. 25 | * USE ABPRaffleAppModuleExtensionConfigurator CLASS (in the Domain.Shared project) 26 | * FOR A HIGH LEVEL API TO DEFINE EXTRA PROPERTIES TO ENTITIES OF THE USED MODULES 27 | * 28 | * Example: Map a property to a table field: 29 | 30 | ObjectExtensionManager.Instance 31 | .MapEfCoreProperty( 32 | "MyProperty", 33 | (entityBuilder, propertyBuilder) => 34 | { 35 | propertyBuilder.HasMaxLength(128); 36 | } 37 | ); 38 | 39 | * See the documentation for more: 40 | * https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities 41 | */ 42 | }); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/Localization/ABPRaffleApp/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "culture": "fr", 3 | "texts": { 4 | "AppName": "ABPRaffleApp", 5 | "Menu:Home": "Acceuil", 6 | "Menu:ContactUs": "Nous contacter", 7 | "Menu:ArticleSample": "Échantillon d'article", 8 | "Home": "Acceuil", 9 | "Welcome": "Bienvenue", 10 | "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez", 11 | "Date": "Date", 12 | "Permission:Dashboard": "Tableau de bord", 13 | "Menu:Dashboard": "Tableau de bord", 14 | "Menu:HomePage": "Page d'accueil", 15 | "Dashboard": "Tableau de bord", 16 | "ExternalProvider:Google": "Google", 17 | "ExternalProvider:Google:ClientId": "identité du client", 18 | "ExternalProvider:Google:ClientSecret": "Secret du client", 19 | "ExternalProvider:Microsoft": "Microsoft", 20 | "ExternalProvider:Microsoft:ClientId": "identité du client", 21 | "ExternalProvider:Microsoft:ClientSecret": "Secret du client", 22 | "ExternalProvider:Twitter": "Twitter", 23 | "ExternalProvider:Twitter:ConsumerKey": "La clé du consommateur", 24 | "ExternalProvider:Twitter:ConsumerSecret": "Secret du consommateur", 25 | "NewsletterHeader": "Abonnez-vous à la newsletter!", 26 | "NewsletterInfo": "Obtenez des informations sur les derniers événements.", 27 | "NewsletterPreference_Default": "Newsletter par défaut", 28 | "NewsletterPrivacyAcceptMessage": "J'accepte la Politique de confidentialité .", 29 | "Language": "Langue", 30 | "Search": "Recherche", 31 | "LoadMore": "Charger plus", 32 | "Settings": "Paramètres", 33 | "Theme": "Thème", 34 | "DeviceTheme": "Thème de l'appareil", 35 | "Dark": "Sombre", 36 | "Light": "Lumière", 37 | "Unspecified": "Système", 38 | "SeeAllUsers": "Voir tous les utilisateurs", 39 | "TakePhoto": "Prendre une photo", 40 | "ChoosePhoto": "Choisissez une photo" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Routes.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.Extensions.Options 2 | @using Microsoft.Extensions.Localization 3 | @using global::Localization.Resources.AbpUi 4 | @using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme 5 | @using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components 6 | @using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout 7 | @using Volo.Abp.AspNetCore.Components.Web.Theming.Routing 8 | @using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp 9 | @inject IOptions RouterOptions 10 | @inject IOptions LayoutOptions 11 | @inject IStringLocalizer UiLocalizer 12 | 13 | 14 | 15 | 16 | 17 | 18 | @if (context.User?.Identity?.IsAuthenticated != true) 19 | { 20 | 21 | } 22 | else 23 | { 24 | 28 | } 29 | 30 | 31 | 32 | 33 | 34 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/YazilimAcademy.ABPRaffleApp.TestBase.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | PreserveNewest 15 | true 16 | PreserveNewest 17 | 18 | 19 | 20 | PreserveNewest 21 | Always 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | all 37 | runtime; build; native; contentfiles; analyzers 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor/Components/App.razor: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ABPRaffleApp 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 |
27 |
28 | Loading... 29 |
30 |
31 | Loading... 32 |
33 |
34 | Loading... 35 |
36 |
37 | 38 | 39 | 40 |
41 | 42 |
43 | An unhandled error has occurred. 44 | Reload 45 | 🗙 46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | YazilimAcademy.ABPRaffleApp 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | runtime; build; native; contentfiles; analyzers 35 | compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/YazilimAcademy.ABPRaffleApp.Blazor.Client.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | net9.0 7 | enable 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi/Controllers/Raffles/RaffleController.cs: -------------------------------------------------------------------------------- 1 | using Asp.Versioning; 2 | using System; 3 | using System.Threading.Tasks; 4 | using YazilimAcademy.ABPRaffleApp.Raffles; 5 | using Microsoft.AspNetCore.Mvc; 6 | using Volo.Abp; 7 | using Volo.Abp.AspNetCore.Mvc; 8 | using Volo.Abp.Application.Dtos; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp.Controllers.Raffles 11 | { 12 | [RemoteService] 13 | [Area("app")] 14 | [ControllerName("Raffle")] 15 | [Route("api/app/raffles")] 16 | public class RaffleController : AbpController 17 | { 18 | protected IRaffleAppService _raffleAppService; 19 | 20 | public RaffleController(IRaffleAppService raffleAppService) 21 | { 22 | _raffleAppService = raffleAppService; 23 | } 24 | 25 | [HttpGet] 26 | public virtual Task> GetListAsync(PagedAndSortedResultRequestDto input) 27 | { 28 | return _raffleAppService.GetListAsync(input); 29 | } 30 | 31 | [HttpGet] 32 | [Route("active")] 33 | public virtual Task> GetActiveRaffleAsync(PagedAndSortedResultRequestDto input) 34 | { 35 | return _raffleAppService.GetActiveRaffleAsync(input); 36 | } 37 | 38 | [HttpGet] 39 | [Route("{id}")] 40 | public virtual Task GetAsync(Guid id) 41 | { 42 | return _raffleAppService.GetAsync(id); 43 | } 44 | 45 | [HttpPost] 46 | public virtual Task CreateAsync(CreateUpdateRaffleDto input) 47 | { 48 | return _raffleAppService.CreateAsync(input); 49 | } 50 | 51 | [HttpPut] 52 | [Route("{id}")] 53 | public virtual Task UpdateAsync(Guid id, CreateUpdateRaffleDto input) 54 | { 55 | return _raffleAppService.UpdateAsync(id, input); 56 | } 57 | 58 | [HttpDelete] 59 | [Route("{id}")] 60 | public virtual Task DeleteAsync(Guid id) 61 | { 62 | return _raffleAppService.DeleteAsync(id); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Pages/HostDashboard.razor: -------------------------------------------------------------------------------- 1 | @page "/HostDashboard" 2 | @using Volo.Abp.AuditLogging.Blazor.Pages.Shared.ErrorRateWidget 3 | @using Volo.Abp.AuditLogging.Blazor.Pages.Shared.AverageExecutionDurationPerDayWidget 4 | @using Volo.Abp.AspNetCore.Components.Web.Theming.Layout 5 | @inherits ABPRaffleAppComponentBase 6 | 7 | @* ************************* PAGE HEADER ************************* *@ 8 | 9 | 10 | 11 | 12 | @* ************************* CONTENT ************************* *@ 13 | 14 | 15 | 16 | 17 | 18 | 19 | @L["Date"] 20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | @if (HasAuditLoggingPermission) 40 | { 41 | 42 | 43 | 44 | 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.Application.Tests/Books/BookAppService_Tests .cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Threading.Tasks; 4 | using Shouldly; 5 | using Volo.Abp.Application.Dtos; 6 | using Volo.Abp.Modularity; 7 | using Volo.Abp.Validation; 8 | using Xunit; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp.Books; 11 | 12 | public abstract class BookAppService_Tests : ABPRaffleAppApplicationTestBase 13 | where TStartupModule : IAbpModule 14 | { 15 | private readonly IBookAppService _bookAppService; 16 | 17 | protected BookAppService_Tests() 18 | { 19 | _bookAppService = GetRequiredService(); 20 | } 21 | 22 | [Fact] 23 | public async Task Should_Get_List_Of_Books() 24 | { 25 | //Act 26 | var result = await _bookAppService.GetListAsync( 27 | new PagedAndSortedResultRequestDto() 28 | ); 29 | 30 | //Assert 31 | result.TotalCount.ShouldBeGreaterThan(0); 32 | result.Items.ShouldContain(b => b.Name == "1984"); 33 | } 34 | 35 | [Fact] 36 | public async Task Should_Create_A_Valid_Book() 37 | { 38 | //Act 39 | var result = await _bookAppService.CreateAsync( 40 | new CreateUpdateBookDto 41 | { 42 | Name = "New test book 42", 43 | Price = 10, 44 | PublishDate = DateTime.Now, 45 | Type = BookType.ScienceFiction 46 | } 47 | ); 48 | 49 | //Assert 50 | result.Id.ShouldNotBe(Guid.Empty); 51 | result.Name.ShouldBe("New test book 42"); 52 | } 53 | 54 | [Fact] 55 | public async Task Should_Not_Create_A_Book_Without_Name() 56 | { 57 | var exception = await Assert.ThrowsAsync(async () => 58 | { 59 | await _bookAppService.CreateAsync( 60 | new CreateUpdateBookDto 61 | { 62 | Name = "", 63 | Price = 10, 64 | PublishDate = DateTime.Now, 65 | Type = BookType.ScienceFiction 66 | } 67 | ); 68 | }); 69 | 70 | exception.ValidationErrors 71 | .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); 72 | } 73 | } -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Microsoft.AspNetCore.Builder; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using Microsoft.Extensions.Hosting; 6 | using Serilog; 7 | using Serilog.Events; 8 | 9 | namespace YazilimAcademy.ABPRaffleApp; 10 | 11 | public class Program 12 | { 13 | public async static Task Main(string[] args) 14 | { 15 | Log.Logger = new LoggerConfiguration() 16 | .WriteTo.Async(c => c.File("Logs/logs.txt")) 17 | .WriteTo.Async(c => c.Console()) 18 | .CreateBootstrapLogger(); 19 | 20 | try 21 | { 22 | Log.Information("Starting YazilimAcademy.ABPRaffleApp.HttpApi.Host."); 23 | var builder = WebApplication.CreateBuilder(args); 24 | builder.Host 25 | .AddAppSettingsSecretsJson() 26 | .UseAutofac() 27 | .UseSerilog((context, services, loggerConfiguration) => 28 | { 29 | loggerConfiguration 30 | #if DEBUG 31 | .MinimumLevel.Debug() 32 | #else 33 | .MinimumLevel.Information() 34 | #endif 35 | .MinimumLevel.Override("Microsoft", LogEventLevel.Information) 36 | .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) 37 | .Enrich.FromLogContext() 38 | .WriteTo.Async(c => c.File("Logs/logs.txt")) 39 | .WriteTo.Async(c => c.Console()) 40 | .WriteTo.Async(c => c.AbpStudio(services)); 41 | }); 42 | await builder.AddApplicationAsync(); 43 | var app = builder.Build(); 44 | await app.InitializeApplicationAsync(); 45 | await app.RunAsync(); 46 | return 0; 47 | } 48 | catch (Exception ex) 49 | { 50 | if (ex is HostAbortedException) 51 | { 52 | throw; 53 | } 54 | 55 | Log.Fatal(ex, "Host terminated unexpectedly!"); 56 | return 1; 57 | } 58 | finally 59 | { 60 | Log.CloseAndFlush(); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Application.Contracts/Permissions/ABPRaffleAppPermissionDefinitionProvider.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Localization; 2 | using Volo.Abp.Authorization.Permissions; 3 | using Volo.Abp.Localization; 4 | using Volo.Abp.MultiTenancy; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp.Permissions; 7 | 8 | public class ABPRaffleAppPermissionDefinitionProvider : PermissionDefinitionProvider 9 | { 10 | public override void Define(IPermissionDefinitionContext context) 11 | { 12 | var myGroup = context.AddGroup(ABPRaffleAppPermissions.GroupName); 13 | 14 | myGroup.AddPermission(ABPRaffleAppPermissions.Dashboard.Host, L("Permission:Dashboard"), MultiTenancySides.Host); 15 | myGroup.AddPermission(ABPRaffleAppPermissions.Dashboard.Tenant, L("Permission:Dashboard"), MultiTenancySides.Tenant); 16 | 17 | var booksPermission = myGroup.AddPermission(ABPRaffleAppPermissions.Books.Default, L("Permission:Books")); 18 | booksPermission.AddChild(ABPRaffleAppPermissions.Books.Create, L("Permission:Books.Create")); 19 | booksPermission.AddChild(ABPRaffleAppPermissions.Books.Edit, L("Permission:Books.Edit")); 20 | booksPermission.AddChild(ABPRaffleAppPermissions.Books.Delete, L("Permission:Books.Delete")); 21 | 22 | var rafflesPermission = myGroup.AddPermission(ABPRaffleAppPermissions.Raffles.Default, L("Permission:Raffles")); 23 | rafflesPermission.AddChild(ABPRaffleAppPermissions.Raffles.Create, L("Permission:Raffles.Create")); 24 | rafflesPermission.AddChild(ABPRaffleAppPermissions.Raffles.Edit, L("Permission:Raffles.Edit")); 25 | rafflesPermission.AddChild(ABPRaffleAppPermissions.Raffles.Delete, L("Permission:Raffles.Delete")); 26 | 27 | var participantsPermission = myGroup.AddPermission(ABPRaffleAppPermissions.Participants.Default, L("Permission:Participants")); 28 | participantsPermission.AddChild(ABPRaffleAppPermissions.Participants.Create, L("Permission:Participants.Create")); 29 | participantsPermission.AddChild(ABPRaffleAppPermissions.Participants.Edit, L("Permission:Participants.Edit")); 30 | participantsPermission.AddChild(ABPRaffleAppPermissions.Participants.Delete, L("Permission:Participants.Delete")); 31 | } 32 | 33 | private static LocalizableString L(string name) 34 | { 35 | return LocalizableString.Create(name); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/Configurations/ParticipantConfiguration.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 3 | using Volo.Abp.EntityFrameworkCore.Modeling; 4 | using YazilimAcademy.ABPRaffleApp.Domain.Participants; 5 | using YazilimAcademy.ABPRaffleApp.Domain.Shared; 6 | using YazilimAcademy.ABPRaffleApp.Raffles; 7 | 8 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Configurations; 9 | 10 | public sealed class ParticipantConfiguration : IEntityTypeConfiguration 11 | { 12 | public void Configure(EntityTypeBuilder builder) 13 | { 14 | builder.ToTable(ABPRaffleAppConsts.DbTablePrefix + "Participants", 15 | ABPRaffleAppConsts.DbSchema); 16 | 17 | builder.ConfigureByConvention(); 18 | 19 | // builder.OwnsOne(p => p.FullName, 20 | // fullNameBuilder => 21 | // { 22 | // fullNameBuilder.Property(fn => fn.FirstName) 23 | // .IsRequired() 24 | // .HasMaxLength(128) 25 | // .HasColumnName("FirstName"); 26 | 27 | // fullNameBuilder.HasIndex(fn => fn.FirstName); 28 | 29 | // fullNameBuilder.Property(fn => fn.LastName) 30 | // .IsRequired() 31 | // .HasMaxLength(128) 32 | // .HasColumnName("LastName"); 33 | 34 | // fullNameBuilder.HasIndex(fn => fn.LastName); 35 | // }); 36 | 37 | builder.Property(x => x.FullName) 38 | .HasConversion(fullName => fullName.ToString(), 39 | value => FullName.Create(value)) 40 | .IsRequired(); 41 | 42 | builder.Property(x => x.FullName) 43 | .HasMaxLength(ParticipantConsts.MaxFullNameLength) 44 | .IsRequired(); 45 | 46 | builder.HasIndex(x => x.FullName); 47 | 48 | builder.Property(p => p.Email) 49 | .HasConversion(email => email.Value, 50 | value => new Email(value)) 51 | .IsRequired(); 52 | 53 | builder.Property(x => x.Email) 54 | .HasMaxLength(ParticipantConsts.MaxEmailLength) 55 | .IsRequired(); 56 | 57 | builder.HasIndex(x => x.Email); 58 | 59 | builder.HasOne(p => p.Raffle) 60 | .WithMany(r => r.Participants) 61 | .HasForeignKey(p => p.RaffleId) 62 | .OnDelete(DeleteBehavior.Cascade); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.TestBase/ABPRaffleAppTestBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Microsoft.Extensions.Configuration; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using Volo.Abp; 6 | using Volo.Abp.Modularity; 7 | using Volo.Abp.Uow; 8 | using Volo.Abp.Testing; 9 | 10 | namespace YazilimAcademy.ABPRaffleApp; 11 | 12 | public abstract class ABPRaffleAppTestBase : AbpIntegratedTest 13 | where TStartupModule : IAbpModule 14 | { 15 | protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) 16 | { 17 | options.UseAutofac(); 18 | } 19 | 20 | protected override void BeforeAddApplication(IServiceCollection services) 21 | { 22 | var builder = new ConfigurationBuilder(); 23 | builder.AddJsonFile("appsettings.json", false); 24 | builder.AddJsonFile("appsettings.secrets.json", true); 25 | services.ReplaceConfiguration(builder.Build()); 26 | } 27 | 28 | protected virtual Task WithUnitOfWorkAsync(Func func) 29 | { 30 | return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); 31 | } 32 | 33 | protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) 34 | { 35 | using (var scope = ServiceProvider.CreateScope()) 36 | { 37 | var uowManager = scope.ServiceProvider.GetRequiredService(); 38 | 39 | using (var uow = uowManager.Begin(options)) 40 | { 41 | await action(); 42 | 43 | await uow.CompleteAsync(); 44 | } 45 | } 46 | } 47 | 48 | protected virtual Task WithUnitOfWorkAsync(Func> func) 49 | { 50 | return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); 51 | } 52 | 53 | protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) 54 | { 55 | using (var scope = ServiceProvider.CreateScope()) 56 | { 57 | var uowManager = scope.ServiceProvider.GetRequiredService(); 58 | 59 | using (var uow = uowManager.Begin(options)) 60 | { 61 | var result = await func(); 62 | await uow.CompleteAsync(); 63 | return result; 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/wwwroot/service-worker.published.js: -------------------------------------------------------------------------------- 1 | // Caution! Be sure you understand the caveats before publishing an application with 2 | // offline support. See https://aka.ms/blazor-offline-considerations 3 | 4 | self.importScripts('./service-worker-assets.js'); 5 | self.addEventListener('install', event => event.waitUntil(onInstall(event))); 6 | self.addEventListener('activate', event => event.waitUntil(onActivate(event))); 7 | self.addEventListener('fetch', event => event.respondWith(onFetch(event))); 8 | 9 | const cacheNamePrefix = 'offline-cache-'; 10 | const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; 11 | const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ]; 12 | const offlineAssetsExclude = [ /^service-worker\.js$/ ]; 13 | 14 | async function onInstall(event) { 15 | console.info('Service worker: Install'); 16 | 17 | // Fetch and cache all matching items from the assets manifest 18 | const assetsRequests = self.assetsManifest.assets 19 | .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) 20 | .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) 21 | .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); 22 | await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); 23 | } 24 | 25 | async function onActivate(event) { 26 | console.info('Service worker: Activate'); 27 | 28 | // Delete unused caches 29 | const cacheKeys = await caches.keys(); 30 | await Promise.all(cacheKeys 31 | .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) 32 | .map(key => caches.delete(key))); 33 | } 34 | 35 | async function onFetch(event) { 36 | let cachedResponse = null; 37 | if (event.request.method === 'GET') { 38 | // For all navigation requests, try to serve index.html from cache 39 | // If you need some URLs to be server-rendered, edit the following check to exclude those URLs 40 | const shouldServeIndexHtml = event.request.mode === 'navigate'; 41 | 42 | const request = shouldServeIndexHtml ? 'index.html' : event.request; 43 | const cache = await caches.open(cacheName); 44 | cachedResponse = await cache.match(request); 45 | } 46 | 47 | return cachedResponse || fetch(event.request); 48 | } 49 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/ABPRaffleAppDomainSharedModule.cs: -------------------------------------------------------------------------------- 1 | using YazilimAcademy.ABPRaffleApp.Localization; 2 | using Volo.Abp.AuditLogging; 3 | using Volo.Abp.BackgroundJobs; 4 | using Volo.Abp.FeatureManagement; 5 | using Volo.Abp.Identity; 6 | using Volo.Abp.Localization; 7 | using Volo.Abp.Localization.ExceptionHandling; 8 | using Volo.Abp.Validation.Localization; 9 | using Volo.Abp.Modularity; 10 | using Volo.Abp.PermissionManagement; 11 | using Volo.Abp.SettingManagement; 12 | using Volo.Abp.VirtualFileSystem; 13 | using Volo.Abp.OpenIddict; 14 | using Volo.Abp.BlobStoring.Database; 15 | using Volo.Abp.LanguageManagement; 16 | using Volo.Abp.Gdpr; 17 | using Volo.Abp.GlobalFeatures; 18 | 19 | namespace YazilimAcademy.ABPRaffleApp; 20 | 21 | [DependsOn( 22 | typeof(AbpAuditLoggingDomainSharedModule), 23 | typeof(AbpBackgroundJobsDomainSharedModule), 24 | typeof(AbpFeatureManagementDomainSharedModule), 25 | typeof(AbpPermissionManagementDomainSharedModule), 26 | typeof(AbpSettingManagementDomainSharedModule), 27 | typeof(AbpIdentityProDomainSharedModule), 28 | typeof(AbpOpenIddictProDomainSharedModule), 29 | typeof(LanguageManagementDomainSharedModule), 30 | typeof(AbpGdprDomainSharedModule), 31 | typeof(AbpGlobalFeaturesModule), 32 | typeof(BlobStoringDatabaseDomainSharedModule) 33 | )] 34 | public class ABPRaffleAppDomainSharedModule : AbpModule 35 | { 36 | public override void PreConfigureServices(ServiceConfigurationContext context) 37 | { 38 | ABPRaffleAppGlobalFeatureConfigurator.Configure(); 39 | ABPRaffleAppModuleExtensionConfigurator.Configure(); 40 | } 41 | 42 | public override void ConfigureServices(ServiceConfigurationContext context) 43 | { 44 | Configure(options => 45 | { 46 | options.FileSets.AddEmbedded(); 47 | }); 48 | 49 | Configure(options => 50 | { 51 | options.Resources 52 | .Add("en") 53 | .AddBaseTypes(typeof(AbpValidationResource)) 54 | .AddVirtualJson("/Localization/ABPRaffleApp"); 55 | 56 | options.DefaultResourceType = typeof(ABPRaffleAppResource); 57 | }); 58 | 59 | Configure(options => 60 | { 61 | options.MapCodeNamespace("ABPRaffleApp", typeof(ABPRaffleAppResource)); 62 | }); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.HttpApi.Host/wwwroot/images/clients/aspnetcore.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Blazor.Client/Pages/HostDashboard.razor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Components; 6 | using Volo.Abp.AuditLogging; 7 | using Volo.Abp.AuditLogging.Blazor.Pages.Shared.AverageExecutionDurationPerDayWidget; 8 | using Volo.Abp.AuditLogging.Blazor.Pages.Shared.ErrorRateWidget; 9 | using Volo.Abp.Authorization.Permissions; 10 | using Volo.Abp.BlazoriseUI; 11 | using Volo.Abp.Timing; 12 | 13 | namespace YazilimAcademy.ABPRaffleApp.Blazor.Client.Pages; 14 | 15 | public partial class HostDashboard 16 | { 17 | [Inject] 18 | public IPermissionChecker PermissionChecker { get; set; } = default!; 19 | 20 | protected List BreadcrumbItems = new(); 21 | 22 | protected AuditLoggingErrorRateWidgetComponent? ErrorRateWidgetComponent; 23 | 24 | protected AuditLoggingAverageExecutionDurationPerDayWidgetComponent? AverageExecutionDurationPerDayWidgetComponent; 25 | 26 | protected DateTime StartDate { get; set; } 27 | 28 | protected DateTime EndDate { get; set; } 29 | 30 | protected bool HasAuditLoggingPermission { get; set; } 31 | 32 | protected async override Task OnInitializedAsync() 33 | { 34 | StartDate = Clock.Now.AddMonths(-1).Date; 35 | EndDate = Clock.Now.Date; 36 | HasAuditLoggingPermission = await PermissionChecker.IsGrantedAsync(AbpAuditLoggingPermissions.AuditLogs.Default); 37 | } 38 | 39 | protected override async Task OnAfterRenderAsync(bool firstRender) 40 | { 41 | if (firstRender) 42 | { 43 | await SetBreadcrumbItemsAsync(); 44 | await InvokeAsync(StateHasChanged); 45 | } 46 | } 47 | 48 | protected virtual async Task RefreshAsync() 49 | { 50 | if (HasAuditLoggingPermission) 51 | { 52 | if (ErrorRateWidgetComponent != null) 53 | { 54 | await ErrorRateWidgetComponent.RefreshAsync(); 55 | } 56 | 57 | if(AverageExecutionDurationPerDayWidgetComponent != null) 58 | { 59 | await AverageExecutionDurationPerDayWidgetComponent.RefreshAsync(); 60 | } 61 | } 62 | 63 | } 64 | 65 | protected virtual ValueTask SetBreadcrumbItemsAsync() 66 | { 67 | BreadcrumbItems.Add(new BreadcrumbItem(L["Dashboard"])); 68 | return ValueTask.CompletedTask; 69 | } 70 | 71 | protected virtual Task OnDatesChangedAsync(IReadOnlyList dates) 72 | { 73 | StartDate = dates.Min(); 74 | EndDate = dates.Max(); 75 | 76 | return Task.CompletedTask; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore/EntityFrameworkCore/ABPRaffleAppEntityFrameworkCoreModule.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Extensions.DependencyInjection; 3 | using Volo.Abp.Uow; 4 | using Volo.Abp.AuditLogging.EntityFrameworkCore; 5 | using Volo.Abp.BackgroundJobs.EntityFrameworkCore; 6 | using Volo.Abp.EntityFrameworkCore; 7 | using Volo.Abp.EntityFrameworkCore.PostgreSql; 8 | using Volo.Abp.FeatureManagement.EntityFrameworkCore; 9 | using Volo.Abp.Identity.EntityFrameworkCore; 10 | using Volo.Abp.OpenIddict.EntityFrameworkCore; 11 | using Volo.Abp.Modularity; 12 | using Volo.Abp.PermissionManagement.EntityFrameworkCore; 13 | using Volo.Abp.SettingManagement.EntityFrameworkCore; 14 | using Volo.Abp.BlobStoring.Database.EntityFrameworkCore; 15 | using Volo.Abp.LanguageManagement.EntityFrameworkCore; 16 | using Volo.Abp.Gdpr; 17 | 18 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 19 | 20 | [DependsOn( 21 | typeof(ABPRaffleAppDomainModule), 22 | typeof(AbpPermissionManagementEntityFrameworkCoreModule), 23 | typeof(AbpSettingManagementEntityFrameworkCoreModule), 24 | typeof(AbpEntityFrameworkCorePostgreSqlModule), 25 | typeof(AbpBackgroundJobsEntityFrameworkCoreModule), 26 | typeof(AbpAuditLoggingEntityFrameworkCoreModule), 27 | typeof(AbpFeatureManagementEntityFrameworkCoreModule), 28 | typeof(AbpIdentityProEntityFrameworkCoreModule), 29 | typeof(AbpOpenIddictProEntityFrameworkCoreModule), 30 | typeof(LanguageManagementEntityFrameworkCoreModule), 31 | typeof(AbpGdprEntityFrameworkCoreModule), 32 | typeof(BlobStoringDatabaseEntityFrameworkCoreModule) 33 | )] 34 | public class ABPRaffleAppEntityFrameworkCoreModule : AbpModule 35 | { 36 | public override void PreConfigureServices(ServiceConfigurationContext context) 37 | { 38 | // https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic 39 | AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); 40 | 41 | ABPRaffleAppEfCoreEntityExtensionMappings.Configure(); 42 | } 43 | 44 | public override void ConfigureServices(ServiceConfigurationContext context) 45 | { 46 | context.Services.AddAbpDbContext(options => 47 | { 48 | /* Remove "includeAllEntities: true" to create 49 | * default repositories only for aggregate roots */ 50 | options.AddDefaultRepositories(includeAllEntities: true); 51 | }); 52 | 53 | Configure(options => 54 | { 55 | /* The main point to change your DBMS. 56 | * See also ABPRaffleAppDbContextFactory for EF Core tooling. */ 57 | options.UseNpgsql(); 58 | }); 59 | 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /test/YazilimAcademy.ABPRaffleApp.EntityFrameworkCore.Tests/EntityFrameworkCore/ABPRaffleAppEntityFrameworkCoreTestModule.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Data.Sqlite; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Infrastructure; 4 | using Microsoft.EntityFrameworkCore.Storage; 5 | using Microsoft.Extensions.DependencyInjection; 6 | using Volo.Abp; 7 | using Volo.Abp.EntityFrameworkCore; 8 | using Volo.Abp.EntityFrameworkCore.Sqlite; 9 | using Volo.Abp.FeatureManagement; 10 | using Volo.Abp.Modularity; 11 | using Volo.Abp.PermissionManagement; 12 | using Volo.Abp.Uow; 13 | 14 | namespace YazilimAcademy.ABPRaffleApp.EntityFrameworkCore; 15 | 16 | [DependsOn( 17 | typeof(ABPRaffleAppApplicationTestModule), 18 | typeof(ABPRaffleAppEntityFrameworkCoreModule), 19 | typeof(AbpEntityFrameworkCoreSqliteModule) 20 | )] 21 | public class ABPRaffleAppEntityFrameworkCoreTestModule : AbpModule 22 | { 23 | private SqliteConnection? _sqliteConnection; 24 | 25 | public override void ConfigureServices(ServiceConfigurationContext context) 26 | { 27 | Configure(options => 28 | { 29 | options.SaveStaticFeaturesToDatabase = false; 30 | options.IsDynamicFeatureStoreEnabled = false; 31 | }); 32 | Configure(options => 33 | { 34 | options.SaveStaticPermissionsToDatabase = false; 35 | options.IsDynamicPermissionStoreEnabled = false; 36 | }); 37 | context.Services.AddAlwaysDisableUnitOfWorkTransaction(); 38 | 39 | ConfigureInMemorySqlite(context.Services); 40 | 41 | } 42 | 43 | private void ConfigureInMemorySqlite(IServiceCollection services) 44 | { 45 | _sqliteConnection = CreateDatabaseAndGetConnection(); 46 | 47 | services.Configure(options => 48 | { 49 | options.Configure(context => 50 | { 51 | context.DbContextOptions.UseSqlite(_sqliteConnection); 52 | }); 53 | }); 54 | } 55 | 56 | public override void OnApplicationShutdown(ApplicationShutdownContext context) 57 | { 58 | _sqliteConnection?.Dispose(); 59 | } 60 | 61 | private static SqliteConnection CreateDatabaseAndGetConnection() 62 | { 63 | var connection = new SqliteConnection("Data Source=:memory:"); 64 | connection.Open(); 65 | 66 | var options = new DbContextOptionsBuilder() 67 | .UseSqlite(connection) 68 | .Options; 69 | 70 | using (var context = new ABPRaffleAppDbContext(options)) 71 | { 72 | context.GetService().CreateTables(); 73 | } 74 | 75 | return connection; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/YazilimAcademy.ABPRaffleApp.Domain.Shared/ABPRaffleAppModuleExtensionConfigurator.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using Volo.Abp.Identity; 3 | using Volo.Abp.ObjectExtending; 4 | using Volo.Abp.Threading; 5 | 6 | namespace YazilimAcademy.ABPRaffleApp; 7 | 8 | public static class ABPRaffleAppModuleExtensionConfigurator 9 | { 10 | private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); 11 | 12 | public static void Configure() 13 | { 14 | OneTimeRunner.Run(() => 15 | { 16 | ConfigureExistingProperties(); 17 | ConfigureExtraProperties(); 18 | }); 19 | } 20 | 21 | private static void ConfigureExistingProperties() 22 | { 23 | /* You can change max lengths for properties of the 24 | * entities defined in the modules used by your application. 25 | * 26 | * Example: Change user and role name max lengths 27 | 28 | AbpUserConsts.MaxNameLength = 99; 29 | IdentityRoleConsts.MaxNameLength = 99; 30 | 31 | * Notice: It is not suggested to change property lengths 32 | * unless you really need it. Go with the standard values wherever possible. 33 | * 34 | * If you are using EF Core, you will need to run the add-migration command after your changes. 35 | */ 36 | } 37 | 38 | private static void ConfigureExtraProperties() 39 | { 40 | /* You can configure extra properties for the 41 | * entities defined in the modules used by your application. 42 | * 43 | * This class can be used to define these extra properties 44 | * with a high level, easy to use API. 45 | * 46 | * Example: Add a new property to the user entity of the identity module 47 | 48 | ObjectExtensionManager.Instance.Modules() 49 | .ConfigureIdentity(identity => 50 | { 51 | identity.ConfigureUser(user => 52 | { 53 | user.AddOrUpdateProperty( //property type: string 54 | "SocialSecurityNumber", //property name 55 | property => 56 | { 57 | //validation rules 58 | property.Attributes.Add(new RequiredAttribute()); 59 | property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4}); 60 | 61 | //...other configurations for this property 62 | } 63 | ); 64 | }); 65 | }); 66 | 67 | * See the documentation for more: 68 | * https://docs.abp.io/en/abp/latest/Module-Entity-Extensions 69 | */ 70 | } 71 | } 72 | --------------------------------------------------------------------------------