From d5a8a61d6dcc36b52555bba65118dd4aabfc4b33 Mon Sep 17 00:00:00 2001 From: Peter Hornburger Date: Fri, 22 Mar 2024 12:28:28 +0100 Subject: [PATCH] Freitag 12:25 --- src/constclass.ts | 2 + src/database/filesdbclass.ts | 174 ++++++++++++++++++ .../aufgabenpersonenfilterstruktur_server.ts | 16 ++ .../mitarbeitersettingsstruktur_server.ts | 16 +- .../projektestruktur_server.ts | 20 +- .../teamsfilesstruktur_server.ts | 48 +++++ src/index.ts | 4 + src/routes/filesrouts.ts | 121 ++++++++++++ 8 files changed, 380 insertions(+), 21 deletions(-) create mode 100644 src/database/filesdbclass.ts create mode 100644 src/datenstrukturen/aufgabenpersonenfilterstruktur_server.ts create mode 100644 src/datenstrukturen/teamsfilesstruktur_server.ts create mode 100644 src/routes/filesrouts.ts diff --git a/src/constclass.ts b/src/constclass.ts index dbaa352..78d40dd 100644 --- a/src/constclass.ts +++ b/src/constclass.ts @@ -2,6 +2,7 @@ export class Constclass { public readonly NONE: string; public readonly StandortecollectionName: string; + public readonly FilescollectionName: string; public readonly MitarbeitercollectionName: string; public readonly ProjektecollectionName: string; public readonly SettingscollectionName: string; @@ -20,6 +21,7 @@ export class Constclass { this.NONE = 'none'; this.StandortecollectionName = 'standorte'; + this.FilescollectionName = 'files'; this.MitarbeitercollectionName = 'mitarbeiter'; this.SettingscollectionName = 'mitarbeitersettings'; this.ProjektecollectionName = 'projekte'; diff --git a/src/database/filesdbclass.ts b/src/database/filesdbclass.ts new file mode 100644 index 0000000..ae7be4c --- /dev/null +++ b/src/database/filesdbclass.ts @@ -0,0 +1,174 @@ +import {Document, DocumentQuery, model, Model} from "mongoose"; +import {DebugClass} from "../debug"; +import {Constclass} from "../constclass"; +import * as mongoose from "mongoose"; +import {ITeamsfilesstruktur, Teamsfileshema} from "../datenstrukturen/teamsfilesstruktur_server"; +import {Projektpunktshema} from "../datenstrukturen/projektpunktestruktur_server"; + +export class FilesDBClass { + + private Debug: DebugClass; + private Const: Constclass; + + constructor() { + + this.Debug = new DebugClass(); + this.Const = new Constclass(); + } + + public RemoveTeamsfile(teamsfile: ITeamsfilesstruktur) { + + try { + + let FilesmodelClass: mongoose.Model; + + return new Promise((resolve, reject) => { + + FilesmodelClass = model(this.Const.FilescollectionName, Teamsfileshema); + + FilesmodelClass.deleteOne({_id: teamsfile._id} ).then(() => { + + resolve(true); + + }).catch((error) => { + + reject(error); + }); + + }); + + } catch (error) { + + this.Debug.ShowErrorMessage(error.message, error, 'FilesDBClass', 'RemoveTeamsfile'); + } + + } + + public ReadFilesliste(projektkey: string, filetype: string): Promise { + + try { + + let FilesmodelClass: mongoose.Model; + let Liste: ITeamsfilesstruktur[] = []; + let Filter: any; + + if(filetype === 'Any') { + + Filter = { Projektkey: projektkey }; + } + else { + + Filter = { Filetyp: filetype }; + } + + return new Promise((resolve, reject) => { + + FilesmodelClass = model(this.Const.FilescollectionName, Teamsfileshema); + + FilesmodelClass.find(Filter).then((data: any) => { + + data.forEach((teamsfile) => { + + Liste.push(teamsfile._doc); + }); + + resolve(Liste); + + console.log(''); + + }).catch((error: any) => { + + reject(error); + }); + + }); + + } catch (error) { + + this.Debug.ShowErrorMessage(error.message, error, 'FilesDBClass', 'ReadFileliste'); + } + } + + public AddFiles(data: ITeamsfilesstruktur):Promise { + + try { + + let Filesmodel: mongoose.Document; + + return new Promise((resolve, reject) => { + + delete data._id; + + Filesmodel = this.GetFilesModel(data); + + Filesmodel.save().then((result: Document) => { + + resolve(result); + + }).catch((error) => { + + reject(error); + }); + }); + + } catch (error) { + + this.Debug.ShowErrorMessage(error.message, error, 'FilesDBClass', 'AddFile'); + } + } + + public UpdateFiles(data: ITeamsfilesstruktur):Promise { + + try { + + let FilesmodelClass: mongoose.Model; + + return new Promise((resolve, reject) => { + + FilesmodelClass = model(this.Const.FilescollectionName, Teamsfileshema); + + FilesmodelClass.findById(data._id).then((standort: mongoose.Document) => { + + if(standort) { + + standort.set(data); + standort.save().then((result: Document) => { + + resolve(result); + + }).catch((error) => { + + reject(error); + }); + } + else { + + resolve(null); + } + }).catch((error) => { + + reject(error); + }); + }); + + } catch (error) { + + this.Debug.ShowErrorMessage(error.message, error, 'FilesDBClass', 'UpdateFile'); + } + } + + public GetFilesModel(data: ITeamsfilesstruktur): mongoose.Document { + + try { + + const FilesmodelClass = model(this.Const.FilescollectionName, Teamsfileshema); + const Filesmodel: mongoose.Document = new FilesmodelClass(data); + + return Filesmodel; + } + catch (error) { + + this.Debug.ShowErrorMessage(error.message, error, 'FilesDBClass', 'GetStandortModel'); + } + } +} diff --git a/src/datenstrukturen/aufgabenpersonenfilterstruktur_server.ts b/src/datenstrukturen/aufgabenpersonenfilterstruktur_server.ts new file mode 100644 index 0000000..548992a --- /dev/null +++ b/src/datenstrukturen/aufgabenpersonenfilterstruktur_server.ts @@ -0,0 +1,16 @@ +import mongoose from "mongoose"; + +interface IAufgabenpersonenfilterstruktur { + + Projektkey: string; + PersonenlisteID: string[]; +}; + +const Aufgabenpersonenfiltershema = new mongoose.Schema({ + + Projektkey: {type: String, required: false}, + PersonenlisteID: {type: [String], required: false}, + +}, {_id: false}); + +export { IAufgabenpersonenfilterstruktur, Aufgabenpersonenfiltershema }; diff --git a/src/datenstrukturen/mitarbeitersettingsstruktur_server.ts b/src/datenstrukturen/mitarbeitersettingsstruktur_server.ts index 4773723..a387945 100644 --- a/src/datenstrukturen/mitarbeitersettingsstruktur_server.ts +++ b/src/datenstrukturen/mitarbeitersettingsstruktur_server.ts @@ -1,5 +1,6 @@ import mongoose from "mongoose"; import {Aufgabenansichtshema, IAufgabenansichtstruktur} from "./aufgabenansichtstruktur_server"; +import {Aufgabenpersonenfiltershema, IAufgabenpersonenfilterstruktur} from "./aufgabenpersonenfilterstruktur_server"; interface IMitarbeitersettingsstruktur { @@ -16,17 +17,6 @@ interface IMitarbeitersettingsstruktur { HauptkostengruppeFilter: number; UnterkostengruppeFilter: number; - /* - AufgabenShowOffen: boolean; - AufgabenShowGeschlossen: boolean; - AufgabenShowBearbeitung: boolean; - AufgabenShowRuecklauf: boolean; - AufgabenShowBilder: boolean; - AufgabenShowMeilensteinOnly: boolean; - AufgabenShowMeilensteine: boolean; - - */ - Aufgabenansicht: IAufgabenansichtstruktur[]; AufgabenTerminfiltervariante: string; @@ -65,6 +55,8 @@ interface IMitarbeitersettingsstruktur { UrlaubShowMeinenUrlaub: boolean; LOPListeGeschlossenZeitfilter: number; + + AufgabenPersonenfilter: IAufgabenpersonenfilterstruktur[]; }; const Mitarbeitersettingsshema = new mongoose.Schema({ @@ -125,6 +117,8 @@ const Mitarbeitersettingsshema = new mongoose.Schema({ UrlaubShowFeiertage_DE: {type: Boolean, default: true}, UrlaubShowFeiertage_BG: {type: Boolean, default: true}, UrlaubShowMeinenUrlaub: {type: Boolean, default: true}, + + AufgabenPersonenfilter: {type: [Aufgabenpersonenfiltershema], default: []}, }); export { Mitarbeitersettingsshema, IMitarbeitersettingsstruktur }; diff --git a/src/datenstrukturen/projektestruktur_server.ts b/src/datenstrukturen/projektestruktur_server.ts index 0f959d8..df4a513 100644 --- a/src/datenstrukturen/projektestruktur_server.ts +++ b/src/datenstrukturen/projektestruktur_server.ts @@ -1,8 +1,7 @@ -import * as mongoose from "mongoose"; +import mongoose from "mongoose"; import {IVerfasserstruktur, Verfassershema} from "./verfasserstruktur_server"; import {IProjektbeteiligtestruktur, Projektbeteiligteeshema} from "./projektbeteiligtestruktur_server"; import {Bauteilshema, IBauteilstruktur} from "./bauteilstruktur_server"; -import {IProjektfirmenstruktur, Projektfirmenshema} from "./projektfirmenstruktur_server"; interface IProjektestruktur { @@ -13,7 +12,6 @@ interface IProjektestruktur { Projektkey: string; Zeitstempel: number; Zeitpunkt: string; - Projektmailadresse: string; Strasse: string; PLZ: string; Ort: string; @@ -25,7 +23,6 @@ interface IProjektestruktur { Status: string; Verfasser: IVerfasserstruktur; Beteiligtenliste: IProjektbeteiligtestruktur[]; - Firmenliste: IProjektfirmenstruktur[]; Bauteilliste: IBauteilstruktur[]; MitarbeiterIDListe: string[]; ProjektIsReal: boolean; @@ -46,12 +43,15 @@ interface IProjektestruktur { TeamsDescription: string; TeamsName: string; + ProjektlogofileID: string; + Projektlogobreite: string; + + BilderFolderID: string; ProjektFolderID: string; ProtokolleFolderID: string; BautagebuchFolderID: string; BaustellenLOPFolderID: string; - RechnungListefolderID: string; - LastLOPEintragnummer: number; + LastLOPEintragnummer: number; }; const Projekteshema = new mongoose.Schema({ @@ -61,7 +61,6 @@ const Projekteshema = new mongoose.Schema({ StellvertreterID: {type: String, required: false}, StandortID: {type: String, required: false}, Projektkey: {type: String, required: false}, - Projektmailadresse: {type: String, required: false}, Projektkurzname: {type: String, required: false}, OutlookkategorieID: {type: String, required: false}, Projektnummer: {type: String, required: false}, @@ -92,7 +91,6 @@ const Projekteshema = new mongoose.Schema({ Verfasser: Verfassershema, Beteiligtenliste: [Projektbeteiligteeshema], Bauteilliste: [Bauteilshema], - Firmenliste: [Projektfirmenshema], MitarbeiterIDListe: [{type: String}], LastLOPEintragnummer: {type: Number, required: false}, @@ -100,13 +98,15 @@ const Projekteshema = new mongoose.Schema({ TeamsDescription: {type: String, required: false}, TeamsName: {type: String, required: false}, + ProjektlogofileID: {type: String, required: false}, + Projektlogobreite: {type: String, required: false}, + ProjektFolderID: {type: String, required: false}, ProtokolleFolderID: {type: String, required: false}, BautagebuchFolderID: {type: String, required: false}, BaustellenLOPFolderID: {type: String, required: false}, - RechnungListefolderID: {type: String, required: false} + BilderFolderID: {type: String, required: false}, }); export { IProjektestruktur, Projekteshema }; - diff --git a/src/datenstrukturen/teamsfilesstruktur_server.ts b/src/datenstrukturen/teamsfilesstruktur_server.ts new file mode 100644 index 0000000..7b9b7f2 --- /dev/null +++ b/src/datenstrukturen/teamsfilesstruktur_server.ts @@ -0,0 +1,48 @@ +import {IVerfasserstruktur, Verfassershema} from "./verfasserstruktur_server"; +import mongoose from "mongoose"; + + +interface ITeamsfilesstruktur { + + _id: string; + id: string; + name: string; + webUrl: string; + size: number; + ProjektID: string; + Projektkey: string; + ProjektpunktID: string; + Filetyp: string; + Leistungsphase: string; + Zeitstempel: number; + Zeitsting: string; + MimeType: string; + DirectoryID: string; + Beschreibung: string; + Verfasser: IVerfasserstruktur; +}; + +const Teamsfileshema = new mongoose.Schema({ + + id: {type: String, required: false}, + name: {type: String, required: false}, + webUrl: {type: String, required: false}, + size: {type: Number, required: false}, + ProjektID: {type: String, required: false}, + Projektkey: {type: String, required: false}, + ProjektpunktID: {type: String, required: false}, + Filetyp: {type: String, required: false}, + Leistungsphase: {type: String, required: false}, + Zeitstempel: {type: Number, required: false}, + Zeitsting: {type: String, required: false}, + MimeType: {type: String, required: false}, + DirectoryID: {type: String, required: false}, + Beschreibung: {type: String, required: false}, + Verfasser: Verfassershema +}); + +export { ITeamsfilesstruktur, Teamsfileshema }; + + + + diff --git a/src/index.ts b/src/index.ts index b2b3fc1..9cf5f2c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -54,6 +54,7 @@ import {SaveLOPListeroutsClass} from "./routes/saveloplisterouts"; import {SendReminderroutsClass} from "./routes/sendreminderrouts"; import {FestlegungskategorieouterClass} from "./routes/festlegungskategorierouts"; import {SimontabelleroutsClass} from "./routes/simontabellerouts"; +import {FilesrouterClass} from "./routes/filesrouts"; const app: Application = express(); @@ -90,6 +91,7 @@ const SendLOPListerouter: SendLOPListeroutsClass = new SendLOPListeroutsClass(); const SaveFestlegungenrouts: SaveFestlegungenroutsClass = new SaveFestlegungenroutsClass(); const Addsubscriptionrouts: AddsubscriptionroutsClass = new AddsubscriptionroutsClass(); const Simontabellenrouts: SimontabelleroutsClass = new SimontabelleroutsClass(); +const Filesroutes: FilesrouterClass = new FilesrouterClass(); const NONE = 'NONE'; let Port: string = 'none'; @@ -186,6 +188,7 @@ SaveLOPListerouter.Init(Config); Addsubscriptionrouts.Init(Config); Simontabellenrouts.Init(Config); +Filesroutes.SetRoutes(); Homerouter.SetRoutes(); Errorrouter.SetRoutes(); Standorterouter.SetRoutes(); @@ -247,6 +250,7 @@ app.use('/subscription', Addsubscriptionrouts.subscriptionrouter); app.use('/notizenkapitel', Notizenkapitelroutes.notizenkapitelrouter); app.use('/festlegungskategorie', Festlegungskategorieroutes.festlegungskategorierouter); app.use('/simontabellen', Simontabellenrouts.simontabellerouter); +app.use('/files', Filesroutes.filesrouter); // eventcallback diff --git a/src/routes/filesrouts.ts b/src/routes/filesrouts.ts new file mode 100644 index 0000000..5dd9af3 --- /dev/null +++ b/src/routes/filesrouts.ts @@ -0,0 +1,121 @@ +import {Request, Response, Router} from 'express'; +import {StandorteDBClass} from "../database/standortedbclass"; +import {DebugClass} from "../debug"; +import {AuthenticationClass} from "../middleware/authentication"; +import {FilesDBClass} from "../database/filesdbclass"; +import {ITeamsfilesstruktur} from "../datenstrukturen/teamsfilesstruktur_server"; +import {FILE} from "node:dns"; + +export class FilesrouterClass { + + public filesrouter: any; + private Debug: DebugClass; + private Database: FilesDBClass; + private Authentication: AuthenticationClass; + + constructor() { + + + this.Debug = new DebugClass(); + this.Database = new FilesDBClass(); + this.filesrouter = Router(); + this.Authentication = new AuthenticationClass(); + } + + public SetRoutes() { + + try { + + this.filesrouter.get('/', this.Authentication.authenticate, (req: Request, res: Response) => { + + let query= req.query; + let Projektkey = query.projektkey; + let Filetyp: string = query.filetype; + + this.Database.ReadFilesliste(Projektkey, Filetyp).then((liste: ITeamsfilesstruktur[]) => { + + res.status(200).send(liste); + + }).catch((error) => { + + res.status(400).send(error.message); + + }); + }); + + this.filesrouter.put('/', (req: Request, res: Response) => { + + // PUT ist für Update + + console.log('Standorte PUT'); + + const data = req.body; + let Delete: boolean = data.Delete; + let Teamsfile: ITeamsfilesstruktur = data.Teamsfile; + + console.log('Daten: ' + JSON.stringify(data)); + + if(Delete === false) { + + this.Database.UpdateFiles(Teamsfile).then((result) => { + + if(result !== null) { + + res.status(200).send({ message: 'Saved: ' + data.name, data: data }); + } + else { + + res.status(404).send({ message: 'Teamsfile not found.', data: null }); + } + + }).catch((error) => { + + res.status(400).send({ message: error.message }); + }); + } + else { + + // Teamsfile loeschen + + this.Database.RemoveTeamsfile(Teamsfile).then((result) => { + + if(result !== null) { + + res.status(200).send({ message: 'Teamsfile wurden gelöscht' }); + } + + }).catch((error) => { + + res.status(400).send({ message: error.message }); + }); + } + }); + + this.filesrouter.post('/', (req: Request, res: Response) => { + + // POST ist für neuen Eintrag + + console.log('Files POST'); + + const data = req.body; + + console.log('Daten: ' + JSON.stringify(data)); + + this.Database.AddFiles(data).then((result) => { + + res.status(200).send({ message: 'Added: ' + data.name, data: result._doc }); + + }).catch((error) => { + + res.status(400).send({ message: error.message }); + }); + }); + + } catch (error) { + + this.Debug.ShowErrorMessage(error.message, error, 'FilesrouterClass', 'SetRoutes'); + } + } +} + +