diff --git a/README.md b/README.md index e69de29..9463188 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,12 @@ +[![Build Status](https://codefirst.iut.uca.fr/api/badges/matheo.thierry/notus/status.svg)](https://codefirst.iut.uca.fr/matheo.thierry/notus) +[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=notus_ThMo&metric=alert_status&token=f49680ff7f8cbaaa0872d836ad12346debbf5164)](https://codefirst.iut.uca.fr/sonar/dashboard?id=notus_ThMo) +[![Coverage](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=notus_ThMo&metric=coverage&token=f49680ff7f8cbaaa0872d836ad12346debbf5164)](https://codefirst.iut.uca.fr/sonar/dashboard?id=notus_ThMo) +[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=notus_ThMo&metric=ncloc&token=f49680ff7f8cbaaa0872d836ad12346debbf5164)](https://codefirst.iut.uca.fr/sonar/dashboard?id=notus_ThMo) + +# SAE 2.01 - Développement d'une application + +## Présentation + +Dans le cadre de la SAE, notre mission consiste à développer une application de prise de notes. Cette application sera un outil pratique pour les personnes qui cherchent à organiser leurs idées et leurs pensées. + +Notre application sera facile à utiliser et intuitive, avec une interface simple et épurée qui permettra à l'utilisateur de s'orienter facilement. Elle permettra de partager les notes avec d'autres utilisateurs et de les gérer avec des tags. L’application sera personnalisable grâce à la possibilité de choisir parmi plusieurs thèmes et logos fournis. Les utilisateurs pourront également créer leurs propres thèmes. \ No newline at end of file diff --git a/notus/Biblioteque_de_Class/Biblioteque_de_Class.csproj b/notus/Biblioteque_de_Class/Biblioteque_de_Class.csproj index cfadb03..7f9fd35 100644 --- a/notus/Biblioteque_de_Class/Biblioteque_de_Class.csproj +++ b/notus/Biblioteque_de_Class/Biblioteque_de_Class.csproj @@ -6,4 +6,8 @@ enable + + + + diff --git a/notus/Biblioteque_de_Class/Database.cs b/notus/Biblioteque_de_Class/Database.cs index fd54280..e8ca489 100644 --- a/notus/Biblioteque_de_Class/Database.cs +++ b/notus/Biblioteque_de_Class/Database.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; +using System.Data; using System.Linq; using System.Runtime.Serialization; using System.Text; @@ -9,7 +10,7 @@ using System.Threading.Tasks; namespace Biblioteque_de_Class { - [DataContract] + [DataContract(IsReference = true)] public class Database { [DataMember] @@ -18,17 +19,24 @@ namespace Biblioteque_de_Class private List ThemeList; [DataMember] private List UserList; + [DataMember] + private Dictionary> AddedThemeList; public Database() { DefaultLogoList = new List(); ThemeList = new List(); UserList = new List(); + AddedThemeList = new Dictionary>(); } public List GetDefaultLogoList() { return DefaultLogoList; } public List GetThemeList() { return ThemeList; } public List GetUserList() { return UserList; } + public Dictionary> GetAddedThemeFromUser() { return AddedThemeList; } + + public void SetDefaultLogoList(List defaultLogoList) { DefaultLogoList = defaultLogoList; } + public void SetDefaultThemeList(List defaultThemeList) { ThemeList = defaultThemeList; } /// /// recherche un utilisateur dans la liste d'utilisateur @@ -204,5 +212,10 @@ namespace Biblioteque_de_Class } } } + + public List AddedThemeOfOneUser(User user) + { + return GetAddedThemeFromUser()[user]; + } } } \ No newline at end of file diff --git a/notus/Biblioteque_de_Class/IManager.cs b/notus/Biblioteque_de_Class/IManager.cs index 262f1c9..e605379 100644 --- a/notus/Biblioteque_de_Class/IManager.cs +++ b/notus/Biblioteque_de_Class/IManager.cs @@ -8,8 +8,11 @@ namespace Biblioteque_de_Class { public interface IManager { - public void SaveDatabaseData(Database database); + public void SaveDatabaseData(List UserList, Dictionary> AddedThemeFromUser); public Database LoadDatabaseData(); + + public List LoadDefaultTheme(); + public List LoadDefaultLogo(); } } diff --git a/notus/Biblioteque_de_Class/Note.cs b/notus/Biblioteque_de_Class/Note.cs index abeedca..6a4ec7e 100644 --- a/notus/Biblioteque_de_Class/Note.cs +++ b/notus/Biblioteque_de_Class/Note.cs @@ -1,34 +1,47 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace Biblioteque_de_Class { + [DataContract(IsReference = true)] public class Note { + [DataMember] private string name; + [DataMember] public string Name { get { return name; } private set { if (value == null) { name = "Unnamed Note"; } else { name = value; } } } + [DataMember] private string Text { get; set; } = ""; - + + [DataMember] private string logoPath; + [DataMember] public string LogoPath { get { return logoPath; } private set { if (value == null) { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } } } + [DataMember] private DateOnly CreationDate { get; } + [DataMember] private DateOnly ModificationDate { get; set; } + [DataMember] private readonly List ImageList; + [DataMember] private readonly List Collaborators; + [DataMember] private readonly List Editors; + [DataMember] private readonly User Owner; public Note(string name, string logoPath, User owner) @@ -58,7 +71,6 @@ namespace Biblioteque_de_Class public void SetName(string name) { Name = name; } public void SetLogoPath(string logoPath) { LogoPath = logoPath; } public void SetModificationDate() { ModificationDate = DateOnly.FromDateTime(DateTime.Now); } - /// /// vérifier si l'utilisateur est le propriétaire de la note diff --git a/notus/Biblioteque_de_Class/PersistenceManager.cs b/notus/Biblioteque_de_Class/PersistenceManager.cs index cb276f0..64bdb9c 100644 --- a/notus/Biblioteque_de_Class/PersistenceManager.cs +++ b/notus/Biblioteque_de_Class/PersistenceManager.cs @@ -4,6 +4,8 @@ namespace Biblioteque_de_Class { public class PersistenceManager { + private Database db = new(); + private readonly IManager persistence; public PersistenceManager(IManager pers) @@ -11,14 +13,17 @@ namespace Biblioteque_de_Class persistence = pers; } - public void SaveDatabaseData(Database database) + public void SaveDatabaseData(Database database) { - persistence.SaveDatabaseData(database); + persistence.SaveDatabaseData(database.GetUserList(), database.GetAddedThemeFromUser()); } - public Database LoadDatabaseData() + public Database LoadDatabaseData() { - return persistence.LoadDatabaseData(); + db = persistence.LoadDatabaseData(); + db.SetDefaultThemeList(persistence.LoadDefaultTheme()); + db.SetDefaultLogoList(persistence.LoadDefaultLogo()); + return db; } } } diff --git a/notus/Biblioteque_de_Class/User.cs b/notus/Biblioteque_de_Class/User.cs index 9e9fa05..93ed1da 100644 --- a/notus/Biblioteque_de_Class/User.cs +++ b/notus/Biblioteque_de_Class/User.cs @@ -5,7 +5,7 @@ using System.Runtime.Serialization; namespace Biblioteque_de_Class { - [DataContract] + [DataContract(IsReference = true)] public class User { [DataMember] @@ -14,6 +14,9 @@ namespace Biblioteque_de_Class private string Email { get; set; } [DataMember] private string Password { get; set; } + [DataMember] + private string Picture { get; set; } + [DataMember] private Theme Theme; [DataMember] private List NoteList; @@ -21,7 +24,7 @@ namespace Biblioteque_de_Class private List TagList; [DataMember] private List FavList; - [DataMember] + [DataMember(EmitDefaultValue = false)] private bool IsConnected { get; set; } [DataMember] private Dictionary> NoteTagged; @@ -31,6 +34,7 @@ namespace Biblioteque_de_Class Username = username; Email = email; Password = password; + Picture = "defaultpicture.png"; NoteList = new List(); TagList = new List(); FavList = new List(); @@ -40,6 +44,7 @@ namespace Biblioteque_de_Class public string GetUsername() { return Username; } public string GetEmail() { return Email; } public string GetPassword() { return Password; } + public string GetPicture() { return Picture;} public Theme GetTheme() { return Theme; } public List GetNoteList() { return NoteList; } public List GetTagList() { return TagList; } @@ -51,6 +56,7 @@ namespace Biblioteque_de_Class public void SetUsername(string username) { Username = username; } public void SetEmail(string email) { Email = email; } public void SetPassword(string password) { Password = password; } + public void SetPicture(string picture) { Picture = picture; } public void SetTheme(Theme theme) { Theme = theme; } public void SetIsConnected(bool isConnected) { IsConnected = isConnected; } diff --git a/notus/Notus_Console/Program.cs b/notus/Notus_Console/Program.cs index d0a78b0..bb8aa57 100644 --- a/notus/Notus_Console/Program.cs +++ b/notus/Notus_Console/Program.cs @@ -7,10 +7,6 @@ using System.Text; // load database PersistenceManager manager = new(new Stub()); Database db = manager.LoadDatabaseData(); -foreach(User user in db.GetUserList()) -{ - user.SetPassword(GetSHA256Hash(user.GetPassword())); -} // initialization zone============================================================================== @@ -139,22 +135,6 @@ List? choix_couleur() return colorList; } -static string GetSHA256Hash(string input) -{ - using (SHA256 sha256Hash = SHA256.Create()) - { - byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); - - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < bytes.Length; i++) - { - builder.Append(bytes[i].ToString("x2")); - } - - return builder.ToString(); - } -} - while (menu) { Console.WriteLine("\n|--------------------------------------|"); @@ -190,7 +170,6 @@ while (menu) Console.WriteLine("\nEntrez un password :"); string? password = Console.ReadLine(); if (password == null) { continue; } - password = GetSHA256Hash(password); try { u = db.GetUser(nom); @@ -202,7 +181,7 @@ while (menu) } if (!connection) { - if (Database.ComparePassword(u, password)) + if (Database.ComparePassword(u, password.GetHashCode().ToString())) { u.SetIsConnected(true); Console.WriteLine("\nConnection réussie !\n"); @@ -234,8 +213,7 @@ while (menu) } catch (AlreadyUsedException) { - password = GetSHA256Hash(password); - u = new User(nom, "", password); + u = new User(nom, "", password.GetHashCode().ToString()); db.AddUser(u); db.GetUser(nom).SetIsConnected(true); Console.WriteLine("\nConnection réussie !\n"); @@ -548,8 +526,7 @@ while (u.GetIsConnected()) Console.WriteLine("\nLe mot de passe doit contenir au moins 8 caractères.\n"); break; } - wantedNewPassword = GetSHA256Hash(wantedNewPassword); - if(wantedNewPassword == u.GetPassword()){ + if(wantedNewPassword.GetHashCode().ToString() == u.GetPassword()){ Console.WriteLine("\nLe nouveau mot de passe doit être différent de l'ancien.\n"); break; } diff --git a/notus/Notus_Persistence/Stub.cs b/notus/Notus_Persistence/Stub.cs index d89c553..55cf79a 100644 --- a/notus/Notus_Persistence/Stub.cs +++ b/notus/Notus_Persistence/Stub.cs @@ -4,13 +4,15 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization.Json; using System.Text; +using System.Security.Cryptography; using System.Threading.Tasks; + namespace Notus_Persistance { public class Stub : IManager { - public void SaveDatabaseData(Database database) + public void SaveDatabaseData(List UserList, Dictionary> AddedThemeFromUser) { throw new NotImplementedException(); } @@ -39,7 +41,7 @@ namespace Notus_Persistance } // add note to user for sharing note test mixed with tag - uselect = (User)database.GetUserList().Where(x => x.GetUsername() == "Nicolas"); + uselect = (User)database.GetUserList().Where(x => x.GetUsername() == "Nicolas"); uselect.CreateNote("Note 4", "Logo_1"); uselect.CreateTag("Tag 3", "#00FF00"); nselect = (Note)uselect.GetNoteList().Where(x => x.GetName() == "Note 4"); @@ -59,10 +61,23 @@ namespace Notus_Persistance colorListHexaCode = new("000000,FFFFFF,000000".Split(',')); database.AddTheme(new Theme("Theme_3", colorListHexaCode)); + foreach (User user in database.GetUserList()) + { + user.SetPassword(user.GetPassword().GetHashCode().ToString()); + } return database; } + public List LoadDefaultTheme() + { + throw new NotImplementedException(); + } + public List LoadDefaultLogo() + { + throw new NotImplementedException(); + } + } } diff --git a/notus/Notus_Persistence/ToJSON.cs b/notus/Notus_Persistence/ToJSON.cs index 5cb4a5a..111f22f 100644 --- a/notus/Notus_Persistence/ToJSON.cs +++ b/notus/Notus_Persistence/ToJSON.cs @@ -9,26 +9,18 @@ using System.Text; using System.Threading.Tasks; using System.IO; using System.Text.Json; +using System.Text.Json.Serialization; namespace Notus_Persistance { public class ToJSON : IManager { private const string DatabaseDataFilePath = "data.json"; - private const string UserDataFilePath = "userdata.json"; - private const string NoteDataFilePath = "notedata.json"; - private const string ThemeDataFilePath = "themedata.json"; - private const string LogoDataFilePath = "logodata.json"; - private const string TagsDataFilePath = "tagsdata.json"; - private const string NoteImageDataFilePath = "noteImagedata.json"; - private static DataContractJsonSerializer DatabasejsonSerializer = new DataContractJsonSerializer(typeof(Database)); - private static DataContractJsonSerializer UserjsonSerializer = new DataContractJsonSerializer(typeof(User)); - private static DataContractJsonSerializer NotejsonSerializer = new DataContractJsonSerializer(typeof(Note)); - private static DataContractJsonSerializer ThemejsonSerializer = new DataContractJsonSerializer(typeof(Theme)); - private static DataContractJsonSerializer LogojsonSerializer = new DataContractJsonSerializer(typeof(Logo)); - private static DataContractJsonSerializer TagsjsonSerializer = new DataContractJsonSerializer(typeof(Tags)); - private static DataContractJsonSerializer NoteImagejsonSerializer = new DataContractJsonSerializer(typeof(NoteImage)); - public void SaveDatabaseData(Database database) + private const string DefaultThemePath = ""; + private const string DefaultLogoPath = ""; + private static readonly DataContractJsonSerializer DatabasejsonSerializer = new(typeof(Database)); + + public void SaveDatabaseData(List UserList, Dictionary> AddedThemeFromUser) { using (FileStream fileStream = File.Create(DatabaseDataFilePath)) { @@ -38,7 +30,8 @@ namespace Notus_Persistance false, true))//<- this boolean says that we sant indentation { - DatabasejsonSerializer.WriteObject(writer, database); + DatabasejsonSerializer.WriteObject(writer, UserList); + DatabasejsonSerializer.WriteObject(writer, AddedThemeFromUser); } } } @@ -65,5 +58,50 @@ namespace Notus_Persistance throw new FileException("No data file found."); } } + + public List LoadDefaultTheme() + { + if (File.Exists(DefaultThemePath)) + { + using (FileStream fileStream = File.OpenRead(DefaultThemePath)) + { + List? DefaultThemeList = (List?)DatabasejsonSerializer.ReadObject(fileStream); + if (DefaultThemeList == null) + { + throw new FileException("Failed to Default Theme. The loaded object is null."); + } + else + { + return DefaultThemeList; + } + } + } + else + { + throw new FileException("No data file found."); + } + } + public List LoadDefaultLogo() + { + if (File.Exists(DefaultLogoPath)) + { + using (FileStream fileStream = File.OpenRead(DefaultLogoPath)) + { + List? DefaultLogoList = (List?)DatabasejsonSerializer.ReadObject(fileStream); + if (DefaultLogoList == null) + { + throw new FileException("Failed to Default Logo. The loaded object is null."); + } + else + { + return DefaultLogoList; + } + } + } + else + { + throw new FileException("No data file found."); + } + } } } diff --git a/notus/Notus_Persistence/ToXML.cs b/notus/Notus_Persistence/ToXML.cs index fd45cc6..55bcb7d 100644 --- a/notus/Notus_Persistence/ToXML.cs +++ b/notus/Notus_Persistence/ToXML.cs @@ -7,22 +7,76 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Serialization; namespace Notus_Persistance { public class ToXML : IManager { private const string DataFilePath = "data.xml"; - private const string XmlDataFilePath = "userdata.xml"; + private const string DefaultThemePath = ""; + private const string DefaultLogoPath = ""; + private static readonly DataContractSerializer DatabaseXmlSerializer = new(typeof(Database)); - public void SaveDatabaseData(Database database) + public void SaveDatabaseData(List UserList, Dictionary> AddedThemeFromUser) { - throw new NotImplementedException(); + XmlWriterSettings settings = new() { Indent = true }; + using TextWriter tw = File.CreateText(DataFilePath); + using XmlWriter writer = XmlWriter.Create(tw, settings); + DatabaseXmlSerializer.WriteObject(writer, UserList); + DatabaseXmlSerializer.WriteObject(writer, AddedThemeFromUser); } public Database LoadDatabaseData() { - throw new NotImplementedException(); + if (File.Exists(DataFilePath)) + { + using (FileStream fileStream = File.OpenRead(DataFilePath)) + { + return DatabaseXmlSerializer.ReadObject(fileStream) is not Database database + ? throw new FileException("Failed to load the database. The loaded object is null.") + : database; + } + } + else + { + throw new FileException("No data file found."); + } } + + public List LoadDefaultTheme() + { + if (File.Exists(DefaultThemePath)) + { + using (FileStream fileStream = File.OpenRead(DefaultThemePath)) + { + return DatabaseXmlSerializer.ReadObject(fileStream) is not List DefaultThemeList + ? throw new FileException("Failed to load Default Theme. The loaded object is null.") + : DefaultThemeList; + } + } + else + { + throw new FileException("No data file found."); + } + } + + public List LoadDefaultLogo() + { + if (File.Exists(DefaultLogoPath)) + { + using (FileStream fileStream = File.OpenRead(DefaultLogoPath)) + { + return DatabaseXmlSerializer.ReadObject(fileStream) is not List DefaultLogoList + ? throw new FileException("Failed to load Default Logo. The loaded object is null.") + : DefaultLogoList; + } + } + else + { + throw new FileException("No data file found."); + } + } + } } diff --git a/notus/notus.sln b/notus/notus.sln index 23417e2..e579ff9 100644 --- a/notus/notus.sln +++ b/notus/notus.sln @@ -5,12 +5,8 @@ VisualStudioVersion = 17.0.31611.283 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Vue", "notus_vue\Notus_Vue.csproj", "{561264A1-4611-40FB-A662-3EF65550CA71}" ProjectSection(ProjectDependencies) = postProject - {0A5E5F33-6B39-42BF-A46D-0752EDB666FB} = {0A5E5F33-6B39-42BF-A46D-0752EDB666FB} {184478A9-E14F-42E0-B963-B3A4474C9C1C} = {184478A9-E14F-42E0-B963-B3A4474C9C1C} - {7B7F1062-9498-44E5-AC77-84BC90A3B730} = {7B7F1062-9498-44E5-AC77-84BC90A3B730} {92DD50C5-EEAD-44ED-AEFF-E21935725477} = {92DD50C5-EEAD-44ED-AEFF-E21935725477} - {AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF} = {AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF} - {EE443C17-B31D-4AD0-9141-920876E7DF79} = {EE443C17-B31D-4AD0-9141-920876E7DF79} EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}" diff --git a/notus/notus_vue/AppShell.xaml b/notus/notus_vue/AppShell.xaml index 0ce0df6..45afa72 100644 --- a/notus/notus_vue/AppShell.xaml +++ b/notus/notus_vue/AppShell.xaml @@ -27,6 +27,10 @@ Title="Inscription_Page" ContentTemplate="{DataTemplate local:InscrPage}" Route="InscrPage"/> - + + diff --git a/notus/notus_vue/ConnecPage.xaml b/notus/notus_vue/ConnecPage.xaml index 9689c47..2986e66 100644 --- a/notus/notus_vue/ConnecPage.xaml +++ b/notus/notus_vue/ConnecPage.xaml @@ -18,6 +18,7 @@ + @@ -35,40 +36,41 @@ Text="Connection" TextColor="#74fabd" FontSize="80" - FontFamily="strong"/> + FontFamily="strong" + /> + BackgroundColor="#4A4A4A" + /> + BackgroundColor="#4A4A4A" + />