
WorkEnterprise platform at CMS Computers
Enterprise platform at CMS Computers
What I work on at my day job: a multi-tenant platform for incidents, maintenance and contracts, used by operations teams and the contractors who do the work.
- Role
- Java full stack developer
- Stack
- Spring Boot, Angular, PostgreSQL
- Status
- In production
- Years
- 2024 to now
- Features and fixes shipped
- 160+
- Faster API responses
- ~30%
- Database migrations
- 9+
- Products worked on
- 4
What the platform does
Faults reported, repairs tracked, contracts kept
Field teams report faults, supervisors assign and track them, and contracts decide who gets paid for the repair and what it costs if it runs late. Every customer sees only their own data.
Parts I built
Four of its biggest parts
Inventory, from scratch
Eight kinds of stock movement on a ledger that can only be added to, never edited, with locking so two people can't spend the same stock at once.
Billing and invoices
Invoices generated from finished work orders, itemised with tax, approved in stages and closed automatically once they're paid.
SLA penalties
Each contract has its own working hours and holidays. When a repair runs late the penalty is worked out automatically, and only the right people can waive it, on the record.
The main dashboard
Rebuilt as a drag-and-drop grid of eleven widgets each person can arrange, with live updates. The new version is under a third of the old code.
Making it fast
Faster, and finally consistent
Fewer, smarter queries
Removing N+1 queries, indexing the right columns and paginating cut API response times by about 30%.
Load less, not more
The incident heat map loaded about 100,000 rows per customer to draw 500. Moving the filter into the database fixed the speed, and made two widgets agree on their numbers for the first time.
Access control, done once
Access control, written once
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filter(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.cors(Customizer.withDefaults())
.sessionManagement(s -> s.sessionCreationPolicy(STATELESS))
.authorizeHttpRequests(a -> a
.requestMatchers("/api/auth/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated())
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
}Also at CMS
Two more products
A licence server for a health app (Spring Boot and Vue.js), and a portal for configuring energy meters (Spring Boot and Next.js) behind Keycloak single sign-on.
