package dashboard type AntrianPerKategori struct { IdKategori int `db:"Kategori_operasi" json:"id_kategori"` Kategori string `db:"Kategori" json:"kategori"` JmlAntrian int `db:"jumlah_antrean" json:"jumlah_antrean"` } type AntrianPerSpesialisModel struct { IdSpesialis int `db:"id_spesialis"` Spesialis string `db:"Spesialis"` IdSubSpesialis int `db:"id_subspesialis"` SubSpesialis string `db:"Subspesialis"` JmlAntrian int `db:"jml_antrian"` } type AntrianPerSpesialisResponse struct { IdSpesialis int Spesialis string JmlAntrian int SubSpesialis []AntrianPerSubSpesialisResponse } type AntrianPerSubSpesialisResponse struct { IdSubSpesialis int SubSpesialis string JmlAntrian int } type ListModelAntrianPerSpesialis []AntrianPerSpesialisModel func (list ListModelAntrianPerSpesialis) ParseToResponse() []AntrianPerSpesialisResponse { resultMap := make(map[int]*AntrianPerSpesialisResponse) for _, item := range list { // check if spesialis already on resultMap // if not exist, create antrian spesialis response if _, ok := resultMap[item.IdSpesialis]; !ok { resultMap[item.IdSpesialis] = &AntrianPerSpesialisResponse{ IdSpesialis: item.IdSpesialis, Spesialis: item.Spesialis, JmlAntrian: 0, SubSpesialis: []AntrianPerSubSpesialisResponse{}, } } // add subspesialis item resultMap[item.IdSpesialis].SubSpesialis = append( resultMap[item.IdSpesialis].SubSpesialis, AntrianPerSubSpesialisResponse{ IdSubSpesialis: item.IdSubSpesialis, SubSpesialis: item.SubSpesialis, JmlAntrian: item.JmlAntrian, }, ) // accumulate jmlAntrian subspesialis -> total antrian spesialis resultMap[item.IdSpesialis].JmlAntrian += item.JmlAntrian } // convert map -> slice result := make([]AntrianPerSpesialisResponse, 0, len(resultMap)) for _, v := range resultMap { result = append(result, *v) } return result }