using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Authentication.OAuth; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Data.Entity; using Yavsc.Models.Relationship; namespace Yavsc.Models { using Auth; using Billing; using Booking; using OAuth; using Workflow; using Identity; using Market; using Chat; using Messaging; using Access; using Yavsc.Models.Booking.Profiles; using System.Web; using System.Threading; public class ApplicationDbContext : IdentityDbContext { protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Customize the ASP.NET Identity model and override the defaults if needed. // For example, you can rename the ASP.NET Identity table names and more. // Add your customizations after calling base.OnModelCreating(builder); builder.Entity().HasKey(x => new { x.OwnerId, x.UserId }); builder.Entity().Property(x=>x.DeclarationDate).HasDefaultValueSql("LOCALTIMESTAMP"); builder.Entity().HasKey(x=>new { x.PostId, x.TagId}); builder.Entity().HasMany( c=>c.Connections ); builder.Entity().HasKey(u=> new { u.DoesCode, u.UserId}); builder.Entity().HasKey(u=> new { u.InstrumentId, u.UserId}); builder.Entity().HasKey(a=> new { a.CircleId, a.BlogPostId}); builder.Entity().HasKey(c=> new { MemberId = c.MemberId, CircleId = c.CircleId }); foreach (var et in builder.Model.GetEntityTypes()) { if (et.ClrType.GetInterface("IBaseTrackedEntity")!=null) et.FindProperty("DateCreated").IsReadOnlyAfterSave = true; } } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(Startup.ConnectionString); } public DbSet Applications { get; set; } public DbSet RefreshTokens { get; set; } /// /// Activities referenced on this site /// /// public DbSet Activities { get; set; } public DbSet UserActivities { get; set; } /// /// Users posts /// /// public DbSet Blogspot { get; set; } /// /// Skills propulsed by this site /// /// public DbSet SiteSkills { get; set; } /// /// Circle members /// /// public DbSet CircleMembers { get; set; } /// /// Commands, from an user, to a performer /// (A performer is an user who's actived a main activity /// on his profile). /// /// public DbSet Commands { get; set; } /// /// Special commands, talking about /// a given place and date. /// /// public DbSet BookQueries { get; set; } public DbSet Performers { get; set; } public DbSet Estimates { get; set; } public DbSet BankStatus { get; set; } public DbSet BankBook { get; set; } public DbSet Map { get; set; } /// /// Google Calendar offline /// open auth tokens /// /// tokens public DbSet Tokens { get; set; } /// /// References all declared external GCM devices /// /// public DbSet GCMDevices { get; set; } public DbSet Services { get; set; } public DbSet Products { get; set; } public Task ClearTokensAsync() { Tokens.RemoveRange(this.Tokens); SaveChanges(); return Task.FromResult(0); } public Task DeleteTokensAsync(string email) { if (string.IsNullOrEmpty(email)) { throw new ArgumentException("email MUST have a value"); } var item = this.Tokens.FirstOrDefault(x => x.UserId == email); if (item != null) { Tokens.Remove(item); SaveChanges(); } return Task.FromResult(0); } public Task GetTokensAsync(string googleUserId) { if (string.IsNullOrEmpty(googleUserId)) { throw new ArgumentException("email MUST have a value"); } using (var context = new ApplicationDbContext()) { var item = this.Tokens.FirstOrDefault(x => x.UserId == googleUserId); return Task.FromResult(item); } } public Task StoreTokenAsync(string googleUserId, OAuthTokenResponse value) { if (string.IsNullOrEmpty(googleUserId)) { throw new ArgumentException("googleUserId MUST have a value"); } var item = this.Tokens.SingleOrDefaultAsync(x => x.UserId == googleUserId).Result; if (item == null) { Tokens.Add(new OAuth2Tokens { TokenType = "Bearer", // FIXME why value.TokenType would be null? AccessToken = value.AccessToken, RefreshToken = value.RefreshToken, Expiration = DateTime.Now.AddSeconds(int.Parse(value.ExpiresIn)), UserId = googleUserId }); } else { item.AccessToken = value.AccessToken; item.Expiration = DateTime.Now.AddMinutes(int.Parse(value.ExpiresIn)); if (value.RefreshToken != null) item.RefreshToken = value.RefreshToken; Tokens.Update(item); } SaveChanges(); return Task.FromResult(0); } Client FindApplication(string clientId) { return Applications.FirstOrDefault( app=>app.Id == clientId); } public DbSet ExceptionsSIREN { get; set; } public DbSet Locations { get; set; } public DbSet Tags { get; set; } public DbSet TagsDomain { get; set; } public DbSet EstimateTemplates { get; set; } public DbSet Contacts { get; set; } public DbSet ClientProviderInfo { get; set; } public DbSet Connections { get; set; } public DbSet BlackListed { get; set; } public DbSet MusicalPreferences { get; set; } public DbSet MusicalTendency { get; set; } public DbSet LocationType { get; set; } public DbSet Instrument { get; set; } public DbSet DjSettings { get; set; } public DbSet Instrumentation { get; set; } public DbSet FormationSettings { get; set; } public DbSet GeneralSettings { get; set; } public DbSet WorkflowProviders { get; set; } private void AddTimestamps() { var entities = ChangeTracker.Entries().Where(x => x.Entity.GetType().GetInterface("IBaseTrackedEntity")!=null && (x.State == EntityState.Added || x.State == EntityState.Modified)); var currentUsername = !string.IsNullOrEmpty(System.Web.HttpContext.Current?.User?.Identity?.Name) ? HttpContext.Current.User.Identity.Name : "Anonymous"; foreach (var entity in entities) { if (entity.State == EntityState.Added) { ((IBaseTrackedEntity)entity.Entity).DateCreated = DateTime.Now; ((IBaseTrackedEntity)entity.Entity).UserCreated = currentUsername; } ((IBaseTrackedEntity)entity.Entity).DateModified = DateTime.Now; ((IBaseTrackedEntity)entity.Entity).UserModified = currentUsername; } } override public int SaveChanges() { AddTimestamps(); return base.SaveChanges(); } public override async Task SaveChangesAsync(CancellationToken ctoken = default(CancellationToken)) { AddTimestamps(); return await base.SaveChangesAsync(); } public DbSet Circle { get; set; } public DbSet BlogACL { get; set; } } }