using Humanizer; namespace MycroForge.CLI.CodeGen; public partial class EntityLinker { private readonly ProjectContext _context; private readonly string _left; private readonly string _right; public EntityLinker(ProjectContext context, string left, string right) { _context = context; _left = left; _right = right; } public async Task OneToOne() { var left = await LoadEntity(_left); var right = await LoadEntity(_right); left.AppendColumn( $"\t{right.FieldName}: Mapped[\"{right.ClassName}\"] = relationship(back_populates=\"{left.FieldName}\")" ); right.AppendColumns([ $"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))", $"\t{left.FieldName}: Mapped[\"{left.ClassName}\"] = relationship(back_populates=\"{right.FieldName}\")" ]); await _context.WriteFile(left.Path, left.Rewrite()); await _context.WriteFile(right.Path, right.Rewrite()); } public async Task OneToMany() { var left = await LoadEntity(_left); var right = await LoadEntity(_right); left.Import(from: "typing", import: "List"); left.AppendColumn($"\t{right.FieldName.Pluralize()}: Mapped[List[\"{right.ClassName}\"]] = relationship()"); right.AppendColumns([ $"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))", $"\t{left.FieldName}: Mapped[\"{left.ClassName}\"] = relationship(back_populates=\"{right.FieldName}\")" ]); await _context.WriteFile(left.Path, left.Rewrite()); await _context.WriteFile(right.Path, right.Rewrite()); } public async Task ManyToOne() { var left = await LoadEntity(_left); var right = await LoadEntity(_right); left.Import(from: "typing", import: "Optional"); left.AppendColumns([ $"\t{right.FieldName}_id: Mapped[Optional[int]] = mapped_column(ForeignKey(\"{right.TableName}.id\"))", $"\t{right.FieldName}: Mapped[\"{right.ClassName}\"] = relationship(back_populates=\"{left.FieldName.Pluralize()}\")" ]); left.Import(from: "typing", import: "List"); right.AppendColumns([ $"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))", $"\t{left.FieldName.Pluralize()}: Mapped[List[\"{left.ClassName}\"]] = relationship(back_populates=\"{right.FieldName}\")" ]); await _context.WriteFile(left.Path, left.Rewrite()); await _context.WriteFile(right.Path, right.Rewrite()); } public async Task ManyToMany() { // var left = await LoadEntity(_left); // var right = await LoadEntity(_right); // // left.AppendImportIfNotExists( // $"orm.entities.{right.FieldName}", // $"{right.ClassName}", // $"from orm.entities.{right.FieldName} import {right.ClassName}" // ); // left.AppendImportIfNotExists( // "typing", // "Optional", // "from typing import Optional" // ); // left.AppendColumn([ // $"\t{right.FieldName}_id: Mapped[Optional[int]] = mapped_column(ForeignKey(\"{right.TableName}.id\"))", // $"\t{right.FieldName}: Mapped[\"{right.ClassName}\"] = relationship(back_populates=\"{left.FieldName.Pluralize()}\")\n" // ]); // // right.AppendImportIfNotExists( // $"orm.entities.{left.FieldName}", // $"{left.ClassName}", // $"from orm.entities.{left.FieldName} import {left.ClassName}" // ); // left.AppendImportIfNotExists( // "typing", // "List", // "from typing import List" // ); // right.AppendColumn([ // $"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))", // $"\t{left.FieldName.Pluralize()}: Mapped[List[\"{left.ClassName}\"]] = relationship(back_populates=\"{right.FieldName}\")\n" // ]); // // await _context.WriteFile(left.Path, left.Rewrite()); // await _context.WriteFile(right.Path, right.Rewrite()); } private async Task LoadEntity(string name) { var path = GetEntityPath(name); var entity = new EntityModel(name, path, await _context.ReadFile(path)); entity.Initialize(); return entity; } private string GetEntityPath(string name) => $"orm/entities/{name.Underscore().ToLower()}.py"; }