@flusys/nestjs-auth 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/cjs/config-index.js +1 -0
  2. package/cjs/controllers-index.js +86 -0
  3. package/cjs/docs-index.js +103 -0
  4. package/cjs/dtos-index.js +1 -0
  5. package/cjs/entities-index.js +1 -0
  6. package/cjs/enums-index.js +1 -0
  7. package/cjs/index.js +188 -0
  8. package/cjs/interceptors-index.js +1 -0
  9. package/cjs/interfaces-index.js +1 -0
  10. package/cjs/modules-index.js +86 -0
  11. package/cjs/services-index.js +16 -0
  12. package/config/auth.constants.d.ts +2 -0
  13. package/config/index.d.ts +1 -0
  14. package/controllers/authentication.controller.d.ts +22 -0
  15. package/controllers/branch.controller.d.ts +17 -0
  16. package/controllers/company-selection.controller.d.ts +14 -0
  17. package/controllers/company.controller.d.ts +17 -0
  18. package/controllers/index.d.ts +6 -0
  19. package/controllers/user-permission.controller.d.ts +16 -0
  20. package/controllers/user.controller.d.ts +31 -0
  21. package/docs/auth-swagger.config.d.ts +3 -0
  22. package/docs/index.d.ts +1 -0
  23. package/dtos/authentication.dto.d.ts +92 -0
  24. package/dtos/company-branch.dto.d.ts +24 -0
  25. package/dtos/company.dto.d.ts +24 -0
  26. package/dtos/index.d.ts +6 -0
  27. package/dtos/user-company-permission.dto.d.ts +10 -0
  28. package/dtos/user-permission.dto.d.ts +33 -0
  29. package/dtos/user.dto.d.ts +40 -0
  30. package/entities/company-branch.entity.d.ts +19 -0
  31. package/entities/company.entity.d.ts +17 -0
  32. package/entities/index.d.ts +12 -0
  33. package/entities/user-company-permission.entity.d.ts +20 -0
  34. package/entities/user.entity.d.ts +3 -0
  35. package/enums/index.d.ts +1 -0
  36. package/enums/user-org-permission-type.enum.d.ts +4 -0
  37. package/fesm/config-index.js +1 -0
  38. package/fesm/controllers-index.js +86 -0
  39. package/fesm/docs-index.js +103 -0
  40. package/fesm/dtos-index.js +1 -0
  41. package/fesm/entities-index.js +1 -0
  42. package/fesm/enums-index.js +1 -0
  43. package/fesm/index.js +188 -0
  44. package/fesm/interceptors-index.js +1 -0
  45. package/fesm/interfaces-index.js +0 -0
  46. package/fesm/modules-index.js +86 -0
  47. package/fesm/services-index.js +16 -0
  48. package/index.d.ts +11 -0
  49. package/interceptors/clear-token.interceptor.d.ts +10 -0
  50. package/interceptors/index.d.ts +2 -0
  51. package/interceptors/set-token.interceptor.d.ts +11 -0
  52. package/interfaces/auth-module-options.interface.d.ts +24 -0
  53. package/interfaces/authentication.interface.d.ts +53 -0
  54. package/interfaces/company-branch.interface.d.ts +25 -0
  55. package/interfaces/company.interface.d.ts +21 -0
  56. package/interfaces/index.d.ts +5 -0
  57. package/interfaces/user.interface.d.ts +21 -0
  58. package/modules/auth.module.d.ts +10 -0
  59. package/modules/index.d.ts +1 -0
  60. package/package.json +92 -0
  61. package/services/auth-config.service.d.ts +20 -0
  62. package/services/auth-datasource.provider.d.ts +25 -0
  63. package/services/authentication.service.d.ts +50 -0
  64. package/services/branch.service.d.ts +33 -0
  65. package/services/company-selection-session.service.d.ts +17 -0
  66. package/services/company.service.d.ts +27 -0
  67. package/services/index.d.ts +8 -0
  68. package/services/user-permission.service.d.ts +14 -0
  69. package/services/user.service.d.ts +39 -0
  70. package/strategies/jwt.strategy.d.ts +13 -0
