1+ import { send } from "@/utils/errors" ;
2+ import { TextModel } from "@/models/text.model" ;
3+ import { UserModel } from "@/models/user.model" ;
4+
5+ const initialPhases = {
6+ 1 : {
7+ max : Number . MIN_VALUE ,
8+ min : Number . MAX_VALUE ,
9+ total : 0
10+ } ,
11+ 2 : {
12+ max : Number . MIN_VALUE ,
13+ min : Number . MAX_VALUE ,
14+ total : 0
15+ } ,
16+ 3 : {
17+ max : Number . MIN_VALUE ,
18+ min : Number . MAX_VALUE ,
19+ total : 0
20+ } ,
21+ 4 : {
22+ max : Number . MIN_VALUE ,
23+ min : Number . MAX_VALUE ,
24+ total : 0
25+ } ,
26+ 5 : {
27+ max : Number . MIN_VALUE ,
28+ min : Number . MAX_VALUE ,
29+ total : 0
30+ } ,
31+ 6 : {
32+ max : Number . MIN_VALUE ,
33+ min : Number . MAX_VALUE ,
34+ total : 0
35+ } ,
36+ 7 : {
37+ max : Number . MIN_VALUE ,
38+ min : Number . MAX_VALUE ,
39+ total : 0
40+ } ,
41+ 8 : {
42+ max : Number . MIN_VALUE ,
43+ min : Number . MAX_VALUE ,
44+ total : 0
45+ } ,
46+
47+ overall :{
48+ max : Number . MIN_VALUE ,
49+ min : Number . MAX_VALUE ,
50+ total : 0
51+ }
52+ }
53+
54+
55+ // Response with all texts with their genres.
56+ export const getTimeBenchmarks = ( request , response ) => {
57+ send ( response , async ( ) => {
58+ const texts = await TextModel . find ( ) . populate ( "genres" ) . populate ( "writer" ) ;
59+ const phases = { ...initialPhases } ;
60+ texts . forEach ( ( text ) => {
61+ let thisDate = new Date ( text . createdAt )
62+ for ( let i = 1 ; i < 9 ; i ++ ) {
63+ const nextDate = text . datesPerPhase [ i + 1 ] !== null ? new Date ( text . datesPerPhase [ i + 1 ] ) : null
64+ console . log ( nextDate )
65+ const timeInPhase = getHours ( thisDate , nextDate )
66+ phases [ i ] = {
67+ min : phases [ i ] . min > timeInPhase ? ( ( timeInPhase !== - 1 ) ? timeInPhase : phases [ i ] . min ) : phases [ i ] . min ,
68+ max : phases [ i ] . max < timeInPhase ? ( ( timeInPhase !== - 1 ) ? timeInPhase : phases [ i ] . max ) : phases [ i ] . max ,
69+ total : ( timeInPhase !== - 1 ) ? timeInPhase + phases [ i ] . total : phases [ i ] . total
70+ }
71+ thisDate = nextDate
72+ }
73+ const startDate = new Date ( text . createdAt )
74+ const endDate = text . datesPerPhase [ 9 ] !== null ? new Date ( text . datesPerPhase [ 9 ] ) : null
75+ const totalTime = getHours ( startDate , endDate )
76+ phases [ 'overall' ] = {
77+ min : phases [ 'overall' ] . min > totalTime ? ( ( totalTime !== - 1 ) ? totalTime : phases [ 'overall' ] . min ) : phases [ 'overall' ] . min ,
78+ max : phases [ 'overall' ] . max < totalTime ? ( ( totalTime !== - 1 ) ? totalTime : phases [ 'overall' ] . max ) : phases [ 'overall' ] . max ,
79+ total : ( totalTime !== - 1 ) ? totalTime + phases [ 'overall' ] . total : phases [ 'overall' ] . total
80+ }
81+ } )
82+ for ( let i = 1 ; i < 9 ; i ++ ) {
83+ phases [ i ] = {
84+ ...phases [ i ] ,
85+ avg : phases [ i ] . total / getLengthOfNotNull ( texts , i + 1 )
86+ }
87+ }
88+ phases [ 'overall' ] = {
89+ ...phases [ 'overall' ] ,
90+ avg : phases [ 'overall' ] . total / getLengthOfNotNull ( texts , 9 )
91+ }
92+
93+ console . log ( phases )
94+ return phases ;
95+ } ) ;
96+ } ;
97+
98+
99+ export const getTimeBenchmarksByWriter = ( request , response ) => {
100+ send ( response , async ( ) => {
101+ const texts = await TextModel . find ( ) . populate ( "genres" ) . populate ( "writer" ) ;
102+ const phasesByWriters = { } ;
103+ console . log ( initialPhases )
104+ texts . forEach ( ( text ) => {
105+ let thisDate = new Date ( text . createdAt )
106+ const writer = text . writer . pseudonym
107+ if ( ! phasesByWriters [ writer ] ) phasesByWriters [ writer ] = { ...initialPhases } ;
108+ for ( let i = 1 ; i < 9 ; i ++ ) {
109+ const nextDate = text . datesPerPhase [ i + 1 ] !== null ? new Date ( text . datesPerPhase [ i + 1 ] ) : null
110+ const timeInPhase = getHours ( thisDate , nextDate )
111+ phasesByWriters [ writer ] [ i ] = {
112+ min : ( phasesByWriters [ writer ] [ i ] . min > timeInPhase && timeInPhase !== - 1 ) ? timeInPhase : phasesByWriters [ writer ] [ i ] . min ,
113+ max : ( phasesByWriters [ writer ] [ i ] . max < timeInPhase && timeInPhase !== - 1 ) ? timeInPhase : phasesByWriters [ writer ] [ i ] . max ,
114+ total : ( timeInPhase !== - 1 ) ? timeInPhase + phasesByWriters [ writer ] [ i ] . total : phasesByWriters [ writer ] [ i ] . total
115+ }
116+ thisDate = nextDate
117+ }
118+ const startDate = new Date ( text . createdAt )
119+ const endDate = text . datesPerPhase [ 9 ] !== null ? new Date ( text . datesPerPhase [ 9 ] ) : null
120+ const totalTime = getHours ( startDate , endDate )
121+ phasesByWriters [ writer ] [ 'overall' ] = {
122+ min : ( phasesByWriters [ writer ] [ 'overall' ] . min > totalTime && totalTime !== - 1 ) ? totalTime : phasesByWriters [ writer ] [ 'overall' ] . min ,
123+ max : ( phasesByWriters [ writer ] [ 'overall' ] . max < totalTime && totalTime !== - 1 ) ? totalTime : phasesByWriters [ writer ] [ 'overall' ] . max ,
124+ total : ( totalTime !== - 1 ) ? totalTime + phasesByWriters [ writer ] [ 'overall' ] . total : phasesByWriters [ writer ] [ 'overall' ] . total
125+ }
126+ console . log ( phasesByWriters )
127+ } )
128+ Object . keys ( phasesByWriters ) . forEach ( ( key , index ) => {
129+ const writerPhase = phasesByWriters [ key ]
130+ const textsWriter = texts . map ( ( text ) => text . writer . pseudonym == key ? text : undefined )
131+ for ( let i = 1 ; i < 9 ; i ++ ) {
132+ writerPhase [ i ] = {
133+ ...writerPhase [ i ] ,
134+ avg : writerPhase [ i ] . total / getLengthOfNotNull ( textsWriter , i + 1 )
135+ }
136+ }
137+ writerPhase [ 'overall' ] = {
138+ ...writerPhase [ 'overall' ] ,
139+ avg : writerPhase [ 'overall' ] . total / getLengthOfNotNull ( textsWriter , 9 )
140+ }
141+ } )
142+ return phasesByWriters ;
143+ } ) ;
144+ } ;
145+
146+
147+ // Response with a particular text based on its id.
148+ export const getText = ( request , response ) => {
149+ send ( response , async ( ) => {
150+ const { id } = request . params ;
151+ const reader = await TextModel . find ( { _id :id } ) . populate ( "genres" ) ;
152+ return reader ;
153+ } ) ;
154+ } ;
155+
156+ const getHours = ( date1 , date2 ) => {
157+ if ( date1 !== null && date2 !== null ) {
158+ const milliseconds = Math . abs ( date2 - date1 ) ;
159+ return milliseconds / 36e5 ;
160+ }
161+ return - 1
162+ }
163+
164+ const getLengthOfNotNull = ( texts , phase ) => {
165+ let length = 0
166+ texts . forEach ( ( text ) => {
167+ if ( text && text . datesPerPhase [ phase ] !== null ) length ++
168+ } )
169+ return length
170+ }
0 commit comments