1
1
import { fetchAssemblies , fetchParties , fetchPoliticians , fetchPromises } from '$lib/datasheets' ;
2
- import { getAssemblyMembers } from '$lib/datasheets/assembly-member' ;
2
+ import { getAssemblyMembers , type AssemblyMember } from '$lib/datasheets/assembly-member' ;
3
+ import type { Assembly } from '$models/assembly' ;
3
4
import type { Party } from '$models/party' ;
4
5
import type { Politician } from '$models/politician' ;
5
6
import { PromiseStatus , type Promise , type PromiseSummary } from '$models/promise' ;
6
7
import { error } from '@sveltejs/kit' ;
7
- import type { Assembly } from 'carbon-icons-svelte' ;
8
8
import { groups } from 'd3' ;
9
9
import dayjs from 'dayjs' ;
10
10
11
11
const MAX_PROMISES_SAMPLE = 3 ;
12
12
13
13
export interface CabinetSummary extends Pick < Assembly , 'id' | 'startedAt' > {
14
- primeMinister : Pick < Politician , 'firstname' | 'lastname' > & { party ?: Party } ;
14
+ primeMinister : Pick < Politician , 'firstname' | 'lastname' | 'avatar' > & { party ?: Party } ;
15
15
cabinetMemberCount : number ;
16
16
cabinetMemberCountsByParty : { party : Party | 'ไม่สังกัดพรรค' ; count : number } [ ] ;
17
17
policyStatement : string ;
18
18
}
19
19
20
+ export interface PreviousCabinetSummary extends Pick < Assembly , 'id' | 'startedAt' > {
21
+ primeMinister : Pick < Politician , 'firstname' | 'lastname' > & { party ?: Party } ;
22
+ cabinetMemberCountsByParty : { party : Party | 'ไม่สังกัดพรรค' ; count : number } [ ] ;
23
+ endedAt : Date ;
24
+ }
25
+
20
26
export type PromiseSample = Pick < Promise , 'id' | 'statements' > ;
21
27
export type PromiseCountByStatus = {
22
28
[ PromiseStatus . inProgress ] : number ;
@@ -36,26 +42,23 @@ export interface PromisesByCategory {
36
42
count : number ;
37
43
}
38
44
39
- const CURRENT_CABINET_ASSEMBLY_ID = 'คณะรัฐมนตรี-64' ;
40
-
41
- export async function load ( ) {
42
- const cabinetAssembly = ( await fetchAssemblies ( ) ) . find (
43
- ( a ) => a . id === CURRENT_CABINET_ASSEMBLY_ID
44
- ) ;
45
- if ( ! cabinetAssembly ) {
46
- error ( 500 , `Cannot find the current cabinet: ${ CURRENT_CABINET_ASSEMBLY_ID } ` ) ;
45
+ function findPrimeMinister ( cabinetMembers : AssemblyMember [ ] ) {
46
+ const primeMinister = cabinetMembers . find ( ( m ) => m . assemblyRole ?. role === 'นายกรัฐมนตรี' ) ;
47
+ if ( ! primeMinister ) {
48
+ error ( 500 , `Cannot find the prime minister in the given cabinet` ) ;
47
49
}
50
+ return primeMinister ;
51
+ }
48
52
49
- const politicians = await fetchPoliticians ( ) ;
50
- const parties = await fetchParties ( ) ;
51
- const promises = await fetchPromises ( ) ;
52
-
53
- const cabinetMembers = getAssemblyMembers ( cabinetAssembly , politicians ) . filter (
53
+ function getCabinetMembers ( cabinetAssembly : Assembly , politicians : Politician [ ] ) {
54
+ return getAssemblyMembers ( cabinetAssembly , politicians ) . filter (
54
55
( { assemblyRole } ) =>
55
56
! assemblyRole ?. endedAt ||
56
57
( cabinetAssembly . endedAt && ! dayjs ( cabinetAssembly . endedAt ) . isAfter ( assemblyRole . endedAt ) )
57
58
) ;
59
+ }
58
60
61
+ function getCabinetMemberCountsByParty ( cabinetMembers : AssemblyMember [ ] , parties : Party [ ] ) {
59
62
const cabinetMemberCountsByPartyName = cabinetMembers
60
63
. map ( ( m ) => m . partyRole ?. party . name )
61
64
. reduce (
@@ -67,7 +70,7 @@ export async function load() {
67
70
{ } as { [ partyName : string ] : number }
68
71
) ;
69
72
70
- const cabinetMemberCountsByParty = Object . entries ( cabinetMemberCountsByPartyName ) . map (
73
+ return Object . entries ( cabinetMemberCountsByPartyName ) . map (
71
74
( [ name , count ] ) : { party : Party | 'ไม่สังกัดพรรค' ; count : number } => {
72
75
const party =
73
76
name === 'ไม่สังกัดพรรค' ? 'ไม่สังกัดพรรค' : parties . find ( ( p ) => p . name === name ) ;
@@ -76,16 +79,27 @@ export async function load() {
76
79
}
77
80
return {
78
81
party,
79
- count
82
+ count : count as number
80
83
} ;
81
84
}
82
85
) ;
86
+ }
83
87
84
- const primeMinister = cabinetMembers . find ( ( m ) => m . assemblyRole ?. role === 'นายกรัฐมนตรี' ) ;
88
+ export async function load ( ) {
89
+ const assemblies : Assembly [ ] = await fetchAssemblies ( ) ;
90
+ const politicians : Politician [ ] = await fetchPoliticians ( ) ;
91
+ const parties : Party [ ] = await fetchParties ( ) ;
92
+ const promises : Promise [ ] = await fetchPromises ( ) ;
85
93
86
- if ( ! primeMinister ) {
87
- error ( 500 , `Cannot find the current prime minister in the given cabinet` ) ;
88
- }
94
+ const currentAndPreviousAssembiles = assemblies
95
+ . filter ( ( assembly ) => assembly . name == 'คณะรัฐมนตรี' )
96
+ . sort ( ( a , b ) => b . term - a . term )
97
+ . slice ( 0 , 2 ) ;
98
+
99
+ const cabinetAssembly = currentAndPreviousAssembiles [ 0 ] ;
100
+ const cabinetMembers = getCabinetMembers ( cabinetAssembly , politicians ) ;
101
+ const cabinetMemberCountsByParty = getCabinetMemberCountsByParty ( cabinetMembers , parties ) ;
102
+ const primeMinister = findPrimeMinister ( cabinetMembers ) ;
89
103
90
104
const mockPolicyStatement =
91
105
'นางสาวแพทองธาร ชินวัตร นายกรัฐมนตรี ได้แถลงนโยบายต่อรัฐสภาเมื่อวันที่ 12 กันยายน 2567 โดยเน้นความท้าทายที่ประเทศไทยต้องเผชิญ เช่น การเติบโตทางเศรษฐกิจที่ต่ำกว่าศักยภาพ ปัญหาหนี้สิน ความเหลื่อมล้ำ และสิ่งแวดล้อม โดยรัฐบาลตั้งใจจะเปลี่ยนความท้าทายเหล่านี้ให้เป็นโอกาสและความเสมอภาคทางเศรษฐกิจและสังคม นโยบายเร่งด่วนของรัฐบาลประกอบด้วย 10 ข้อ อาทิ การปรับโครงสร้างหนี้ การกระตุ้นเศรษฐกิจผ่านดิจิทัลวอลเล็ต การลดราคาพลังงาน และการส่งเสริมการท่องเที่ยว รวมถึงแผนระยะยาวเพื่อพัฒนาเศรษฐกิจดิจิทัล ยานยนต์ไฟฟ้า และพลังงานสะอาด ' ;
@@ -96,13 +110,38 @@ export async function load() {
96
110
primeMinister : {
97
111
firstname : primeMinister . firstname ,
98
112
lastname : primeMinister . lastname ,
99
- party : primeMinister . partyRole ?. party
113
+ party : primeMinister . partyRole ?. party ,
114
+ avatar : primeMinister . avatar
100
115
} ,
101
116
cabinetMemberCount : cabinetMembers . length ,
102
117
cabinetMemberCountsByParty,
103
118
policyStatement : mockPolicyStatement
104
119
} ;
105
120
121
+ const previousCabinetAssembly = currentAndPreviousAssembiles [ 1 ] ;
122
+ const previousCabinetMembers = getCabinetMembers ( previousCabinetAssembly , politicians ) ;
123
+ const previousCabinetMemberCountsByParty = getCabinetMemberCountsByParty (
124
+ previousCabinetMembers ,
125
+ parties
126
+ ) ;
127
+ const previousPrimeMinister = findPrimeMinister ( previousCabinetMembers ) ;
128
+
129
+ if ( ! previousCabinetAssembly . endedAt ) {
130
+ error ( 500 , `Previous cabinet not have endedAt` ) ;
131
+ }
132
+
133
+ const previousCabinet : PreviousCabinetSummary = {
134
+ id : previousCabinetAssembly . id ,
135
+ startedAt : previousCabinetAssembly . startedAt ,
136
+ endedAt : previousCabinetAssembly . endedAt ,
137
+ primeMinister : {
138
+ firstname : previousPrimeMinister . firstname ,
139
+ lastname : previousPrimeMinister . lastname ,
140
+ party : previousPrimeMinister . partyRole ?. party
141
+ } ,
142
+ cabinetMemberCountsByParty : previousCabinetMemberCountsByParty
143
+ } ;
144
+
106
145
const byStatus : PromisesByStatus [ ] = groups ( promises , ( p ) => p . status ) . map (
107
146
( [ status , promisesByStatus ] ) => ( {
108
147
status,
@@ -146,6 +185,7 @@ export async function load() {
146
185
147
186
return {
148
187
cabinet,
188
+ previousCabinet,
149
189
byStatus,
150
190
byCategory,
151
191
activeCount : promises . filter ( ( { status } ) => status !== PromiseStatus . notStarted ) . length ,
0 commit comments