@@ -0,0 +1,16 @@
1
+ "use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf;var __hasOwnProp=Object.prototype.hasOwnProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:true,configurable:true,writable:true,value}):obj[key]=value;var __name=(target,value)=>__defProp(target,"name",{value,configurable:true});var __esm=(fn,res)=>function __init(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:true}):target,mod));var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var __decorateClass=(decorators,target,key,kind)=>{var result=kind>1?void 0:kind?__getOwnPropDesc(target,key):target;for(var i=decorators.length-1,decorator;i>=0;i--)if(decorator=decorators[i])result=(kind?decorator(target,key,result):decorator(result))||result;if(kind&&result)__defProp(target,key,result);return result};var __decorateParam=(index,decorator)=>(target,key)=>decorator(target,key,index);var __publicField=(obj,key,value)=>__defNormalProp(obj,typeof key!=="symbol"?key+"":key,value);var PermissionType;var init_user_org_permission_type_enum=__esm({"projects/nestjs-auth/src/enums/user-org-permission-type.enum.ts"(){"use strict";PermissionType=(PermissionType2=>{PermissionType2["COMPANY"]="company";PermissionType2["BRANCH"]="branch";return PermissionType2})(PermissionType||{})}});var init_enums=__esm({"projects/nestjs-auth/src/enums/index.ts"(){"use strict";init_user_org_permission_type_enum()}});var import_nestjs_shared,import_typeorm,Company;var init_company_entity=__esm({"projects/nestjs-auth/src/entities/company.entity.ts"(){"use strict";import_nestjs_shared=require("@flusys/nestjs-shared");import_typeorm=require("typeorm");init_company_branch_entity();Company=class extends import_nestjs_shared.Identity{readOnly;name;slug;logoId;address;phone;email;website;serial;isActive;settings;additionalFields;branches};__name(Company,"Company");__decorateClass([(0,import_typeorm.Column)({type:"boolean",nullable:false,default:false,name:"read_only"})],Company.prototype,"readOnly",2);__decorateClass([(0,import_typeorm.Column)({type:"varchar",length:255,nullable:false,unique:true})],Company.prototype,"name",2);__decorateClass([(0,import_typeorm.Column)({type:"varchar",length:255,nullable:false,unique:true})],Company.prototype,"slug",2);__decorateClass([(0,import_typeorm.Column)({name:"logo_id",type:"char",length:36,nullable:true})],Company.prototype,"logoId",2);__decorateClass([(0,import_typeorm.Column)({type:"text",nullable:true})],Company.prototype,"address",2);__decorateClass([(0,import_typeorm.Column)({type:"varchar",length:50,nullable:true})],Company.prototype,"phone",2);__decorateClass([(0,import_typeorm.Column)({type:"varchar",length:255,nullable:true})],Company.prototype,"email",2);__decorateClass([(0,import_typeorm.Column)({type:"varchar",length:100,nullable:true})],Company.prototype,"website",2);__decorateClass([(0,import_typeorm.Column)({type:"int",nullable:true})],Company.prototype,"serial",2);__decorateClass([(0,import_typeorm.Column)({type:"boolean",nullable:false,default:true,name:"is_active"})],Company.prototype,"isActive",2);__decorateClass([(0,import_typeorm.Column)({type:"json",nullable:true})],Company.prototype,"settings",2);__decorateClass([(0,import_typeorm.Column)({type:"json",nullable:true})],Company.prototype,"additionalFields",2);__decorateClass([(0,import_typeorm.OneToMany)(()=>CompanyBranch,branch=>branch.company)],Company.prototype,"branches",2);Company=__decorateClass([(0,import_typeorm.Entity)({name:"company"})],Company)}});var import_nestjs_shared2,import_typeorm2,CompanyBranch;var init_company_branch_entity=__esm({"projects/nestjs-auth/src/entities/company-branch.entity.ts"(){"use strict";import_nestjs_shared2=require("@flusys/nestjs-shared");import_typeorm2=require("typeorm");init_company_entity();CompanyBranch=class extends import_nestjs_shared2.Identity{readOnly;name;slug;logoId;address;phone;email;serial;isActive;additionalFields;parentId;parent;children;companyId;company};__name(CompanyBranch,"CompanyBranch");__decorateClass([(0,import_typeorm2.Column)({type:"boolean",default:false,name:"read_only"})],CompanyBranch.prototype,"readOnly",2);__decorateClass([(0,import_typeorm2.Column)({type:"varchar",length:255})],CompanyBranch.prototype,"name",2);__decorateClass([(0,import_typeorm2.Column)({type:"varchar",length:255})],CompanyBranch.prototype,"slug",2);__decorateClass([(0,import_typeorm2.Column)({name:"logo_id",type:"char",length:36,nullable:true})],CompanyBranch.prototype,"logoId",2);__decorateClass([(0,import_typeorm2.Column)({type:"text",nullable:true})],CompanyBranch.prototype,"address",2);__decorateClass([(0,import_typeorm2.Column)({type:"varchar",length:50,nullable:true})],CompanyBranch.prototype,"phone",2);__decorateClass([(0,import_typeorm2.Column)({type:"varchar",length:255,nullable:true})],CompanyBranch.prototype,"email",2);__decorateClass([(0,import_typeorm2.Column)({type:"int",nullable:true})],CompanyBranch.prototype,"serial",2);__decorateClass([(0,import_typeorm2.Column)({type:"boolean",default:true,name:"is_active"})],CompanyBranch.prototype,"isActive",2);__decorateClass([(0,import_typeorm2.Column)({type:"json",nullable:true})],CompanyBranch.prototype,"additionalFields",2);__decorateClass([(0,import_typeorm2.Column)({name:"parent_id",type:"uuid",nullable:true})],CompanyBranch.prototype,"parentId",2);__decorateClass([(0,import_typeorm2.ManyToOne)(()=>CompanyBranch,branch=>branch.children,{nullable:true,onDelete:"CASCADE"}),(0,import_typeorm2.JoinColumn)({name:"parent_id"})],CompanyBranch.prototype,"parent",2);__decorateClass([(0,import_typeorm2.OneToMany)(()=>CompanyBranch,branch=>branch.parent)],CompanyBranch.prototype,"children",2);__decorateClass([(0,import_typeorm2.Column)({name:"company_id",type:"uuid",nullable:true})],CompanyBranch.prototype,"companyId",2);__decorateClass([(0,import_typeorm2.ManyToOne)(()=>Company,company=>company.branches,{onDelete:"CASCADE"}),(0,import_typeorm2.JoinColumn)({name:"company_id"})],CompanyBranch.prototype,"company",2);CompanyBranch=__decorateClass([(0,import_typeorm2.Entity)({name:"company_branch"}),(0,import_typeorm2.Unique)(["company","slug"])],CompanyBranch)}});var import_nestjs_shared3,import_typeorm3,User;var init_user_entity=__esm({"projects/nestjs-auth/src/entities/user.entity.ts"(){"use strict";import_nestjs_shared3=require("@flusys/nestjs-shared");import_typeorm3=require("typeorm");User=class extends import_nestjs_shared3.UserRoot{};__name(User,"User");User=__decorateClass([(0,import_typeorm3.Entity)({name:"user"})],User)}});var import_typeorm4,UserCompanyPermission;var init_user_company_permission_entity=__esm({"projects/nestjs-auth/src/entities/user-company-permission.entity.ts"(){"use strict";import_typeorm4=require("typeorm");init_enums();init_company_branch_entity();init_company_entity();init_user_entity();UserCompanyPermission=class{id;userId;user;permissionType;targetId;metadata;isActive;company;branch;createdAt;updatedAt;isCompanyPermission(){return this.permissionType==="company"}isBranchPermission(){return this.permissionType==="branch"}};__name(UserCompanyPermission,"UserCompanyPermission");__decorateClass([(0,import_typeorm4.PrimaryGeneratedColumn)("uuid")],UserCompanyPermission.prototype,"id",2);__decorateClass([(0,import_typeorm4.Column)({type:"uuid",name:"user_id"})],UserCompanyPermission.prototype,"userId",2);__decorateClass([(0,import_typeorm4.ManyToOne)(()=>User,{onDelete:"CASCADE"}),(0,import_typeorm4.JoinColumn)({name:"user_id"})],UserCompanyPermission.prototype,"user",2);__decorateClass([(0,import_typeorm4.Column)({type:"enum",enum:PermissionType,name:"permission_type"})],UserCompanyPermission.prototype,"permissionType",2);__decorateClass([(0,import_typeorm4.Column)({type:"uuid",name:"target_id"})],UserCompanyPermission.prototype,"targetId",2);__decorateClass([(0,import_typeorm4.Column)({type:"json",nullable:true})],UserCompanyPermission.prototype,"metadata",2);__decorateClass([(0,import_typeorm4.Column)({type:"boolean",nullable:false,default:true,name:"is_active"})],UserCompanyPermission.prototype,"isActive",2);__decorateClass([(0,import_typeorm4.ManyToOne)(()=>Company,{nullable:true,createForeignKeyConstraints:false}),(0,import_typeorm4.JoinColumn)({name:"target_id"})],UserCompanyPermission.prototype,"company",2);__decorateClass([(0,import_typeorm4.ManyToOne)(()=>CompanyBranch,{nullable:true,createForeignKeyConstraints:false}),(0,import_typeorm4.JoinColumn)({name:"target_id"})],UserCompanyPermission.prototype,"branch",2);__decorateClass([(0,import_typeorm4.CreateDateColumn)({name:"created_at"})],UserCompanyPermission.prototype,"createdAt",2);__decorateClass([(0,import_typeorm4.UpdateDateColumn)({name:"updated_at"})],UserCompanyPermission.prototype,"updatedAt",2);UserCompanyPermission=__decorateClass([(0,import_typeorm4.Entity)("user_company_permissions"),(0,import_typeorm4.Index)(["userId","permissionType","targetId"],{unique:true}),(0,import_typeorm4.Index)(["userId","permissionType"]),(0,import_typeorm4.Index)(["permissionType","targetId"])],UserCompanyPermission)}});var entities_exports={};__export(entities_exports,{AllEntities:()=>AllEntities,Company:()=>Company,CompanyBranch:()=>CompanyBranch,CompanyEntities:()=>CompanyEntities,CoreEntities:()=>CoreEntities,PermissionType:()=>PermissionType,User:()=>User,UserCompanyPermission:()=>UserCompanyPermission,getEntitiesByConfig:()=>getEntitiesByConfig});function getEntitiesByConfig(enableCompanyFeature){return enableCompanyFeature?AllEntities:CoreEntities}var CoreEntities,CompanyEntities,AllEntities;var init_entities=__esm({"projects/nestjs-auth/src/entities/index.ts"(){"use strict";init_company_branch_entity();init_company_entity();init_user_company_permission_entity();init_user_entity();init_company_branch_entity();init_company_entity();init_user_company_permission_entity();init_user_entity();CoreEntities=[User];CompanyEntities=[Company,CompanyBranch,UserCompanyPermission];AllEntities=[...CoreEntities,...CompanyEntities];__name(getEntitiesByConfig,"getEntitiesByConfig")}});var index_exports={};__export(index_exports,{AuthConfigService:()=>AuthConfigService,AuthDataSourceProvider:()=>AuthDataSourceProvider,AuthenticationService:()=>AuthenticationService,BranchService:()=>BranchService,CompanySelectionSessionService:()=>CompanySelectionSessionService,CompanyService:()=>CompanyService,UserPermissionService:()=>UserPermissionService,UserService:()=>UserService});module.exports=__toCommonJS(index_exports);var import_common=require("@nestjs/common");var import_typeorm5=require("@nestjs/typeorm");var bcrypt=__toESM(require("bcrypt"));var import_utils=require("@flusys/nestjs-shared/utils");init_enums();init_company_branch_entity();init_company_entity();init_user_company_permission_entity();init_user_entity();var BCRYPT_SALT_ROUNDS=12;var AuthenticationService=class{constructor(jwtService,authConfig,dataSourceProvider,sessionService,injectedUserRepository,injectedPermissionRepository,injectedCompanyRepository,injectedBranchRepository){this.jwtService=jwtService;this.authConfig=authConfig;this.dataSourceProvider=dataSourceProvider;this.sessionService=sessionService;this.injectedUserRepository=injectedUserRepository;this.injectedPermissionRepository=injectedPermissionRepository;this.injectedCompanyRepository=injectedCompanyRepository;this.injectedBranchRepository=injectedBranchRepository}logger=new import_common.Logger(AuthenticationService.name);async getUserRepository(){if(this.dataSourceProvider){return this.dataSourceProvider.getRepository(User)}if(this.injectedUserRepository){return this.injectedUserRepository}throw new Error("User repository not available")}async getPermissionRepository(){if(!this.authConfig.isCompanyFeatureEnabled())return null;if(this.dataSourceProvider){return this.dataSourceProvider.getRepository(UserCompanyPermission)}return this.injectedPermissionRepository??null}async getCompanyRepository(){if(!this.authConfig.isCompanyFeatureEnabled())return null;if(this.dataSourceProvider){return this.dataSourceProvider.getRepository(Company)}return this.injectedCompanyRepository??null}async getBranchRepository(){if(!this.authConfig.isCompanyFeatureEnabled())return null;if(this.dataSourceProvider){return this.dataSourceProvider.getRepository(CompanyBranch)}return this.injectedBranchRepository??null}async login(email,password){const user=await this.validateUser(email,password);if(!user.isActive){throw new import_common.UnauthorizedException("User account is deactivated")}if(!this.authConfig.isCompanyFeatureEnabled()){return this.generateLoginResponse(user)}return this.handleCompanyBasedLogin(user)}async handleCompanyBasedLogin(user){const permissionRepository=await this.getPermissionRepository();const branchRepository=await this.getBranchRepository();if(!permissionRepository||!branchRepository){return this.generateLoginResponse(user)}const companyPermissions=await permissionRepository.find({where:{userId:user.id,permissionType:"company"}});const companyRepository=await this.getCompanyRepository();if(!companyRepository){return this.generateLoginResponse(user)}const companyIds=companyPermissions.map(p=>p.targetId);const companies=companyIds.length>0?await companyRepository.createQueryBuilder("c").where("c.id IN (:...ids)",{ids:companyIds}).andWhere("c.is_active = :active",{active:true}).getMany():[];if(companies.length===0){return this.generateLoginResponse(user,true)}const branchPermissions=await permissionRepository.find({where:{userId:user.id,permissionType:"branch"}});const branchIds=branchPermissions.map(p=>p.targetId);const branches=branchIds.length>0?await branchRepository.createQueryBuilder("b").leftJoinAndSelect("b.company","company").where("b.id IN (:...ids)",{ids:branchIds}).andWhere("b.is_active = :active",{active:true}).getMany():[];if(companies.length===1&&branches.length===1){return this.generateLoginResponseWithCompany(user,companies[0],branches[0])}return await this.generateCompanySelectionResponse(user,companies,branches)}async register(dto){const userRepository=await this.getUserRepository();const existingUser=await userRepository.findOne({where:{email:dto.email}});if(existingUser){throw new import_common.BadRequestException("Registration failed. Please try again or contact support.")}const hashedPassword=await bcrypt.hash(dto.password,BCRYPT_SALT_ROUNDS);const user=userRepository.create({name:dto.name,email:dto.email,phone:dto.phone,password:hashedPassword,isActive:true,emailVerified:false,phoneVerified:false});await userRepository.save(user);if(!this.authConfig.isCompanyFeatureEnabled()){return this.generateLoginResponse(user,false)}return this.handleCompanyRegistration(user,dto)}async handleCompanyRegistration(user,dto){const companyRepository=await this.getCompanyRepository();const branchRepository=await this.getBranchRepository();const permissionRepository=await this.getPermissionRepository();if(!companyRepository||!branchRepository||!permissionRepository){return this.generateLoginResponse(user,true)}let company=null;let branch=null;if(dto.companySlug){company=await companyRepository.findOne({where:{slug:dto.companySlug,isActive:true}});if(!company){throw new import_common.BadRequestException("Company not found or inactive")}if(dto.branchSlug){branch=await branchRepository.findOne({where:{slug:dto.branchSlug,companyId:company.id,isActive:true}});if(!branch){throw new import_common.BadRequestException("Branch not found or inactive")}}else{branch=await branchRepository.findOne({where:{companyId:company.id,isActive:true},order:{serial:"ASC",createdAt:"ASC"}})}}else if(dto.newCompanyName){const slug=this.generateSlug(dto.newCompanyName);const existingCompany=await companyRepository.findOne({where:{slug}});if(existingCompany){throw new import_common.BadRequestException("Company creation failed. Please try a different name.")}company=companyRepository.create({name:dto.newCompanyName,slug,phone:dto.newCompanyPhone,address:dto.newCompanyAddress,isActive:true});await companyRepository.save(company);branch=branchRepository.create({name:"Main Branch",slug:"main-branch",companyId:company.id,isActive:true});await branchRepository.save(branch)}if(company){const companyPermission=permissionRepository.create({userId:user.id,permissionType:"company",targetId:company.id});await permissionRepository.save(companyPermission);if(branch){const branchPermission=permissionRepository.create({userId:user.id,permissionType:"branch",targetId:branch.id});await permissionRepository.save(branchPermission)}return this.generateLoginResponseWithCompany(user,company,branch??void 0)}return this.generateLoginResponse(user,true)}generateSlug(name){return name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").substring(0,100)}async select(sessionId,companyId,branchId){this.ensureCompanyFeatureEnabled();if(!this.sessionService){throw new import_common.BadRequestException("Session service not available")}const session=await this.sessionService.consumeSession(sessionId);if(!session){throw new import_common.UnauthorizedException("Invalid or expired session")}const userRepository=await this.getUserRepository();const user=await userRepository.findOne({where:{id:session.userId}});if(!user){throw new import_common.NotFoundException("User not found")}const permissionRepository=await this.getPermissionRepository();const companyRepository=await this.getCompanyRepository();const branchRepository=await this.getBranchRepository();if(!permissionRepository||!companyRepository||!branchRepository){throw new import_common.BadRequestException("Repositories not available")}const companyPermission=await permissionRepository.findOne({where:{userId:user.id,permissionType:"company",targetId:companyId}});if(!companyPermission){throw new import_common.UnauthorizedException("No access to this company")}const company=await companyRepository.findOne({where:{id:companyId,isActive:true}});if(!company){throw new import_common.UnauthorizedException("Company not found or inactive")}const branchPermission=await permissionRepository.findOne({where:{userId:user.id,permissionType:"branch",targetId:branchId}});if(!branchPermission){throw new import_common.UnauthorizedException("No access to this branch")}const branch=await branchRepository.findOne({where:{id:branchId,companyId,isActive:true}});if(!branch){throw new import_common.UnauthorizedException("Branch not found or inactive")}return this.generateLoginResponseWithCompany(user,company,branch)}async switchCompany(userId,companyId,branchId){this.ensureCompanyFeatureEnabled();const userRepository=await this.getUserRepository();const user=await userRepository.findOne({where:{id:userId}});if(!user){throw new import_common.NotFoundException("User not found")}const permissionRepository=await this.getPermissionRepository();const companyRepository=await this.getCompanyRepository();const branchRepository=await this.getBranchRepository();if(!permissionRepository||!companyRepository||!branchRepository){throw new import_common.BadRequestException("Repositories not available")}const companyPermission=await permissionRepository.findOne({where:{userId,permissionType:"company",targetId:companyId}});if(!companyPermission){throw new import_common.UnauthorizedException("No access to this company")}const company=await companyRepository.findOne({where:{id:companyId,isActive:true}});if(!company){throw new import_common.UnauthorizedException("Company not found or inactive")}const branchPermission=await permissionRepository.findOne({where:{userId,permissionType:"branch",targetId:branchId}});if(!branchPermission){throw new import_common.UnauthorizedException("No access to this branch")}const branch=await branchRepository.findOne({where:{id:branchId,companyId,isActive:true}});if(!branch){throw new import_common.UnauthorizedException("Branch not found or inactive")}return this.generateLoginResponseWithCompany(user,company,branch)}async refreshToken(refreshToken){try{const payload=this.jwtService.verify(refreshToken,{secret:this.authConfig.getRefreshTokenSecret()});const userRepository=await this.getUserRepository();const user=await userRepository.findOne({where:{id:payload.id}});if(!user||!user.isActive){throw new import_common.UnauthorizedException("Invalid refresh token")}const accessPayload={id:user.id,email:user.email,type:"access",profilePictureId:user.profilePictureId??void 0,...payload.companyId&&{companyId:payload.companyId},...payload.branchId&&{branchId:payload.branchId},...payload.companyLogoId&&{companyLogoId:payload.companyLogoId},...payload.branchLogoId&&{branchLogoId:payload.branchLogoId}};const refreshPayload={id:user.id,email:user.email,type:"refresh",profilePictureId:user.profilePictureId??void 0,...payload.companyId&&{companyId:payload.companyId},...payload.branchId&&{branchId:payload.branchId},...payload.companyLogoId&&{companyLogoId:payload.companyLogoId},...payload.branchLogoId&&{branchLogoId:payload.branchLogoId}};return{accessToken:this.jwtService.sign(accessPayload,{secret:this.authConfig.getJwtSecret(),expiresIn:this.authConfig.getJwtExpiration()}),refreshToken:this.jwtService.sign(refreshPayload,{secret:this.authConfig.getRefreshTokenSecret(),expiresIn:this.authConfig.getRefreshTokenExpiration()})}}catch(error){import_utils.ErrorHandler.logError(this.logger,error,"refreshToken");throw new import_common.UnauthorizedException("Invalid or expired refresh token")}}async changePassword(userId,currentPassword,newPassword){const userRepository=await this.getUserRepository();const user=await userRepository.findOne({where:{id:userId}});if(!user){throw new import_common.UnauthorizedException("User not found")}const isPasswordValid=await bcrypt.compare(currentPassword,user.password||"");if(!isPasswordValid){throw new import_common.UnauthorizedException("Current password is incorrect")}user.password=await bcrypt.hash(newPassword,BCRYPT_SALT_ROUNDS);await userRepository.save(user)}async logout(_userId){}async getUserCompanies(userId){this.ensureCompanyFeatureEnabled();const permissionRepository=await this.getPermissionRepository();const companyRepository=await this.getCompanyRepository();if(!permissionRepository||!companyRepository){throw new import_common.BadRequestException("Repositories not available")}const permissions=await permissionRepository.find({where:{userId,permissionType:"company"}});const companyIds=permissions.map(p=>p.targetId);if(companyIds.length===0)return[];return companyRepository.createQueryBuilder("c").where("c.id IN (:...ids)",{ids:companyIds}).andWhere("c.is_active = :active",{active:true}).orderBy("c.name","ASC").getMany()}async getUserBranches(userId,companyId){this.ensureCompanyFeatureEnabled();const permissionRepository=await this.getPermissionRepository();const branchRepository=await this.getBranchRepository();if(!permissionRepository||!branchRepository){throw new import_common.BadRequestException("Repositories not available")}const companyPermission=await permissionRepository.findOne({where:{userId,permissionType:"company",targetId:companyId}});if(!companyPermission){throw new import_common.UnauthorizedException("No access to this company")}const branchPermissions=await permissionRepository.find({where:{userId,permissionType:"branch"}});const branchIds=branchPermissions.map(p=>p.targetId);if(branchIds.length===0)return[];return branchRepository.createQueryBuilder("b").where("b.id IN (:...ids)",{ids:branchIds}).andWhere("b.company_id = :companyId",{companyId}).andWhere("b.is_active = :active",{active:true}).orderBy("b.serial","ASC").addOrderBy("b.name","ASC").getMany()}async getCompanyById(companyId){const companyRepository=await this.getCompanyRepository();if(!companyRepository){return null}return companyRepository.findOne({where:{id:companyId}})}async getBranchById(branchId){const branchRepository=await this.getBranchRepository();if(!branchRepository){return null}return branchRepository.findOne({where:{id:branchId}})}async getUserInfo(userId,companyId,branchId){const userRepository=await this.getUserRepository();const user=await userRepository.findOne({where:{id:userId}});if(!user){throw new import_common.UnauthorizedException("User not found")}const response={user:{id:user.id,email:user.email,name:user.name??void 0,profilePictureId:user.profilePictureId??void 0}};if(this.authConfig.isCompanyFeatureEnabled()){if(!companyId){throw new import_common.UnauthorizedException("Company feature is enabled but user has no company assigned. Please select a company.")}const company=await this.getCompanyById(companyId);if(!company){throw new import_common.UnauthorizedException(`Company with ID ${companyId} not found. Please select a valid company.`)}response.company={id:company.id,name:company.name,slug:company.slug,logoId:company.logoId??null};if(branchId){const branch=await this.getBranchById(branchId);if(!branch){throw new import_common.UnauthorizedException(`Branch with ID ${branchId} not found. Please select a valid branch.`)}response.branch={id:branch.id,name:branch.name,slug:branch.slug,logoId:branch.logoId??null}}}return response}ensureCompanyFeatureEnabled(){if(!this.authConfig.isCompanyFeatureEnabled()){throw new import_common.BadRequestException("Company feature is not enabled")}}async validateUser(email,password){const userRepository=await this.getUserRepository();const user=await userRepository.findOne({where:{email}});if(!user){throw new import_common.UnauthorizedException("Invalid credentials")}const isPasswordValid=await bcrypt.compare(password,user.password||"");if(!isPasswordValid){throw new import_common.UnauthorizedException("Invalid credentials")}user.lastLoginAt=new Date;await userRepository.save(user);return user}generateLoginResponse(user,companyFeatureEnabled=false){const payload={id:user.id,email:user.email,type:"access"};const accessToken=this.jwtService.sign(payload,{secret:this.authConfig.getJwtSecret(),expiresIn:this.authConfig.getJwtExpiration()});const refreshPayload={id:user.id,email:user.email,type:"refresh"};const refreshToken=this.jwtService.sign(refreshPayload,{secret:this.authConfig.getRefreshTokenSecret(),expiresIn:this.authConfig.getRefreshTokenExpiration()});return{accessToken,refreshToken,user:{id:user.id,email:user.email,name:user.name??void 0,profilePictureId:user.profilePictureId??null},companyFeatureEnabled}}generateLoginResponseWithCompany(user,company,branch){const payload={id:user.id,email:user.email,type:"access",companyId:company.id,branchId:branch?.id};const accessToken=this.jwtService.sign(payload,{secret:this.authConfig.getJwtSecret(),expiresIn:this.authConfig.getJwtExpiration()});const refreshPayload={id:user.id,email:user.email,type:"refresh",companyId:company.id,branchId:branch?.id};const refreshToken=this.jwtService.sign(refreshPayload,{secret:this.authConfig.getRefreshTokenSecret(),expiresIn:this.authConfig.getRefreshTokenExpiration()});return{accessToken,refreshToken,user:{id:user.id,email:user.email,name:user.name??void 0,profilePictureId:user.profilePictureId??null},company:{id:company.id,name:company.name,slug:company.slug,logoId:company.logoId??null},branch:branch?{id:branch.id,name:branch.name,slug:branch.slug,logoId:branch.logoId??null}:void 0,companyFeatureEnabled:true}}async generateCompanySelectionResponse(user,companies,branches){if(!this.sessionService){throw new import_common.BadRequestException("Session service not available")}const sessionId=await this.sessionService.createSession(user.id);const companiesWithBranches=companies.map(company=>({id:company.id,name:company.name,slug:company.slug,isActive:company.isActive,logoId:company.logoId??null,branches:branches.filter(b=>b.companyId===company.id).map(b=>({id:b.id,name:b.name,slug:b.slug,isActive:b.isActive,logoId:b.logoId??null}))}));return{requiresSelection:true,sessionId,expiresAt:new Date(Date.now()+5*60*1e3),user:{id:user.id,email:user.email,name:user.name??void 0,profilePictureId:user.profilePictureId??null},companies:companiesWithBranches}}};__name(AuthenticationService,"AuthenticationService");AuthenticationService=__decorateClass([(0,import_common.Injectable)({scope:import_common.Scope.REQUEST}),__decorateParam(2,(0,import_common.Optional)()),__decorateParam(3,(0,import_common.Optional)()),__decorateParam(4,(0,import_common.Optional)()),__decorateParam(4,(0,import_typeorm5.InjectRepository)(User)),__decorateParam(5,(0,import_common.Optional)()),__decorateParam(5,(0,import_typeorm5.InjectRepository)(UserCompanyPermission)),__decorateParam(6,(0,import_common.Optional)()),__decorateParam(6,(0,import_typeorm5.InjectRepository)(Company)),__decorateParam(7,(0,import_common.Optional)()),__decorateParam(7,(0,import_typeorm5.InjectRepository)(CompanyBranch))],AuthenticationService);var import_common2=require("@nestjs/common");var import_crypto=require("crypto");var AUTH_MODULE_OPTIONS="AUTH_MODULE_OPTIONS";var SESSION_CACHE_PREFIX="auth:session";var SESSION_TTL_MS=5*60*1e3;var CompanySelectionSessionService=class{constructor(cacheManager){this.cacheManager=cacheManager}async createSession(userId,companyId){const sessionId=(0,import_crypto.randomUUID)();const now=new Date;const expiresAt=new Date(now.getTime()+SESSION_TTL_MS);const session={sessionId,userId,createdAt:now,expiresAt};await this.cacheManager.set(this.getKey(sessionId),session,SESSION_TTL_MS);return sessionId}async getSession(sessionId){const session=await this.cacheManager.get(this.getKey(sessionId));if(!session)return null;if(new Date>new Date(session.expiresAt)){await this.deleteSession(sessionId);return null}return session}async consumeSession(sessionId){const session=await this.getSession(sessionId);if(session){await this.deleteSession(sessionId)}return session}async deleteSession(sessionId){await this.cacheManager.del(this.getKey(sessionId))}getKey(sessionId){return`${SESSION_CACHE_PREFIX}:${sessionId}`}};__name(CompanySelectionSessionService,"CompanySelectionSessionService");CompanySelectionSessionService=__decorateClass([(0,import_common2.Injectable)(),__decorateParam(0,(0,import_common2.Inject)("CACHE_INSTANCE"))],CompanySelectionSessionService);var import_classes=require("@flusys/nestjs-shared/classes");var import_utils2=require("@flusys/nestjs-shared/utils");var import_common3=require("@nestjs/common");var bcrypt2=__toESM(require("bcrypt"));init_enums();init_user_company_permission_entity();init_user_entity();var UserService=class extends import_classes.RequestScopedApiService{constructor(cacheManager,utilsService,dataSourceProvider,authConfig){super("user",null,cacheManager,utilsService,UserService.name,true);this.cacheManager=cacheManager;this.utilsService=utilsService;this.dataSourceProvider=dataSourceProvider;this.authConfig=authConfig}logger=new import_common3.Logger(UserService.name);permissionRepository;dataSource;resolveEntity(){return User}getDataSourceProvider(){return this.dataSourceProvider}async ensureRepositoryInitialized(){await super.ensureRepositoryInitialized();const isCompanyFeatureEnabled=this.authConfig.isCompanyFeatureEnabled();if(isCompanyFeatureEnabled&&!this.permissionRepository){[this.permissionRepository]=await this.initializeAdditionalRepositories([UserCompanyPermission])}if(!this.dataSource){this.dataSource=await this.getDataSourceForService()}}async updateLastLogin(id){await this.ensureRepositoryInitialized();await this.repository.update(id,{lastLoginAt:new Date});await this.clearCacheForId([{id}])}async verifyEmail(id){await this.ensureRepositoryInitialized();await this.repository.update(id,{emailVerified:true});await this.clearCacheForId([{id}])}async verifyPhone(id){await this.ensureRepositoryInitialized();await this.repository.update(id,{phoneVerified:true});await this.clearCacheForId([{id}])}async updateStatus(id,isActive,user){await this.ensureRepositoryInitialized();const isCompanyFeatureEnabled=this.authConfig.isCompanyFeatureEnabled();if(isCompanyFeatureEnabled&&user?.companyId&&this.permissionRepository){const permission=await this.permissionRepository.findOne({where:{userId:id,permissionType:"company",targetId:user.companyId}});if(!permission){throw new import_common3.NotFoundException("User company permission not found")}permission.isActive=isActive;await this.permissionRepository.save(permission)}else{await this.repository.update(id,{isActive})}await this.clearCacheForId([{id}])}async convertSingleDtoToEntity(dto,user){const entity=await super.convertSingleDtoToEntity(dto,user);if(dto.password){entity.password=await bcrypt2.hash(dto.password,10)}return entity}convertEntityToResponseDto(entity,isRaw){const isActive=isRaw&&entity.user_companyIsActive!==void 0?Boolean(entity.user_companyIsActive):entity.isActive;return{id:isRaw?entity.user_id:entity.id,name:isRaw?entity.user_name:entity.name,phone:isRaw?entity.user_phone:entity.phone,email:isRaw?entity.user_email:entity.email,profilePictureId:isRaw?entity.user_profilePictureId:entity.profilePictureId,isActive,emailVerified:isRaw?entity.user_emailVerified:entity.emailVerified,phoneVerified:isRaw?entity.user_phoneVerified:entity.phoneVerified,lastLoginAt:isRaw?entity.user_lastLoginAt:entity.lastLoginAt,additionalFields:isRaw?entity.user_additionalFields:entity.additionalFields,createdAt:isRaw?entity.user_createdAt:entity.createdAt,updatedAt:isRaw?entity.user_updatedAt:entity.updatedAt,deletedAt:isRaw?entity.user_deletedAt:entity.deletedAt,createdById:isRaw?entity.user_createdById:entity.createdById,updatedById:isRaw?entity.user_updatedById:entity.updatedById,deletedById:isRaw?entity.user_deletedById:entity.deletedById}}async getGlobalSearchQuery(query,search,_user){query.andWhere("(user.name LIKE :search OR user.email LIKE :search OR user.phone LIKE :search)",{search:`%${search}%`});return{query,isRaw:false}}async getExtraManipulateQuery(query,filterAndPaginationDto,user){const result=await super.getExtraManipulateQuery(query,filterAndPaginationDto,user);const isCompanyFeatureEnabled=this.authConfig.isCompanyFeatureEnabled();if(!isCompanyFeatureEnabled){return result}if(user?.companyId&&this.permissionRepository){query.addSelect(`(SELECT perm.is_active FROM user_company_permissions perm
2
+ WHERE perm.user_id = user.id
3
+ AND perm.permission_type = :permissionType
4
+ AND perm.target_id = :companyId
5
+ LIMIT 1)`,"user_companyIsActive");query.setParameter("permissionType","company");query.setParameter("companyId",user.companyId);if(filterAndPaginationDto.filter?.isActive!==void 0){query.andWhere(`EXISTS (
6
+ SELECT 1 FROM user_company_permissions perm
7
+ WHERE perm.user_id = user.id
8
+ AND perm.permission_type = :permissionType
9
+ AND perm.target_id = :companyId
10
+ AND perm.is_active = :isActiveValue
11
+ )`,{permissionType:"company",companyId:user.companyId,isActiveValue:filterAndPaginationDto.filter.isActive})}query.andWhere(`EXISTS (
12
+ SELECT 1 FROM user_company_permissions perm
13
+ WHERE perm.user_id = user.id
14
+ AND perm.permission_type = :permissionType
15
+ AND perm.target_id = :companyId
16
+ )`,{permissionType:"company",companyId:user.companyId});return{query,isRaw:true}}return result}async insert(dto,user){const isCompanyFeatureEnabled=this.authConfig.isCompanyFeatureEnabled();if(!isCompanyFeatureEnabled||!this.dataSource||!user?.companyId||!this.permissionRepository){return super.insert(dto,user)}const queryRunner=this.dataSource.createQueryRunner();await queryRunner.connect();await queryRunner.startTransaction();try{const userEntity=await this.convertSingleDtoToEntity(dto,user);const savedUser=await queryRunner.manager.save(this.repository.target,userEntity);const existingPermission=await queryRunner.manager.findOne(this.permissionRepository.target,{where:{userId:savedUser.id,permissionType:"company",targetId:user.companyId}});if(!existingPermission){const permission=queryRunner.manager.create(this.permissionRepository.target,{userId:savedUser.id,permissionType:"company",targetId:user.companyId,isActive:dto.isActive??true});await queryRunner.manager.save(this.permissionRepository.target,permission)}if(user.branchId){const existingBranchPermission=await queryRunner.manager.findOne(this.permissionRepository.target,{where:{userId:savedUser.id,permissionType:"branch",targetId:user.branchId}});if(!existingBranchPermission){const branchPermission=queryRunner.manager.create(this.permissionRepository.target,{userId:savedUser.id,permissionType:"branch",targetId:user.branchId,isActive:dto.isActive??true});await queryRunner.manager.save(this.permissionRepository.target,branchPermission)}}await queryRunner.commitTransaction();await this.clearCacheForId([savedUser]);return this.convertEntityToResponseDto(savedUser,false)}catch(error){await queryRunner.rollbackTransaction();import_utils2.ErrorHandler.logError(this.logger,error,"insert",{entity:this.entityName});import_utils2.ErrorHandler.rethrowError(error)}finally{await queryRunner.release()}}async profile(dto,user){if(!this.dataSource){throw new import_common3.BadRequestException("DataSource not available")}const queryRunner=this.dataSource.createQueryRunner();await queryRunner.connect();await queryRunner.startTransaction();try{const userId=dto.id??user.id;const findUser=await queryRunner.manager.findOne(this.repository.target,{where:{id:userId}});if(!findUser){throw new import_common3.NotFoundException("User not found")}if(dto.password){if(!dto.id||dto.id===user.id){}const salt=await bcrypt2.genSalt();findUser.password=await bcrypt2.hash(dto.password,salt)}const{password,...restDto}=dto;Object.assign(findUser,restDto);await queryRunner.manager.save(this.repository.target,findUser);await queryRunner.commitTransaction();await this.clearCacheForId([findUser]);return findUser.id}catch(error){await queryRunner.rollbackTransaction();import_utils2.ErrorHandler.logError(this.logger,error,"profile",{entity:this.entityName});import_utils2.ErrorHandler.rethrowError(error)}finally{await queryRunner.release()}}};__name(UserService,"UserService");UserService=__decorateClass([(0,import_common3.Injectable)(),__decorateParam(0,(0,import_common3.Inject)("CACHE_INSTANCE"))],UserService);var import_classes2=require("@flusys/nestjs-shared/classes");var import_common4=require("@nestjs/common");init_company_entity();var CompanyService=class extends import_classes2.RequestScopedApiService{constructor(cacheManager,utilsService,dataSourceProvider){super("company",null,cacheManager,utilsService,CompanyService.name,true);this.cacheManager=cacheManager;this.utilsService=utilsService;this.dataSourceProvider=dataSourceProvider}logger=new import_common4.Logger(CompanyService.name);resolveEntity(){return Company}getDataSourceProvider(){return this.dataSourceProvider}async convertSingleDtoToEntity(dto,_user){let company=new Company;if("id"in dto&&dto.id&&typeof dto.id==="string"){const dbData=await this.repository.findOne({where:{id:dto.id}});if(!dbData){throw new import_common4.NotFoundException("Company not found")}company=dbData}return{...company,...dto}}async getSelectQuery(query,_user,select){if(!select||!select.length){select=["id","name","slug","isActive","createdAt"]}const selectFields=select.map(field=>`${this.entityName}.${field}`);query.select(selectFields);return{query,isRaw:false}}async getGlobalSearchQuery(query,search,_user){query.andWhere("(company.name LIKE :search OR company.slug LIKE :search OR company.email LIKE :search)",{search:`%${search}%`});return{query,isRaw:false}}};__name(CompanyService,"CompanyService");CompanyService=__decorateClass([(0,import_common4.Injectable)(),__decorateParam(0,(0,import_common4.Inject)("CACHE_INSTANCE"))],CompanyService);var import_classes3=require("@flusys/nestjs-shared/classes");var import_common5=require("@nestjs/common");init_company_branch_entity();var BranchService=class extends import_classes3.RequestScopedApiService{constructor(cacheManager,utilsService,dataSourceProvider,authConfig){super("company_branch",null,cacheManager,utilsService,BranchService.name,true);this.cacheManager=cacheManager;this.utilsService=utilsService;this.dataSourceProvider=dataSourceProvider;this.authConfig=authConfig}logger=new import_common5.Logger(BranchService.name);resolveEntity(){return CompanyBranch}getDataSourceProvider(){return this.dataSourceProvider}async convertSingleDtoToEntity(dto,_user){let branch=new CompanyBranch;if("id"in dto&&dto.id&&typeof dto.id==="string"){const dbData=await this.repository.findOne({where:{id:dto.id}});if(!dbData){throw new import_common5.NotFoundException("Branch not found")}branch=dbData}return{...branch,...dto}}async getSelectQuery(query,_user,select){if(!select||!select.length){select=["id","name","slug","isActive","createdAt"]}const selectFields=select.map(field=>`${this.entityName}.${field}`);query.select(selectFields);return{query,isRaw:false}}async getGlobalSearchQuery(query,search,_user){query.andWhere("(company_branch.name LIKE :search OR company_branch.slug LIKE :search OR company_branch.email LIKE :search)",{search:`%${search}%`});return{query,isRaw:false}}async getExtraManipulateQuery(query,_filterAndPaginationDto,user){const result=await super.getExtraManipulateQuery(query,_filterAndPaginationDto,user);const isCompanyFeatureEnabled=this.authConfig.isCompanyFeatureEnabled();if(isCompanyFeatureEnabled&&user?.companyId){query.andWhere("company_branch.company_id = :companyId",{companyId:user.companyId})}return result}};__name(BranchService,"BranchService");BranchService=__decorateClass([(0,import_common5.Injectable)(),__decorateParam(0,(0,import_common5.Inject)("CACHE_INSTANCE"))],BranchService);var import_common6=require("@nestjs/common");var import_typeorm6=require("@nestjs/typeorm");init_user_company_permission_entity();var UserPermissionService=class{constructor(repository){this.repository=repository}logger=new import_common6.Logger(UserPermissionService.name);async findUserCompanies(userId){return this.repository.find({where:{userId,permissionType:"company"},relations:["company"],order:{createdAt:"DESC"}})}async assignUserToCompany(dto){const existing=await this.repository.findOne({where:{userId:dto.userId,targetId:dto.companyId,permissionType:"company"}});if(existing){throw new import_common6.BadRequestException("User already assigned to this company")}const permission=this.repository.create({userId:dto.userId,permissionType:"company",targetId:dto.companyId,metadata:dto.metadata});await this.repository.save(permission)}async revokeCompanyAccess(userId,companyId){const permission=await this.repository.findOne({where:{userId,targetId:companyId,permissionType:"company"}});if(!permission){throw new import_common6.NotFoundException("Company permission not found")}await this.repository.remove(permission)}async findUserBranches(userId){return this.repository.find({where:{userId,permissionType:"branch"},relations:["branch"],order:{createdAt:"DESC"}})}async assignUserToBranch(dto){const existing=await this.repository.findOne({where:{userId:dto.userId,targetId:dto.branchId,permissionType:"branch"}});if(existing){throw new import_common6.BadRequestException("User already assigned to this branch")}const permission=this.repository.create({userId:dto.userId,permissionType:"branch",targetId:dto.branchId,metadata:dto.metadata});await this.repository.save(permission)}async revokeBranchAccess(userId,branchId){const permission=await this.repository.findOne({where:{userId,targetId:branchId,permissionType:"branch"}});if(!permission){throw new import_common6.NotFoundException("Branch permission not found")}await this.repository.remove(permission)}};__name(UserPermissionService,"UserPermissionService");UserPermissionService=__decorateClass([(0,import_common6.Injectable)(),__decorateParam(0,(0,import_typeorm6.InjectRepository)(UserCompanyPermission))],UserPermissionService);var import_common7=require("@nestjs/common");var AuthConfigService=class{options;config;constructor(injectedOptions){this.options=injectedOptions??{global:false,includeController:true};this.config=this.options.config??{}}getDatabaseMode(){return this.options.bootstrapAppConfig?.databaseMode??"single"}isMultiTenant(){return this.getDatabaseMode()==="multi-tenant"}isCompanyFeatureEnabled(){return this.options.bootstrapAppConfig?.enableCompanyFeature??false}getJwtSecret(){return this.config.jwtSecret??"default-secret-change-in-production"}getJwtExpiration(){return this.config.jwtExpiration??"1h"}getRefreshTokenSecret(){return this.config.refreshTokenSecret??this.getJwtSecret()}getRefreshTokenExpiration(){return this.config.refreshTokenExpiration??"7d"}getRefreshTokenCookieName(){return this.config.refreshTokenCookieName??"fsn_refresh_token"}getDefaultDatabaseConfig(){return this.config.defaultDatabaseConfig??this.config.tenantDefaultDatabaseConfig}getTenantDefaultDatabaseConfig(){return this.config.tenantDefaultDatabaseConfig}getTenants(){return this.config.tenants??[]}getOptions(){return{...this.options}}getConfig(){return{...this.config}}};__name(AuthConfigService,"AuthConfigService");AuthConfigService=__decorateClass([(0,import_common7.Injectable)(),__decorateParam(0,(0,import_common7.Optional)()),__decorateParam(0,(0,import_common7.Inject)(AUTH_MODULE_OPTIONS))],AuthConfigService);var import_modules=require("@flusys/nestjs-shared/modules");var import_common8=require("@nestjs/common");var import_core=require("@nestjs/core");var AuthDataSourceProvider=class extends import_modules.MultiTenantDataSourceService{constructor(authOptions,request){super(AuthDataSourceProvider.buildParentOptions(authOptions),request);this.authOptions=authOptions}logger=new import_common8.Logger(AuthDataSourceProvider.name);async getSingleDataSource(){if(!AuthDataSourceProvider.singleDataSource){if(AuthDataSourceProvider.singleConnectionLock){return AuthDataSourceProvider.singleConnectionLock}const lockPromise=(async()=>{const config=this.getDefaultDatabaseConfig();if(!config){throw new Error("Default database config is not available")}const ds=await this.createDataSourceFromConfig(config);AuthDataSourceProvider.singleDataSource=ds;AuthDataSourceProvider.initialized=true;return ds})();AuthDataSourceProvider.singleConnectionLock=lockPromise;try{return await lockPromise}finally{AuthDataSourceProvider.singleConnectionLock=null}}return AuthDataSourceProvider.singleDataSource}async getOrCreateTenantConnection(tenant){const existing=AuthDataSourceProvider.tenantConnections.get(tenant.id);if(existing?.isInitialized){return existing}const pendingConnection=AuthDataSourceProvider.connectionLocks.get(tenant.id);if(pendingConnection){return pendingConnection}const config=this.buildTenantDatabaseConfig(tenant);const connectionPromise=this.createDataSourceFromConfig(config);AuthDataSourceProvider.connectionLocks.set(tenant.id,connectionPromise);try{const dataSource=await connectionPromise;AuthDataSourceProvider.tenantConnections.set(tenant.id,dataSource);return dataSource}finally{AuthDataSourceProvider.connectionLocks.delete(tenant.id)}}static buildParentOptions(options){return{bootstrapAppConfig:options.bootstrapAppConfig,defaultDatabaseConfig:options.config?.defaultDatabaseConfig,tenantDefaultDatabaseConfig:options.config?.tenantDefaultDatabaseConfig,tenants:options.config?.tenants}}getEnableCompanyFeature(){return this.authOptions.bootstrapAppConfig?.enableCompanyFeature??false}getEnableCompanyFeatureForTenant(tenant){return tenant?.enableCompanyFeature??this.getEnableCompanyFeature()}getEnableCompanyFeatureForCurrentTenant(){return this.getEnableCompanyFeatureForTenant(this.getCurrentTenant()??void 0)}async getAuthEntities(enableCompanyFeature){const enable=enableCompanyFeature??this.getEnableCompanyFeature();const{Company:Company2,CompanyBranch:CompanyBranch2,User:User2,UserCompanyPermission:UserCompanyPermission2}=await Promise.resolve().then(()=>(init_entities(),entities_exports));const coreEntities=[User2];const companyEntities=enable?[Company2,CompanyBranch2,UserCompanyPermission2]:[];return[...coreEntities,...companyEntities]}async createDataSourceFromConfig(config){const currentTenant=this.getCurrentTenant();const enableCompanyFeature=this.getEnableCompanyFeatureForTenant(currentTenant??void 0);const entities=await this.getAuthEntities(enableCompanyFeature);return super.createDataSourceFromConfig(config,entities)}};__name(AuthDataSourceProvider,"AuthDataSourceProvider");__publicField(AuthDataSourceProvider,"tenantConnections",new Map);__publicField(AuthDataSourceProvider,"singleDataSource",null);__publicField(AuthDataSourceProvider,"tenantsRegistry",new Map);__publicField(AuthDataSourceProvider,"initialized",false);__publicField(AuthDataSourceProvider,"connectionLocks",new Map);__publicField(AuthDataSourceProvider,"singleConnectionLock",null);AuthDataSourceProvider=__decorateClass([(0,import_common8.Injectable)({scope:import_common8.Scope.REQUEST}),__decorateParam(0,(0,import_common8.Inject)(AUTH_MODULE_OPTIONS)),__decorateParam(1,(0,import_common8.Optional)()),__decorateParam(1,(0,import_common8.Inject)(import_core.REQUEST))],AuthDataSourceProvider);0&&(module.exports={AuthConfigService,AuthDataSourceProvider,AuthenticationService,BranchService,CompanySelectionSessionService,CompanyService,UserPermissionService,UserService});
@@ -0,0 +1,2 @@
1
+ export declare const AUTH_MODULE_OPTIONS = "AUTH_MODULE_OPTIONS";
2
+ export declare const SESSION_CACHE_PREFIX = "auth:session";
@@ -0,0 +1 @@
1
+ export * from './auth.constants';
@@ -0,0 +1,22 @@
1
+ import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
2
+ import { Request } from 'express';
3
+ import { ChangePasswordDto, CompanySelectionResponseDto, LoginDto, LoginResponseDto, MeResponseDto, RefreshTokenDto, RegistrationDto, RegistrationResponseDto } from '../dtos/authentication.dto';
4
+ import { AuthConfigService } from '../services/auth-config.service';
5
+ import { AuthenticationService } from '../services/authentication.service';
6
+ export declare class AuthenticationController {
7
+ private readonly authService;
8
+ private readonly authConfig?;
9
+ constructor(authService: AuthenticationService, authConfig?: AuthConfigService);
10
+ login(loginDto: LoginDto): Promise<LoginResponseDto | CompanySelectionResponseDto>;
11
+ register(registrationDto: RegistrationDto): Promise<RegistrationResponseDto>;
12
+ refreshToken(req: Request, refreshTokenDto: RefreshTokenDto): Promise<{
13
+ accessToken: string;
14
+ }>;
15
+ getCurrentUser(user: ILoggedUserInfo): Promise<MeResponseDto>;
16
+ logout(userId: string): Promise<{
17
+ message: string;
18
+ }>;
19
+ changePassword(userId: string, dto: ChangePasswordDto): Promise<{
20
+ message: string;
21
+ }>;
22
+ }
@@ -0,0 +1,17 @@
1
+ import { CompanyBranchResponseDto, CreateCompanyBranchDto, UpdateCompanyBranchDto } from '../dtos/company-branch.dto';
2
+ import { BranchService } from '../services/branch.service';
3
+ declare const BranchController_base: abstract new (service: BranchService) => {
4
+ service: BranchService;
5
+ insert(addDto: CreateCompanyBranchDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<CompanyBranchResponseDto>>;
6
+ insertMany(addDto: CreateCompanyBranchDto[], user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<CompanyBranchResponseDto>>;
7
+ getById(id: string, body: import("@flusys/nestjs-shared").GetByIdBodyDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<CompanyBranchResponseDto>>;
8
+ update(updateDto: UpdateCompanyBranchDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<CompanyBranchResponseDto>>;
9
+ updateMany(updateDtos: UpdateCompanyBranchDto[], user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<CompanyBranchResponseDto>>;
10
+ getAll(filterAndPaginationDto: import("@flusys/nestjs-shared").FilterAndPaginationDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared").ListResponseDto<CompanyBranchResponseDto>>;
11
+ delete(deleteDto: import("@flusys/nestjs-shared").DeleteDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").MessageResponseDto>;
12
+ };
13
+ export declare class BranchController extends BranchController_base {
14
+ branchService: BranchService;
15
+ constructor(branchService: BranchService);
16
+ }
17
+ export {};
@@ -0,0 +1,14 @@
1
+ import { LoginResponseDto, SelectDto, SwitchCompanyDto } from '../dtos/authentication.dto';
2
+ import { AuthenticationService } from '../services/authentication.service';
3
+ export declare class CompanySelectionController {
4
+ private readonly authService;
5
+ constructor(authService: AuthenticationService);
6
+ select(dto: SelectDto): Promise<LoginResponseDto>;
7
+ switchCompany(userId: string, dto: SwitchCompanyDto): Promise<LoginResponseDto>;
8
+ getUserCompanies(userId: string): Promise<{
9
+ companies: import("..").Company[];
10
+ }>;
11
+ getUserBranches(userId: string, companyId: string): Promise<{
12
+ branches: import("..").CompanyBranch[];
13
+ }>;
14
+ }
@@ -0,0 +1,17 @@
1
+ import { CompanyResponseDto, CreateCompanyDto, UpdateCompanyDto } from '../dtos/company.dto';
2
+ import { CompanyService } from '../services/company.service';
3
+ declare const CompanyController_base: abstract new (service: CompanyService) => {
4
+ service: CompanyService;
5
+ insert(addDto: CreateCompanyDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<CompanyResponseDto>>;
6
+ insertMany(addDto: CreateCompanyDto[], user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<CompanyResponseDto>>;
7
+ getById(id: string, body: import("@flusys/nestjs-shared").GetByIdBodyDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<CompanyResponseDto>>;
8
+ update(updateDto: UpdateCompanyDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<CompanyResponseDto>>;
9
+ updateMany(updateDtos: UpdateCompanyDto[], user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<CompanyResponseDto>>;
10
+ getAll(filterAndPaginationDto: import("@flusys/nestjs-shared").FilterAndPaginationDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared").ListResponseDto<CompanyResponseDto>>;
11
+ delete(deleteDto: import("@flusys/nestjs-shared").DeleteDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").MessageResponseDto>;
12
+ };
13
+ export declare class CompanyController extends CompanyController_base {
14
+ companyService: CompanyService;
15
+ constructor(companyService: CompanyService);
16
+ }
17
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from './authentication.controller';
2
+ export * from './company-selection.controller';
3
+ export * from './user.controller';
4
+ export * from './company.controller';
5
+ export * from './branch.controller';
6
+ export * from './user-permission.controller';
@@ -0,0 +1,16 @@
1
+ import { AssignUserCompanyDto, AssignUserBranchDto, UserCompaniesResponseDto, UserBranchesResponseDto } from '../dtos/user-permission.dto';
2
+ import { UserPermissionService } from '../services/user-permission.service';
3
+ export declare class UserPermissionController {
4
+ private readonly userPermissionService;
5
+ constructor(userPermissionService: UserPermissionService);
6
+ assignUserCompany(dto: AssignUserCompanyDto): Promise<{
7
+ success: boolean;
8
+ message: string;
9
+ }>;
10
+ getUserCompanies(userId: string): Promise<UserCompaniesResponseDto>;
11
+ assignUserBranch(dto: AssignUserBranchDto): Promise<{
12
+ success: boolean;
13
+ message: string;
14
+ }>;
15
+ getUserBranches(userId: string): Promise<UserBranchesResponseDto>;
16
+ }
@@ -0,0 +1,31 @@
1
+ import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
2
+ import { CreateUserDto, UpdateUserDto, UserResponseDto } from '../dtos/user.dto';
3
+ import { UserService } from '../services/user.service';
4
+ declare const UserController_base: abstract new (service: UserService) => {
5
+ service: UserService;
6
+ insert(addDto: CreateUserDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<UserResponseDto>>;
7
+ insertMany(addDto: CreateUserDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<UserResponseDto>>;
8
+ getById(id: string, body: import("@flusys/nestjs-shared").GetByIdBodyDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<UserResponseDto>>;
9
+ update(updateDto: UpdateUserDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<UserResponseDto>>;
10
+ updateMany(updateDtos: UpdateUserDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<UserResponseDto>>;
11
+ getAll(filterAndPaginationDto: import("@flusys/nestjs-shared").FilterAndPaginationDto, user: ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared").ListResponseDto<UserResponseDto>>;
12
+ delete(deleteDto: import("@flusys/nestjs-shared").DeleteDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").MessageResponseDto>;
13
+ };
14
+ export declare class UserController extends UserController_base {
15
+ service: UserService;
16
+ constructor(service: UserService);
17
+ verifyEmail(id: string): Promise<{
18
+ message: string;
19
+ }>;
20
+ verifyPhone(id: string): Promise<{
21
+ message: string;
22
+ }>;
23
+ updateStatus(id: string, isActive: boolean, user: ILoggedUserInfo): Promise<{
24
+ message: string;
25
+ }>;
26
+ profile(dto: UpdateUserDto, user: ILoggedUserInfo): Promise<{
27
+ message: string;
28
+ data: string;
29
+ }>;
30
+ }
31
+ export {};
@@ -0,0 +1,3 @@
1
+ import { IBootstrapAppConfig } from '@flusys/nestjs-core';
2
+ import { IModuleSwaggerOptions } from '@flusys/nestjs-core/docs';
3
+ export declare function authSwaggerConfig(bootstrapConfig?: IBootstrapAppConfig): IModuleSwaggerOptions;
@@ -0,0 +1 @@
1
+ export * from './auth-swagger.config';
@@ -0,0 +1,92 @@
1
+ export declare class LoginDto {
2
+ email: string;
3
+ password: string;
4
+ }
5
+ export declare class RegistrationDto {
6
+ name: string;
7
+ email: string;
8
+ password: string;
9
+ phone?: string;
10
+ companySlug?: string;
11
+ branchSlug?: string;
12
+ newCompanyName?: string;
13
+ newCompanyPhone?: string;
14
+ newCompanyAddress?: string;
15
+ }
16
+ export declare class RefreshTokenDto {
17
+ refreshToken?: string;
18
+ }
19
+ export declare class ChangePasswordDto {
20
+ currentPassword: string;
21
+ newPassword: string;
22
+ }
23
+ export declare class SelectDto {
24
+ sessionId: string;
25
+ companyId: string;
26
+ branchId: string;
27
+ }
28
+ export declare class SwitchCompanyDto {
29
+ companyId: string;
30
+ branchId: string;
31
+ }
32
+ export declare class UserInfoDto {
33
+ id: string;
34
+ email: string;
35
+ name?: string;
36
+ profilePictureId?: string | null;
37
+ }
38
+ export declare class CompanyInfoDto {
39
+ id: string;
40
+ name: string;
41
+ slug?: string;
42
+ logoId?: string | null;
43
+ }
44
+ export declare class BranchInfoDto {
45
+ id: string;
46
+ name: string;
47
+ slug?: string;
48
+ logoId?: string | null;
49
+ }
50
+ export declare class BranchSelectionInfoDto {
51
+ id: string;
52
+ name: string;
53
+ slug: string;
54
+ isActive: boolean;
55
+ logoId?: string | null;
56
+ }
57
+ export declare class CompanyWithBranchesDto {
58
+ id: string;
59
+ name: string;
60
+ slug: string;
61
+ isActive: boolean;
62
+ logoId?: string | null;
63
+ branches: BranchSelectionInfoDto[];
64
+ }
65
+ export declare class LoginResponseDto {
66
+ accessToken: string;
67
+ refreshToken: string;
68
+ user: UserInfoDto;
69
+ company?: CompanyInfoDto;
70
+ branch?: BranchInfoDto;
71
+ companyFeatureEnabled?: boolean;
72
+ }
73
+ export declare class RegistrationResponseDto {
74
+ accessToken: string;
75
+ refreshToken: string;
76
+ user: UserInfoDto;
77
+ company?: CompanyInfoDto;
78
+ branch?: BranchInfoDto;
79
+ companyFeatureEnabled: boolean;
80
+ }
81
+ export declare class MeResponseDto {
82
+ user: UserInfoDto;
83
+ company?: CompanyInfoDto;
84
+ branch?: BranchInfoDto;
85
+ }
86
+ export declare class CompanySelectionResponseDto {
87
+ requiresSelection: true;
88
+ sessionId: string;
89
+ expiresAt: Date;
90
+ user: UserInfoDto;
91
+ companies: CompanyWithBranchesDto[];
92
+ }
@@ -0,0 +1,24 @@
1
+ export declare class CreateCompanyBranchDto {
2
+ [key: string]: unknown;
3
+ name: string;
4
+ slug: string;
5
+ companyId: string;
6
+ parentId?: string;
7
+ logoId?: string;
8
+ address?: string;
9
+ phone?: string;
10
+ email?: string;
11
+ serial?: number;
12
+ isActive?: boolean;
13
+ additionalFields?: Record<string, any>;
14
+ }
15
+ declare const UpdateCompanyBranchDto_base: import("@nestjs/common").Type<Partial<CreateCompanyBranchDto>>;
16
+ export declare class UpdateCompanyBranchDto extends UpdateCompanyBranchDto_base {
17
+ id: string;
18
+ }
19
+ export declare class CompanyBranchResponseDto extends UpdateCompanyBranchDto {
20
+ readOnly: boolean;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
24
+ export {};
@@ -0,0 +1,24 @@
1
+ export declare class CreateCompanyDto {
2
+ [key: string]: unknown;
3
+ name: string;
4
+ slug: string;
5
+ logoId?: string;
6
+ address?: string;
7
+ phone?: string;
8
+ email?: string;
9
+ website?: string;
10
+ serial?: number;
11
+ isActive?: boolean;
12
+ settings?: Record<string, any>;
13
+ additionalFields?: Record<string, any>;
14
+ }
15
+ declare const UpdateCompanyDto_base: import("@nestjs/common").Type<Partial<CreateCompanyDto>>;
16
+ export declare class UpdateCompanyDto extends UpdateCompanyDto_base {
17
+ id: string;
18
+ }
19
+ export declare class CompanyResponseDto extends UpdateCompanyDto {
20
+ readOnly: boolean;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
24
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from './authentication.dto';
2
+ export * from './company-branch.dto';
3
+ export * from './company.dto';
4
+ export * from './user-company-permission.dto';
5
+ export * from './user.dto';
6
+ export * from './user-permission.dto';
@@ -0,0 +1,10 @@
1
+ export declare class AssignCompanyPermissionDto {
2
+ userId: string;
3
+ companyId: string;
4
+ metadata?: Record<string, any>;
5
+ }
6
+ export declare class AssignBranchPermissionDto {
7
+ userId: string;
8
+ branchId: string;
9
+ metadata?: Record<string, any>;
10
+ }
@@ -0,0 +1,33 @@
1
+ export declare class PermissionItemDto {
2
+ targetId: string;
3
+ isAdd: boolean;
4
+ }
5
+ export declare class AssignUserCompanyDto {
6
+ userId: string;
7
+ items: PermissionItemDto[];
8
+ }
9
+ export declare class AssignUserBranchDto {
10
+ userId: string;
11
+ items: PermissionItemDto[];
12
+ }
13
+ export declare class UserCompanyPermissionDto {
14
+ id: string;
15
+ userId: string;
16
+ companyId: string;
17
+ companyName: string;
18
+ companySlug: string;
19
+ }
20
+ export declare class UserBranchPermissionDto {
21
+ id: string;
22
+ userId: string;
23
+ branchId: string;
24
+ branchName: string;
25
+ branchSlug: string;
26
+ companyId: string;
27
+ }
28
+ export declare class UserCompaniesResponseDto {
29
+ data: UserCompanyPermissionDto[];
30
+ }
31
+ export declare class UserBranchesResponseDto {
32
+ data: UserBranchPermissionDto[];
33
+ }
@@ -0,0 +1,40 @@
1
+ export declare class CreateUserDto {
2
+ [key: string]: unknown;
3
+ name: string;
4
+ phone?: string;
5
+ email: string;
6
+ password: string;
7
+ profilePictureId?: string;
8
+ isActive?: boolean;
9
+ emailVerified?: boolean;
10
+ phoneVerified?: boolean;
11
+ additionalFields?: Record<string, any>;
12
+ }
13
+ export declare class UpdateUserDto {
14
+ id: string;
15
+ name?: string;
16
+ phone?: string;
17
+ email?: string;
18
+ password?: string;
19
+ profilePictureId?: string;
20
+ isActive?: boolean;
21
+ emailVerified?: boolean;
22
+ phoneVerified?: boolean;
23
+ additionalFields?: Record<string, any>;
24
+ }
25
+ export declare class UserResponseDto {
26
+ [key: string]: unknown;
27
+ id: string;
28
+ name: string;
29
+ phone?: string | null;
30
+ email: string;
31
+ profilePictureId?: string | null;
32
+ isActive: boolean;
33
+ emailVerified: boolean;
34
+ phoneVerified: boolean;
35
+ lastLoginAt?: Date | null;
36
+ additionalFields?: Record<string, any> | null;
37
+ createdAt: Date;
38
+ updatedAt: Date;
39
+ deletedAt?: Date | null;
40
+ }
@@ -0,0 +1,19 @@
1
+ import { Identity } from '@flusys/nestjs-shared';
2
+ import { Company } from './company.entity';
3
+ export declare class CompanyBranch extends Identity {
4
+ readOnly: boolean;
5
+ name: string;
6
+ slug: string;
7
+ logoId: string | null;
8
+ address: string | null;
9
+ phone: string | null;
10
+ email: string | null;
11
+ serial: number | null;
12
+ isActive: boolean;
13
+ additionalFields: Record<string, any> | null;
14
+ parentId: string | null;
15
+ parent: CompanyBranch | null;
16
+ children: CompanyBranch[];
17
+ companyId: string | null;
18
+ company: Company;
19
+ }
@@ -0,0 +1,17 @@
1
+ import { Identity } from '@flusys/nestjs-shared';
2
+ import { CompanyBranch } from './company-branch.entity';
3
+ export declare class Company extends Identity {
4
+ readOnly: boolean;
5
+ name: string;
6
+ slug: string;
7
+ logoId: string | null;
8
+ address: string | null;
9
+ phone: string | null;
10
+ email: string | null;
11
+ website: string | null;
12
+ serial: number | null;
13
+ isActive: boolean;
14
+ settings: Record<string, any> | null;
15
+ additionalFields: Record<string, any> | null;
16
+ branches: CompanyBranch[];
17
+ }
@@ -0,0 +1,12 @@
1
+ export * from './company-branch.entity';
2
+ export * from './company.entity';
3
+ export { PermissionType, UserCompanyPermission } from './user-company-permission.entity';
4
+ export * from './user.entity';
5
+ import { CompanyBranch } from './company-branch.entity';
6
+ import { Company } from './company.entity';
7
+ import { UserCompanyPermission } from './user-company-permission.entity';
8
+ import { User } from './user.entity';
9
+ export declare const CoreEntities: (typeof User)[];
10
+ export declare const CompanyEntities: (typeof Company | typeof CompanyBranch | typeof UserCompanyPermission)[];
11
+ export declare const AllEntities: (typeof Company | typeof CompanyBranch | typeof User | typeof UserCompanyPermission)[];
12
+ export declare function getEntitiesByConfig(enableCompanyFeature: boolean): (typeof Company | typeof CompanyBranch | typeof User | typeof UserCompanyPermission)[];
@@ -0,0 +1,20 @@
1
+ import { PermissionType } from '../enums';
2
+ import { CompanyBranch } from './company-branch.entity';
3
+ import { Company } from './company.entity';
4
+ import { User } from './user.entity';
5
+ export { PermissionType };
6
+ export declare class UserCompanyPermission {
7
+ id: string;
8
+ userId: string;
9
+ user?: User;
10
+ permissionType: PermissionType;
11
+ targetId: string;
12
+ metadata?: Record<string, any>;
13
+ isActive: boolean;
14
+ company?: Company;
15
+ branch?: CompanyBranch;
16
+ createdAt: Date;
17
+ updatedAt: Date;
18
+ isCompanyPermission(): boolean;
19
+ isBranchPermission(): boolean;
20
+ }
@@ -0,0 +1,3 @@
1
+ import { UserRoot } from '@flusys/nestjs-shared';
2
+ export declare class User extends UserRoot {
3
+ }
@@ -0,0 +1 @@
1
+ export * from './user-org-permission-type.enum';
@@ -0,0 +1,4 @@
1
+ export declare enum PermissionType {
2
+ COMPANY = "company",
3
+ BRANCH = "branch"
4
+ }
@@ -0,0 +1 @@
1
+ var AUTH_MODULE_OPTIONS="AUTH_MODULE_OPTIONS";var SESSION_CACHE_PREFIX="auth:session";export{AUTH_MODULE_OPTIONS,SESSION_CACHE_PREFIX};